当前位置: 首页 > news >正文

开源项目:数据库表结构生成文档工具

目录

一、软件介绍

二、技术框架

三、功能介绍

四、代码展示

1、获取数据库信息部分代码

2、导出Html文档代码

五、运行效果

六、项目开源地址


一、软件介绍

今天给大家分享我自己编写的数据库表结构文档生成工具,方便大家在实际开发当中,可以很方便导出业务系统的表结构,也可以作为项目验收文档中数据库设计文档使用。这样可以大大减少编写数据库表结构文档的时间,有需要的朋友欢迎下载或者沟通交流!

二、技术框架

  • 编程语言:C# ( Net Framework4.5.5)
  • 数据库技术框架:Dapper
  • 导出Word文档:NPOI
  • 访问方式:WinForm窗体应用程序,Windows操作系统可以直接运行

三、功能介绍

  • 支持SQLServer、MySQL(5.7、8.0)、SQLite 三种类型的数据,持续更新
  • 支持Word、Html、MarkDown 三种格式的导出
  • 导出内容包含数据表(字段详情、字段注释、长度、默认值等)、创建表脚本、视图及视图脚本、存储过程及脚本
  • 支持生成文档的同时直接打开文档
  • 支持数据库备份(目前只支持SQLServer导出bak备份文件)

四、代码展示

