原创SQlServer数据库生成简单的说明文档包含(存储过程、视图、数据库批量备份)小工具(附源码)
这是一款简单的数据库文档生成工具,主要实现了SQlServer生成说明文档的小工具,目前不够完善,主要可以把数据库的表以及表的详细字段信息,导出到
Word中,可以方便开发人员了解数据库的信息或写技术说明文档。
技术上主要采用的 C#+Dapper+Npod ,开发工具为Vs2015,基于Net4.5框架。
操作Word代码
- public void CreateToWord(List<string> list,string conStr,string db)
- {
- XWPFDocument doc = new XWPFDocument(); //创建新的word文档
- XWPFParagraph p1 = doc.CreateParagraph(); //向新文档中添加段落
- p1.Alignment = ParagraphAlignment.CENTER;
- XWPFRun r1 = p1.CreateRun();
- r1.FontFamily = "微软雅黑";
- r1.FontSize = ;
- r1.IsBold = true;
- //向该段落中添加文字
- r1.SetText(db+"数据库说明文档");
- //XWPFParagraph p2 = doc.CreateParagraph();
- //XWPFRun r2 = p2.CreateRun();
- //r2.SetText("测试段落二");
- #region 创建一个表格
- if (list.Count > )
- {
- foreach (var item in list)
- {
- XWPFParagraph p3 = doc.CreateParagraph(); //向新文档中添加段落
- p3.Alignment = ParagraphAlignment.LEFT;
- XWPFRun r3 = p3.CreateRun(); //向该段落中添加文字
- r3.FontFamily = "微软雅黑";
- r3.FontSize = ;
- r3.IsBold = true;
- r3.SetText("表名:"+item);
- //从第二行开始 因为第一行是表头
- int i = ;
- var tabledetaillist = service.GetTableDetail(item, conStr);
- XWPFTable table = doc.CreateTable(tabledetaillist.Count + , );
- table.Width = ;
- #region 设置表头
- //table.GetRow(0).GetCell(0).SetText("数据库名称");
- XWPFParagraph pI = table.GetRow().GetCell().AddParagraph();
- XWPFRun rI = pI.CreateRun();
- rI.FontFamily = "微软雅黑";
- rI.FontSize = ;
- rI.IsBold = true;
- rI.SetText("序号");
- XWPFParagraph pI1 = table.GetRow().GetCell().AddParagraph();
- XWPFRun rI1 = pI1.CreateRun();
- rI1.FontFamily = "微软雅黑";
- rI1.FontSize = ;
- rI1.IsBold = true;
- rI1.SetText("字段名称");
- XWPFParagraph pI2 = table.GetRow().GetCell().AddParagraph();
- XWPFRun rI2 = pI2.CreateRun();
- rI2.FontFamily = "微软雅黑";
- rI2.FontSize = ;
- rI2.IsBold = true;
- rI2.SetText("标识");
- XWPFParagraph pI3 = table.GetRow().GetCell().AddParagraph();
- XWPFRun rI3 = pI3.CreateRun();
- rI3.FontFamily = "微软雅黑";
- rI3.FontSize = ;
- rI3.IsBold = true;
- rI3.SetText("主键");
- XWPFParagraph pI4 = table.GetRow().GetCell().AddParagraph();
- XWPFRun rI4 = pI4.CreateRun();
- rI4.FontFamily = "微软雅黑";
- rI4.FontSize = ;
- rI4.IsBold = true;
- rI4.SetText("字段类型");
- XWPFParagraph pI5 = table.GetRow().GetCell().AddParagraph();
- XWPFRun rI5 = pI5.CreateRun();
- rI5.FontFamily = "微软雅黑";
- rI5.FontSize = ;
- rI5.IsBold = true;
- rI5.SetText("字段长度");
- XWPFParagraph pI6 = table.GetRow().GetCell().AddParagraph();
- XWPFRun rI6 = pI6.CreateRun();
- rI6.FontFamily = "微软雅黑";
- rI6.FontSize = ;
- rI6.IsBold = true;
- rI6.SetText("允许空");
- XWPFParagraph pI7 = table.GetRow().GetCell().AddParagraph();
- XWPFRun rI7 = pI7.CreateRun();
- rI7.FontFamily = "微软雅黑";
- rI7.FontSize = ;
- rI7.IsBold = true;
- rI7.SetText("字段默认值");
- XWPFParagraph pI8 = table.GetRow().GetCell().AddParagraph();
- XWPFRun rI8 = pI8.CreateRun();
- rI8.FontFamily = "微软雅黑";
- rI8.FontSize = ;
- rI8.IsBold = true;
- rI8.SetText("字段说明");
- #endregion
- if (tabledetaillist != null && tabledetaillist.Count > )
- {
- foreach (var itm in tabledetaillist)
- {
- //第一列
- XWPFParagraph pIO = table.GetRow(i).GetCell().AddParagraph();
- XWPFRun rIO = pIO.CreateRun();
- //rIO.FontFamily = "微软雅黑";
- rIO.FontSize = ;
- rIO.IsBold = true;
- rIO.SetText(itm.index.ToString());
- //第二列
- XWPFParagraph pIO2 = table.GetRow(i).GetCell().AddParagraph();
- XWPFRun rIO2 = pIO2.CreateRun();
- //rIO2.FontFamily = "微软雅黑";
- rIO2.FontSize = ;
- rIO2.IsBold = true;
- rIO2.SetText(itm.Title);
- XWPFParagraph pIO3 = table.GetRow(i).GetCell().AddParagraph();
- XWPFRun rIO3 = pIO3.CreateRun();
- //rIO3.FontFamily = "微软雅黑";
- rIO3.FontSize = ;
- rIO3.IsBold = true;
- rIO3.SetText(itm.isMark.ToString());
- XWPFParagraph pIO4 = table.GetRow(i).GetCell().AddParagraph();
- XWPFRun rIO4 = pIO4.CreateRun();
- //rIO4.FontFamily = "微软雅黑";
- rIO4.FontSize = ;
- rIO4.IsBold = true;
- rIO4.SetText(itm.isPK.ToString());
- XWPFParagraph pIO5 = table.GetRow(i).GetCell().AddParagraph();
- XWPFRun rIO5 = pIO5.CreateRun();
- //rIO5.FontFamily = "微软雅黑";
- rIO5.FontSize = ;
- rIO5.IsBold = true;
- rIO5.SetText(itm.FieldType);
- XWPFParagraph pIO6 = table.GetRow(i).GetCell().AddParagraph();
- XWPFRun rIO6 = pIO6.CreateRun();
- //rIO6.FontFamily = "微软雅黑";
- rIO6.FontSize = ;
- rIO6.IsBold = true;
- rIO6.SetText(itm.fieldLenth.ToString());
- XWPFParagraph pIO7 = table.GetRow(i).GetCell().AddParagraph();
- XWPFRun rIO7 = pIO7.CreateRun();
- //rIO7.FontFamily = "微软雅黑";
- rIO7.FontSize = ;
- rIO7.IsBold = true;
- rIO7.SetText(itm.isAllowEmpty.ToString());
- XWPFParagraph pIO8 = table.GetRow(i).GetCell().AddParagraph();
- XWPFRun rIO8 = pIO8.CreateRun();
- //rIO8.FontFamily = "微软雅黑";
- rIO8.FontSize = ;
- rIO8.IsBold = true;
- rIO8.SetText(itm.defaultValue.ToString());
- XWPFParagraph pIO9 = table.GetRow(i).GetCell().AddParagraph();
- XWPFRun rIO9 = pIO9.CreateRun();
- //rIO9.FontFamily = "微软雅黑";
- rIO9.FontSize = ;
- rIO9.IsBold = true;
- rIO9.SetText(itm.fieldDesc);
- i++;
- }
- }
- }
- }
- #endregion
- #region 存储过程
- XWPFParagraph p2 = doc.CreateParagraph();
- XWPFRun r2 = p2.CreateRun();
- r2.FontSize = ;
- r2.SetText("存储过程");
- List<ProcModel> proclist = new List<ProcModel>();
- proclist = service.GetProcList(conStr);
- if(proclist.Count>)
- {
- foreach(var item in proclist)
- {
- //存储过程名称
- XWPFParagraph pro1 = doc.CreateParagraph();
- XWPFRun rpro1 = pro1.CreateRun();
- rpro1.FontSize = ;
- rpro1.IsBold = true;
- rpro1.SetText("存储过程名称:"+item.procName);
- //存储过程 详情
- XWPFParagraph pro2 = doc.CreateParagraph();
- XWPFRun rpro2 = pro2.CreateRun();
- rpro2.FontSize = ;
- rpro2.SetText(item.proDerails);
- }
- }
- #endregion
- #region 试图
- XWPFParagraph v2 = doc.CreateParagraph();
- XWPFRun vr2 = v2.CreateRun();
- vr2.FontSize = ;
- vr2.SetText("视图");
- List<ViewModel> viewlist = new List<ViewModel>();
- viewlist = service.GetViewList(conStr);
- if (proclist.Count > )
- {
- foreach (var item in viewlist)
- {
- //存储过程名称
- XWPFParagraph vro1 = doc.CreateParagraph();
- XWPFRun vpro1 = vro1.CreateRun();
- vpro1.FontSize = ;
- vpro1.IsBold = true;
- vpro1.SetText("视图名称:" + item.viewName);
- //存储过程 详情
- XWPFParagraph vro2 = doc.CreateParagraph();
- XWPFRun vpro2 = vro2.CreateRun();
- vpro2.FontSize = ;
- vpro2.SetText(item.viewDerails);
- }
- }
- #endregion
- FileStream sw = File.Create("../../Doc/db.docx"); //...
- doc.Write(sw); //...
- sw.Close(); //在服务端生成文件
- FileInfo file = new FileInfo("../../Doc/db.docx");//文件保存路径及名称
- }
操作Word
- /// <summary>
- /// 测试连接数据库是否成功
- /// </summary>
- /// <returns></returns>
- public bool ConnectionTest(string conStr)
- {
- //创建连接对象
- mySqlConnection = new SqlConnection(conStr);
- try
- {
- //Open DataBase
- //打开数据库
- mySqlConnection.Open();
- IsCanConnectioned = true;
- }
- catch
- {
- //Can not Open DataBase
- //打开不成功 则连接不成功
- IsCanConnectioned = false;
- }
- finally
- {
- //Close DataBase
- //关闭数据库连接
- mySqlConnection.Close();
- }
- //mySqlConnection is a SqlConnection object
- if (mySqlConnection.State == ConnectionState.Closed || mySqlConnection.State == ConnectionState.Broken)
- {
- //Connection is not available
- return IsCanConnectioned;
- }
- else
- {
- //Connection is available
- return IsCanConnectioned;
- }
- }
测试服务器是否连接成功
- /// <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;
- }
- }
获取数据库列表
- /// <summary>
- /// 获取字段的信息
- /// </summary>
- /// <param name="tableName"></param>
- /// <param name="conStr"></param>
- /// <returns></returns>
- public List<TableDetail> GetTableDetail(string tableName, string conStr)
- {
- 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;
- }
获取表字段详情
- /// <summary>
- /// 获取特定数据库里面的存储过程
- /// </summary>
- /// <param name="conStr"></param>
- /// <param name="db"></param>
- /// <returns></returns>
- public List<ProcModel> GetProcList(string conStr)
- {
- var list = new List<ProcModel>();
- string sql = @" select name as procName, (select text from syscomments where id=OBJECT_ID(name)) as proDerails
- from dbo.sysobjects o where OBJECTPROPERTY(id, N'IsProcedure') = 1 order by name ";
- try
- {
- // http://www.cnblogs.com/minideas/archive/2009/10/29/1591891.html
- using (SqlConnection connection = new SqlConnection(conStr))
- {
- list = connection.Query<ProcModel>(sql).ToList();
- }
- }
- catch
- {
- }
- return list;
- }
获取特定数据库里面的存储过程
实现思路:
1、首先获取数据库的字符串,测试链接是否成功,
2、通过脚本获取该服务器的数据库列表。
3、根据数据库找到该数据库的所有数据表
4、通过脚本找到该数据表所有的字段信息
5、使用Npoi技术把信息导出到Word中去。
效果如下:
文档效果
目前功能比较简单,后续会慢慢完善,当然自己技术有限,欢迎高手多多指点!
Github地址:https://github.com/hgmsq/SqlToDocTool
原创SQlServer数据库生成简单的说明文档包含(存储过程、视图、数据库批量备份)小工具(附源码)的更多相关文章
- 原创SQlServer数据库生成简单的说明文档小工具(附源码)
这是一款简单的数据库文档生成工具,主要实现了SQlServer生成说明文档的小工具,目前不够完善,主要可以把数据库的表以及表的详细字段信息,导出到 Word中,可以方便开发人员了解数据库的信息或写技术 ...
- 利用js编写一个简单的html表单验证,验证通过时提交数据(附源码)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...
- (原创)通用查询实现方案(可用于DDD)[附源码] -- 简介
[声明] 写作不易,转载请注明出处(http://www.cnblogs.com/wiseant/p/3985353.html). [系列文章] 通用查询实现方案(可用于DDD)[附源码] -- ...
- 原创:用python把链接指向的网页直接生成图片的http服务及网站(含源码及思想)
原创:用python把链接指向的网页直接生成图片的http服务及网站(含源码及思想) 总体思想: 希望让调用方通过 http调用传入一个需要生成图片的网页链接生成一个网页的图片并返回图片链接 ...
- H5类似易企秀/编辑器/页面制作/开发/生成工具/软件/源码/授权
代码地址如下:http://www.demodashi.com/demo/14960.html 项目简介 H5DS (HTML5 Design software) 这是一款基于WEB的 H5制作工具. ...
- (原创)通用查询实现方案(可用于DDD)[附源码] -- 设计思路
[声明] 写作不易,转载请注明出处(http://www.cnblogs.com/wiseant/p/3988592.html). [系列文章] 通用查询实现方案(可用于DDD)[附源码] -- ...
- 极限挑战—C#100万条数据导入SQL SERVER数据库仅用4秒 (附源码)
原文:极限挑战-C#100万条数据导入SQL SERVER数据库仅用4秒 (附源码) 实际工作中有时候需要把大量数据导入数据库,然后用于各种程序计算,本实验将使用5中方法完成这个过程,并详细记录各种方 ...
- 开源方案搭建可离线的精美矢量切片地图服务-8.mapbox 之sprite大图图标文件生成(附源码)
项目成果展示(所有项目文件都在阿里云的共享云虚拟主机上,访问地图可以会有点慢,请多多包涵). 01:中国地图:http://test.sharegis.cn/mapbox/html/3china.ht ...
- PHP简单的长文章分页教程 附源码
PHP简单的长文章分页教程 附源码.本文将content.txt里的内容分割成3页,这样浏览起来用户体验很好. 根据分页参数ipage,获取对应文章内容 include('page.class.php ...
随机推荐
- redis启动出现错误creating server tcp listening socket 127.0.0.1:6379: bind No error
creating server tcp listening socket 127.0.0.1:6379: bind No error 的解决方案如下按顺序输入如下命令就可以连接成功 1. redis- ...
- Spark Programming--- Shuffle operations
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- Javascript高级编程学习笔记(45)——DOM 操作表格及DOM动态集合
操作DOM表格 早些时候,HTML 还是以表格布局为主, 所以DOM操作表格是比较重要的一点 但是现如今 有其它的选择,所以表格的操作也就慢慢地淡出了人们的视线 所以这里也就不过多去详细展开,这里也就 ...
- IDEA一定要懂的32条快捷键
阅读本文大概需要 2 分钟. 作者:帝都羊 这些IntelliJ IDEA键盘快捷键可以让你专注于编写代码,让你的双手在键盘上起舞. 1.搜索文件名: ↑ Shift 快速连续按两下 2.显示 ...
- Day2:html和css
Day2:html和css 表格是一种常用的标签,表格结构,做到能够合并单元格. 表格的属性: 属性名 说明 border 设置表格的边框 cellspacing 设置单元格与单元格边框之间的空白间距 ...
- Kali学习笔记18:OpenVAS使用
上一篇讲了什么是OpenVAS以及如何安装: https://www.cnblogs.com/xuyiqing/p/9690373.html 接下来就是使用: 我先打开一台Metasploitable ...
- OAuth2简易实战(二)-模拟客户端调用
1. OAuth2简易实战(二) 1.1. 目标 模拟客户端获取第三方授权,并调用第三方接口 1.2. 代码 1.2.1. 核心流程 逻辑就是从数据库读取用户信息,封装成UserDetails对象,该 ...
- Java 程序员必备的 15 个框架,前 3 个地位无可动摇!
Java 程序员方向太多,且不说移动开发.大数据.区块链.人工智能这些,大部分 Java 程序员都是 Java Web/后端开发.那作为一名 Java Web 开发程序员必须需要熟悉哪些框架呢? 今天 ...
- NetStandard;.netCore;FX(.netFrameWork)之间引用关系
.NetStandard;.netCore;FX(.NetFrameWork)之间引用关系 FX引用.NetCore:不通过 NetStandard引用.NetCore:不通过 .NetCor ...
- 使用一年ESB感受
ESB(Enterprise service bus)-----企业服务总线的简写. 目前使用的是openESB,Sun公司的开源社区提供的,集成在netbean中,使用glassFish服务器. 先 ...