原創SQlServer數據庫生成簡單的說明文檔包含(存儲過程、視圖、數據庫批量備份)小工具(附源碼)

這是一款簡單的數據庫文檔生成工具,主要實現了SQlServer生成說明文檔的小工具,目前不夠完善,主要能夠把數據庫的表以及表的詳細字段信息,導出到html

Word中,能夠方便開發人員瞭解數據庫的信息或寫技術說明文檔。git

技術上主要採用的 C#+Dapper+Npod ,開發工具爲Vs2015,基於Net4.5框架。github

操做Word代碼sql

NPoi
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 = 22;
            r1.IsBold = true;            
            //向該段落中添加文字
            r1.SetText(db+"數據庫說明文檔");

            //XWPFParagraph p2 = doc.CreateParagraph();  
            //XWPFRun r2 = p2.CreateRun();
            //r2.SetText("測試段落二");
            
            #region 建立一個表格
            if (list.Count > 0)
            {


                

  
                foreach (var item in list)
                {

                    XWPFParagraph p3 = doc.CreateParagraph();   //向新文檔中添加段落
                    p3.Alignment = ParagraphAlignment.LEFT;
                    XWPFRun r3 = p3.CreateRun();                //向該段落中添加文字
                    r3.FontFamily = "微軟雅黑";
                    r3.FontSize = 18;
                    r3.IsBold = true;
                    r3.SetText("表名:"+item);

                    //從第二行開始 由於第一行是表頭
                    int i = 1;
                    var tabledetaillist = service.GetTableDetail(item, conStr);
                    XWPFTable table = doc.CreateTable(tabledetaillist.Count + 1, 9);
                    table.Width = 5000;

                    #region 設置表頭               

                    //table.GetRow(0).GetCell(0).SetText("數據庫名稱");
                    XWPFParagraph pI = table.GetRow(0).GetCell(0).AddParagraph();
                    XWPFRun rI = pI.CreateRun();
                    rI.FontFamily = "微軟雅黑";
                    rI.FontSize = 12;
                    rI.IsBold = true;
                    rI.SetText("序號");

                
                    XWPFParagraph pI1 = table.GetRow(0).GetCell(1).AddParagraph();
                    XWPFRun rI1 = pI1.CreateRun();
                    rI1.FontFamily = "微軟雅黑";
                    rI1.FontSize = 12;
                    rI1.IsBold = true;
                    rI1.SetText("字段名稱");

                    XWPFParagraph pI2 = table.GetRow(0).GetCell(2).AddParagraph();
                    XWPFRun rI2 = pI2.CreateRun();
                    rI2.FontFamily = "微軟雅黑";
                    rI2.FontSize = 12;
                    rI2.IsBold = true;
                    rI2.SetText("標識");

                    XWPFParagraph pI3 = table.GetRow(0).GetCell(3).AddParagraph();
                    XWPFRun rI3 = pI3.CreateRun();
                    rI3.FontFamily = "微軟雅黑";
                    rI3.FontSize = 12;
                    rI3.IsBold = true;
                    rI3.SetText("主鍵");

                    XWPFParagraph pI4 = table.GetRow(0).GetCell(4).AddParagraph();
                    XWPFRun rI4 = pI4.CreateRun();
                    rI4.FontFamily = "微軟雅黑";
                    rI4.FontSize = 12;
                    rI4.IsBold = true;
                    rI4.SetText("字段類型");

                    XWPFParagraph pI5 = table.GetRow(0).GetCell(5).AddParagraph();
                    XWPFRun rI5 = pI5.CreateRun();
                    rI5.FontFamily = "微軟雅黑";
                    rI5.FontSize = 12;
                    rI5.IsBold = true;
                    rI5.SetText("字段長度");

                    XWPFParagraph pI6 = table.GetRow(0).GetCell(6).AddParagraph();
                    XWPFRun rI6 = pI6.CreateRun();
                    rI6.FontFamily = "微軟雅黑";
                    rI6.FontSize = 12;
                    rI6.IsBold = true;
                    rI6.SetText("容許空");


                    XWPFParagraph pI7 = table.GetRow(0).GetCell(7).AddParagraph();
                    XWPFRun rI7 = pI7.CreateRun();
                    rI7.FontFamily = "微軟雅黑";
                    rI7.FontSize = 12;
                    rI7.IsBold = true;
                    rI7.SetText("字段默認值");

                    XWPFParagraph pI8 = table.GetRow(0).GetCell(8).AddParagraph();
                    XWPFRun rI8 = pI8.CreateRun();
                    rI8.FontFamily = "微軟雅黑";
                    rI8.FontSize = 12;
                    rI8.IsBold = true;
                    rI8.SetText("字段說明");

                    #endregion

                    
                    if (tabledetaillist != null && tabledetaillist.Count > 0)
                    {
                        foreach (var itm in tabledetaillist)
                        {
                            //第一列
                            XWPFParagraph pIO = table.GetRow(i).GetCell(0).AddParagraph();
                            XWPFRun rIO = pIO.CreateRun();
                            //rIO.FontFamily = "微軟雅黑";
                            rIO.FontSize = 12;
                            rIO.IsBold = true;
                            rIO.SetText(itm.index.ToString());

                            //第二列
                            XWPFParagraph pIO2 = table.GetRow(i).GetCell(1).AddParagraph();
                            XWPFRun rIO2 = pIO2.CreateRun();
                            //rIO2.FontFamily = "微軟雅黑";
                            rIO2.FontSize = 12;
                            rIO2.IsBold = true;
                            rIO2.SetText(itm.Title);


                            XWPFParagraph pIO3 = table.GetRow(i).GetCell(2).AddParagraph();
                            XWPFRun rIO3 = pIO3.CreateRun();
                            //rIO3.FontFamily = "微軟雅黑";
                            rIO3.FontSize = 12;
                            rIO3.IsBold = true;
                            rIO3.SetText(itm.isMark.ToString());

                            XWPFParagraph pIO4 = table.GetRow(i).GetCell(3).AddParagraph();
                            XWPFRun rIO4 = pIO4.CreateRun();
                            //rIO4.FontFamily = "微軟雅黑";
                            rIO4.FontSize = 12;
                            rIO4.IsBold = true;
                            rIO4.SetText(itm.isPK.ToString());

                            XWPFParagraph pIO5 = table.GetRow(i).GetCell(4).AddParagraph();
                            XWPFRun rIO5 = pIO5.CreateRun();
                            //rIO5.FontFamily = "微軟雅黑";
                            rIO5.FontSize = 12;
                            rIO5.IsBold = true;
                            rIO5.SetText(itm.FieldType);

                            XWPFParagraph pIO6 = table.GetRow(i).GetCell(5).AddParagraph();
                            XWPFRun rIO6 = pIO6.CreateRun();
                            //rIO6.FontFamily = "微軟雅黑";
                            rIO6.FontSize = 12;
                            rIO6.IsBold = true;
                            rIO6.SetText(itm.fieldLenth.ToString());

                            XWPFParagraph pIO7 = table.GetRow(i).GetCell(6).AddParagraph();
                            XWPFRun rIO7 = pIO7.CreateRun();
                            //rIO7.FontFamily = "微軟雅黑";
                            rIO7.FontSize = 12;
                            rIO7.IsBold = true;
                            rIO7.SetText(itm.isAllowEmpty.ToString());

                            XWPFParagraph pIO8 = table.GetRow(i).GetCell(7).AddParagraph();
                            XWPFRun rIO8 = pIO8.CreateRun();
                            //rIO8.FontFamily = "微軟雅黑";
                            rIO8.FontSize = 12;
                            rIO8.IsBold = true;
                            rIO8.SetText(itm.defaultValue.ToString());

                            XWPFParagraph pIO9 = table.GetRow(i).GetCell(8).AddParagraph();
                            XWPFRun rIO9 = pIO9.CreateRun();
                            //rIO9.FontFamily = "微軟雅黑";
                            rIO9.FontSize = 12;
                            rIO9.IsBold = true;
                            rIO9.SetText(itm.fieldDesc);

                            i++;
                        }
                    }
                    
                }
           


        

            }

            #endregion

            #region 存儲過程
            XWPFParagraph p2 = doc.CreateParagraph();
            XWPFRun r2 = p2.CreateRun();
            r2.FontSize = 16;
            r2.SetText("存儲過程");
            List<ProcModel> proclist = new List<ProcModel>();
            proclist = service.GetProcList(conStr);
            if(proclist.Count>0)
            {
                foreach(var item in proclist)
                {
                    //存儲過程名稱
                    XWPFParagraph pro1 = doc.CreateParagraph();
                    XWPFRun rpro1 = pro1.CreateRun();
                    rpro1.FontSize = 14;
                    rpro1.IsBold = true;
                    rpro1.SetText("存儲過程名稱:"+item.procName);
                    //存儲過程 詳情
                    XWPFParagraph pro2 = doc.CreateParagraph();
                    XWPFRun rpro2 = pro2.CreateRun();
                    rpro2.FontSize = 12;
                    rpro2.SetText(item.proDerails);
                }
            }
            #endregion

            #region 試圖
            XWPFParagraph v2 = doc.CreateParagraph();
            XWPFRun vr2 = v2.CreateRun();
            vr2.FontSize = 16;
            vr2.SetText("視圖");
            List<ViewModel> viewlist = new List<ViewModel>();
            viewlist = service.GetViewList(conStr);
            if (proclist.Count > 0)
            {
                foreach (var item in viewlist)
                {
                    //存儲過程名稱
                    XWPFParagraph vro1 = doc.CreateParagraph();
                    XWPFRun vpro1 = vro1.CreateRun();
                    vpro1.FontSize = 14;
                    vpro1.IsBold = true;
                    vpro1.SetText("視圖名稱:" + item.viewName);
                    //存儲過程 詳情
                    XWPFParagraph vro2 = doc.CreateParagraph();
                    XWPFRun vpro2 = vro2.CreateRun();
                    vpro2.FontSize = 12;
                    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;
            }
        }