1、获取数据库信息部分代码

   /// <summary>/// 获取数据库字符串/// </summary>/// <param name="servername"></param>/// <param name="uid"></param>/// <param name="pwd"></param>/// <param name="db"></param>/// <returns></returns>public string GetConnectioning(string servername, string uid, string pwd, string db, string port){return string.Format("server={0};uid={1};pwd={2};database={3}", servername, uid, pwd, db);}/// <summary>/// 获取数据库列表/// </summary>/// <param name="conStr"></param>/// <returns></returns>public List<string> GetDBNameList(string conStr){//List<DBName> list =new List<DBName>();string sql = "select [name] from master.dbo.sysdatabases where DBId>6 Order By [Name] ";try{using (SqlConnection connection = new SqlConnection(conStr)){var list = connection.Query<string>(sql).ToList();return list;}}catch{return null;}}public List<DBModel> GetDBList(string conStr){//List<DBName> list =new List<DBName>();string sql = "select [name] from master.dbo.sysdatabases where DBId>6 Order By [Name] ";try{using (SqlConnection connection = new SqlConnection(conStr)){var list = connection.Query<DBModel>(sql).ToList();return list;}}catch{return null;}}/// <summary>/// 获取特定数据库的表名列表/// </summary>/// <param name="conStr"></param>/// <returns></returns>public List<TableModel> GetDBTableList(string conStr, string dbName = ""){var list = new List<TableModel>();//string sql = "SELECT TABLE_NAME as name FROM INFORMATION_SCHEMA.TABLES where TABLE_TYPE='BASE TABLE' ";string sql = "select a.name AS tableName,CONVERT(NVARCHAR(100),isnull(g.[value],'')) AS tableDesc from sys.tables a left join sys.extended_properties g on (a.object_id = g.major_id AND g.minor_id = 0)";try{using (SqlConnection connection = new SqlConnection(conStr)){list = connection.Query<TableModel>(sql).ToList();}}catch{}return list;}/// <summary>/// 获取特定数据库里面的存储过程/// </summary>/// <param name="conStr"></param>/// <param name="db"></param>/// <returns></returns>public List<ProcModel> GetProcList(string conStr, string dbName = ""){var list = new List<ProcModel>();string sql = @"  select name as procName, (select text from syscomments where id=OBJECT_ID(name)) as proDerailsfrom dbo.sysobjects  o  where OBJECTPROPERTY(id, N'IsProcedure') = 1 order by name  ";try{               using (SqlConnection connection = new SqlConnection(conStr)){list = connection.Query<ProcModel>(sql).ToList();}}catch{}return list;}/// <summary>/// 获取特定数据库里面的视图/// </summary>/// <param name="conStr"></param>/// <param name="db"></param>/// <returns></returns>public List<ViewModel> GetViewList(string conStr, string dbName = ""){var list = new List<ViewModel>();string sql = @"  select name as viewName, (select text from syscomments where id=OBJECT_ID(name)) as viewDerailsfrom dbo.sysobjects  o  where OBJECTPROPERTY(id, N'IsView') = 1 order by name  ";try{              using (SqlConnection connection = new SqlConnection(conStr)){list = connection.Query<ViewModel>(sql).ToList();}}catch{}return list;}/// <summary>/// 获取字段的信息/// </summary>/// <param name="tableName"></param>/// <param name="conStr"></param>/// <returns></returns>public List<TableDetail> GetTableDetail(string tableName, string conStr, string dbName = ""){var list = new List<TableDetail>();StringBuilder sb = new StringBuilder();sb.Append("SELECT [index] = a.colorder,    Title = a.name,    isMark =        CASE    WHEN COLUMNPROPERTY(a.id, a.name, 'IsIdentity') = 1 THEN '1' ELSE '0' END, ");sb.Append("isPK =  CASE   WHEN EXISTS(SELECT  1  FROM sysobjects WHERE xtype = 'PK' AND parent_obj = a.id AND name IN(SELECT name  FROM sysindexes WHERE indid IN(SELECT indid  FROM sysindexkeys  WHERE id = a.id AND colid = a.colid)) ) THEN '1' ELSE '0' END, ");sb.Append("	FieldType = b.name,fieldLenth = COLUMNPROPERTY(a.id, a.name, 'PRECISION'),isAllowEmpty =  CASE   WHEN a.isnullable = 1 THEN '1' ELSE '0' END, defaultValue = ISNULL(e.text, ''), fieldDesc = ISNULL(g.[value], '') ");sb.Append("FROM syscolumns a LEFT JOIN systypes b  ON a.xusertype = b.xusertype INNER JOIN sysobjects d ON a.id = d.id AND d.xtype = 'U' AND d.name <> 'dtproperties' LEFT JOIN syscomments e ON a.cdefault = e.id ");sb.Append("LEFT JOIN sys.extended_properties g ON a.id = G.major_id AND a.colid = g.minor_id LEFT JOIN sys.extended_properties f ON d.id = f.major_id AND f.minor_id = 0");//--如果只查询指定表,加上此红色where条件,tablename是要查询的表名;去除红色where条件查询说有的表信息sb.Append("WHERE d.name = '" + tableName + "' ORDER BY a.id, a.colorder, d.name");try{using (SqlConnection connection = new SqlConnection(conStr)){list = connection.Query<TableDetail>(sb.ToString()).ToList();}}catch{ }return list;}

