当前位置: 首页 > 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%)

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

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化

iOS 应用的发布流程一直是开发链路中最“苹果味”的环节&#xff1a;强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说&#xff0c;这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发&#xff08;例如 Flutter、React Na…...