測試服務器是否鏈接成功
 1  /// <summary>
 2         /// 獲取數據庫列表
 3         /// </summary>
 4         /// <param name="conStr"></param>
 5         /// <returns></returns>
 6         public List<string> GetDBNameList(string conStr)
 7         {
 8             //List<DBName> list =new List<DBName>();
 9             string sql = "select [name] from master.dbo.sysdatabases where DBId>6 Order By [Name] ";
10             try
11             {
12                 using (SqlConnection connection = new SqlConnection(conStr))
13                 {
14                     var list = connection.Query<string>(sql).ToList();
15                     return list;
16                 }
17             }
18             catch
19             {
20                 return null;
21             }
22           
23         }
獲取數據庫列表
        /// <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;
        }
獲取表字段詳情
 1         /// <summary>
 2         /// 獲取特定數據庫裏面的存儲過程
 3         /// </summary>
 4         /// <param name="conStr"></param>
 5         /// <param name="db"></param>
 6         /// <returns></returns>
 7         public List<ProcModel> GetProcList(string conStr)
 8         {
 9             var list = new List<ProcModel>();
10             string sql = @"  select name as procName, (select text from syscomments where id=OBJECT_ID(name)) as proDerails
11                          from dbo.sysobjects  o  where OBJECTPROPERTY(id, N'IsProcedure') = 1 order by name  ";
12             try
13             {
14                // http://www.cnblogs.com/minideas/archive/2009/10/29/1591891.html
15                 using (SqlConnection connection = new SqlConnection(conStr))
16                 {
17                     list = connection.Query<ProcModel>(sql).ToList();
18                 }
19             }
20             catch
21             {
22 
23             }
24             return list;
25         }
獲取特定數據庫裏面的存儲過程

 

實現思路:數據庫

一、首先獲取數據庫的字符串,測試連接是否成功,服務器

二、經過腳本獲取該服務器的數據庫列表。app

三、根據數據庫找到該數據庫的全部數據表框架

四、經過腳本找到該數據表全部的字段信息ide

五、使用Npoi技術把信息導出到Word中去。工具

效果以下:

文檔效果

 

目前功能比較簡單,後續會慢慢完善,固然本身技術有限,歡迎高手多多指點!

Github地址:https://github.com/hgmsq/SqlToDocTool

相關文章
相關標籤/搜索