2、导出Html文档代码

  /// <summary>/// 生成html文件/// </summary>/// <param name="list"></param>/// <param name="conStr"></param>/// <param name="db"></param>/// <param name="type"></param>public void CreateToHtml(List<TableModel> list, string conStr, string db, int type, List<string> checkList){StringBuilder sb = new StringBuilder();sb.Append("<html><meta charset=\"utf-8\" /><meta http-equiv = \"Content-Language\" content = \"zh-CN\" >");sb.Append("<head><title>数据库说明文档</title><body>");sb.Append("<style type=\"text/css\">\n");sb.Append("body { font-size: 9pt;}\n");sb.Append(".styledb { font-size: 14px; }\n");sb.Append(".styletab {font-size: 14px;padding-top: 15px; }\n</style></head><body>");sb.Append("<h1 style=\"text-align:center;\">" + db + "数据库说明文档</h1>");GetDBService(type);#region 创建一个表格if (checkList.Where(m => m.Equals("表")).Count() > 0){sb.Append("<h2>一、表结构</h2>");sb.Append("");sb.Append("");if (list.Count > 0){foreach (var item in list){if (item.tableDesc != null && item.tableDesc != ""){sb.Append("<h3>表名:" + item.tableName + "(" + item.tableDesc + ")</h3>");}else{sb.Append("<h3>表名:" + item.tableName + "</h3>");}sb.Append(" <table cellspacing=\"0\" cellpadding=\"5\" border=\"1\" width=\"100%\" bordercolorlight=\"#4F7FC9\" bordercolordark=\"#D3D8E0\">");sb.Append("<thead bgcolor=\"#E3EFFF\"> <th>序号</th><th>字段名称</th><th>标识</th><th>主键</th><th>字段类型</th><th>字段长度</th><th>允许空值</th><th>字段默认值</th><th>字段备注</th></thead>");sb.Append("<tbody>");//从第二行开始 因为第一行是表头int i = 1;var tabledetaillist = service.GetTableDetail(item.tableName, conStr, db);if (tabledetaillist != null && tabledetaillist.Count > 0){foreach (var itm in tabledetaillist){sb.Append("<tr>");sb.Append("<td>" + itm.index + "</td>");sb.Append("<td>" + itm.Title + "</td>");sb.Append("<td>" + itm.isMark + "</td>");sb.Append("<td>" + itm.isPK + "</td>");sb.Append("<td>" + itm.FieldType + "</td>");sb.Append("<td>" + itm.fieldLenth + "</td>");sb.Append("<td>" + itm.isAllowEmpty + "</td>");sb.Append("<td>" + itm.defaultValue + "</td>");sb.Append("<td>" + itm.fieldDesc + "</td>");sb.Append("</tr>");i++;}}sb.Append("</tbody></table>");sb.Append("<h4>" + item.tableName + "建表脚本</h4><br/>");sb.Append("<span>" + service.GetTableSQL(item.tableName, conStr) + "</span>");}}}#endregion#region 存储过程if (checkList.Where(m => m.Equals("存储过程")).Count() > 0){List<ProcModel> proclist = new List<ProcModel>();proclist = service.GetProcList(conStr, db);sb.Append("<h2>二、存储过程</h2>");if (proclist != null && proclist.Count > 0){foreach (var item in proclist){sb.Append("<h3>存储过程名称:" + item.procName + "</h3>");sb.Append("<span>" + item.proDerails + "</span>");}}}#endregion#region 视图if (checkList.Where(m => m.Equals("视图")).Count() > 0){List<ViewModel> viewlist = new List<ViewModel>();viewlist = service.GetViewList(conStr, db);sb.Append("<h2>三、视图</h2>");if (viewlist.Count > 0){foreach (var item in viewlist){sb.Append("<h3>视图名称:" + item.viewName + "</h3>");sb.Append("<span>" + item.viewDerails + "</span>");}}}#endregionsb.Append("</body></html>");sb.ToString();string filename = db + "-数据库说明文档";//文件名SaveFileDialog saveDialog = new SaveFileDialog();saveDialog.DefaultExt = "html";saveDialog.Filter = "html文件|*.html";saveDialog.FileName = filename;saveDialog.ShowDialog();filename = saveDialog.FileName;if (filename.IndexOf(":") < 0) return; //被点了取消         StreamWriter sw1 = new StreamWriter(saveDialog.FileName, false);sw1.WriteLine(sb);sw1.Close();System.Diagnostics.Process.Start(filename);}

五、运行效果

应用程序主界面

支持三种生成文档类型:每次只能选择一种,推荐使用markdown格式

Word文档生成效果

Html文档生成效果

MarkDown文档效果

针对SQLServer数据库备份

​​​​​​​六、项目开源地址

GitHub:https://github.com/hgmsq/SqlToDocTool

Gitee:https://gitee.com/hgm1989/SqlToDocTool

Gitcode:https://gitcode.net/xishining/SqlToDocTool

相关文章:

开源项目:数据库表结构生成文档工具

目录 一、软件介绍 二、技术框架 三、功能介绍 四、代码展示 1、获取数据库信息部分代码 2、导出Html文档代码 五、运行效果 六、项目开源地址 一、软件介绍 今天给大家分享我自己编写的数据库表结构文档生成工具&#xff0c;方便大家在实际开发当中&#xff0c;可以很方便导出…...

spring的两种拦截器HandlerIntercepter和MethodIntercepter

介绍 Spring有两种拦截器提供给我们使用&#xff0c;一种是HandlerIntercepter&#xff0c;另一种是MethodIntercepter。这两种的来源不同&#xff0c;实现方式也不同&#xff0c;具体的下面来看一下。 HandlerIntercepter 来源 来源于spring-webmvc包 HandlerIntercepter拦…...

初级算法-字符串

主要记录算法和数据结构学习笔记&#xff0c;新的一年更上一层楼&#xff01; 初级算法-字符串一、反转字符串二、反转字符串&#xff08;二&#xff09;三、替换空格四、翻转字符串里的单词五、左旋转字符串六、实现 strStr()七、重复的子字符串字符串中元素只能是字符String…...

华为OD机试题 - 寻找目标字符串(JavaScript)| 机考必刷

更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为…...

删除Terminating状态的namespace:cattle-system

这里以cattle-system为例&#xff01;执行删除命令后namespace&#xff08;也是用其他k8s object&#xff09;仍然存在&#xff0c;首先执行 kubectl edit namespace cattle-system 查看是否存在spec.finalizers: kubernetes&#xff0c;如&#xff1a; spec: finalizers:…...

MiniOB 并发B+树实现解析

MiniOB 是 OceanBase 联合华中科技大学推出的一款用于教学的小型数据库系统&#xff0c;希望能够帮助数据库爱好者系统性的学习数据库原理与实战。 B 树介绍 B 树是传统数据库中常见的索引数据结构&#xff0c;比如MySQL、PostgreSQL都实现了B树索引。B 树是一个平衡多叉树&am…...

SpringCloud负载均衡服务调用——Ribbon

Ribbon 本专栏学习内容来自尚硅谷周阳老师的视频 有兴趣的小伙伴可以点击视频地址观看 简介 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。 简单的说&#xff0c;Ribbon是Netflix发布的开源项目&#xff0c;主要功能是提供客户端的软件负载均衡算…...

各种邮箱服务软件对比

1.宝塔邮局管理器 特点:简单易用,可视化操作,小白也能搞,还有备份功能,一般足够用了 缺点:稳定性真是差,隔三差五的不能收发.没有接口,不能任意修改邮箱密码,只能管理员修改 注意要点:一定要开启ssl,否则有些邮箱给你发邮件你收不到 建议:不要入坑.坏了之后没法修复,哭都没地方…...

相机单独标定的实现过程[autoware标定]、tmp文件的查看方式

安装了autoware1.13和calibration标定包&#xff0c;发现实现相机单独标定的过程较为坎坷&#xff0c;参考了一些博主的方法&#xff0c;发现下面的过程更加适合自己&#xff0c;做个笔记。 1安装标定箱&#xff08;与calibration标定包的安装并不冲突&#xff09; 标定工具箱…...

4.10.1、IP 多播技术的相关基本概念

多播&#xff08;Multicast&#xff0c;也称为组播&#xff09;是一种实现 “一对多” 通信的技术&#xff0c;与传统单播“一对一”通信相比&#xff0c;多播可以极大地节省网络资源。 在因特网上进行的多播&#xff0c;称为 IP 多播。 1、单播 & 多播 如下所示&#xf…...

PIGOSS BSM监控国产数据库Oscar

前言神通数据库(原OSCAR数据库&#xff09;是天津神舟通用数据技术有限公司&#xff08;简称“神舟通用公司”&#xff09;拥有自主知识产权的企业级、大型通用关系型数据库管理系统。PIGOSS BSM作为网利友联科技完全自主研发的纯国产基础 IT 架构运行状态监测平台软件&#xf…...

Spring Boot中文件上传

Spring Boot中文件上传 前言 本篇主要参考Spring官方文档&#xff0c;整理了Spring Boot中文件上传如何实现&#xff0c;以及在代码中使用RestTemplate和HttpClient两种方式实现文件上传。 创建Spring Boot项目 首先创建一个Spring Boot Web项目&#xff0c;使用的Spring B…...

Github上传大文件(>25MB)教程

Github上传大文件&#xff08;>25MB&#xff09;教程Github上传大文件&#xff08;>25MB&#xff09;教程安装git安装Git Large File Storage实例踩坑点1&#xff1a;failed to push some refs to踩坑点2&#xff1a;main与master踩坑点3&#xff1a;Failed to connect t…...

面试官:mysql索引会缓存内存吗?

文章目录 InnoDB缓冲池如何设置方法一:使用 `innodb_buffer_pool_size` 变量方法二:修改my.ini配置文件InnoDB缓冲池 InnoDB存储引擎是基于磁盘存储表文件和索引的,并将数据按页的方式管理,由于访问磁盘的速度较慢,多次访问磁盘会造成数据库性能的下降,为此,InnoDB在内…...

bs4解析数据和csv文件

\b 检测所在的位置是否是单词边界&#xff08;任何可以将不同的单词进行区分的符号&#xff1a;空白符号&#xff0c;标点符号&#xff0c;字符串开头&#xff0c;字符串结尾&#xff09; ^ 检测是否是字符串开头 $ 检测是否是字符串结尾 csv保存数据 什么是csv文件 读操作…...

Linux中Buffer和Cache的区别

Linux中Buffer和Cache的区别 free命令中会有一项buff/cache, 通过man free可以看到这里的关于buff/cache的介绍 buff/cache包含两部分 buffers:内核缓存区用到的内存&#xff0c;对应/proc/meminfo中Buffers的值 cache:内核页缓存和Slab用到的内存&#xff0c;对应/proc/mem…...

Docker 镜像使用

目录 1、列出镜像列表 2、获取一个新的镜像 3、查找镜像 4、拖取镜像 5、删除镜像 6、创建镜像 a.更新镜像 b.构建镜像 设置镜像标签 当运行容器时&#xff0c;使用的镜像如果在本地中不存在&#xff0c;docker 就会自动从 docker 镜像仓库中下载&#xff0c;默认是从 …...

Java阶段一Day10

Java阶段一Day10 文章目录Java阶段一Day10抽象类和抽象方法接口案例小练习引用类型数组教师总结回顾&#xff1a;精华笔记&#xff1a;笔记&#xff1a;补充&#xff1a;抽象类和抽象方法 关键字&#xff1a;abstract 只有方法的定义&#xff0c;没有具体的实现&#xff08;连…...

触摸屏与PLC之间如何快速实现无线PPI通信?

PPI协议是西门子为S7-200专门开发的通信协议&#xff0c;是不开放的协议&#xff0c;CPU自带的两个通信口&#xff08;Port0&#xff0c;Port1&#xff09;均支持该协议&#xff0c;S7-200的一些通信模块也支持PPI协议。编程软件Micro/WIN与CPU进行编程通信也使用PPI协议&#…...

【华为OD机试 2023最新 】 羊、狼、农夫过河(C++ 100%)

题目描述 羊、狼、农夫都在岸边,当羊的数量小于狼的数量时,狼会攻击羊,农夫则会损失羊。农夫有一艘容量固定的船,能够承载固定数量的动物。 要求求出不损失羊情况下将全部羊和狼运到对岸需要的最小次数。 只计算农夫去对岸的次数,回程时农夫不会运送羊和狼。 备注:农…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...