• C#版的数据库文档CHM生成器(附源代码)


    背景:

      在做项目的时候,当时的数据库文档是txt格式,后来晋升为doc格式。在开发过程中,依旧觉得不方便。后来用动软生成器,发现它可以生成html和doc格式的数据库文档,html用起来相对轻松些。有一天突发奇想,若是弄成CHM文档就好了。期间用过CHM工具一段时间。人是难以满足的,懒惰是永无止尽的。后来嫌弃操作太繁琐,在博客园上一位牛人博客中学习了CHM编程。此后一直以代码的方式生成CHM文档。

      现在我将它做成了一个相对通用的工具,支持SQL2005及以上,Oracle。易拓展,方便有需要的朋友。

    资源下载:

      文档生成器

      示例文档预览

      源代码

    软件及文档截图:

      

      

    开发流程简介:

      1.读取数据库表以及表的描述信息。

    SQL2005以上查看表名以及说明
    SELECT  Row_Number() over ( order by getdate() )  as 序号, case when a.colorder = 1 then d.name 
                       else '' end as 表名, 
            case when a.colorder = 1 then isnull(f.value, '') 
                         else '' end as 表说明
    FROM syscolumns a 
           inner join sysobjects d 
              on a.id = d.id 
                 and d.xtype = 'U' 
                 and d.name <> 'sys.extended_properties'
           left join sys.extended_properties   f 
             on a.id = f.major_id 
                and f.minor_id = 0
     where a.colorder = 1 and d.name<>'sysdiagrams'
    SQL2008/2012查看表以及字段信息
    SELECT TOP 100 PERCENT 
                        d.name as 表名,
                        a.colorder AS 序号,  
                        a.name AS 列名,  
                        b.name AS 数据类型,  
                        a.length AS 长度, 
                        ISNULL(COLUMNPROPERTY(a.id, a.name, 'Scale'), 0) AS 小数位数,  
                        CASE WHEN COLUMNPROPERTY(a.id,a.name, 'IsIdentity') = 1 THEN '' ELSE '' END AS 标识,  
                        CASE WHEN EXISTS 
                            (SELECT 1 FROM dbo.sysindexes si  
                              INNER JOIN dbo.sysindexkeys sik ON si.id = sik.id AND si.indid = sik.indid   
                              INNER JOIN dbo.syscolumns sc ON sc.id = sik.id AND sc.colid = sik.colid   
                              INNER JOIN dbo.sysobjects so ON so.name = si.name AND so.xtype = 'PK'  
                           WHERE sc.id = a.id AND sc.colid = a.colid) THEN '' ELSE '' END AS 主键,   
                        CASE WHEN a.isnullable = 1 THEN '' ELSE '' END AS 允许空,  
                         ISNULL(e.text, '') AS 默认值,  
                            ISNULL(g.[value], '') AS 列说明 
                  FROM dbo.syscolumns a  
                        LEFT OUTER JOIN dbo.systypes b ON a.xtype = b.xusertype  
                        INNER JOIN dbo.sysobjects d ON a.id = d.id AND d.xtype = 'U' AND d.status >= 0 
                        LEFT OUTER JOIN dbo.syscomments e ON a.cdefault = e.id  
                        LEFT OUTER JOIN sys.extended_properties g ON a.id = g.major_id AND a.colid = g.minor_id AND g.name = 'MS_Description'  
                        LEFT OUTER JOIN sys.extended_properties f ON d.id = f.major_id AND f.minor_id = 0 AND f.name = 'MS_Description'  
                  ORDER BY d.name, 序号
    Oracle查看表名以及说明
    select ROWNUM 序号 ,ut.table_name 表名,utc.comments 表说明 from user_tables ut left join user_tab_comments utc on ut.table_name = utc.table_name order by ut.table_name
    Oracle查看表以及字段信息
    select  row_number()over( partition by utc.table_name order by utc.COLUMN_ID, ROWNUM ) as 序号,
                    utc.table_name as 表名,
                     utc.column_name as 列名, 
                     utc.data_type as 数据类型, 
                     utc.data_length as 长度, 
                     utc.data_precision as 精度,
                     utc.data_Scale 小数位数, 
                     case when  exists ( select   col.column_name   from   user_constraints con,user_cons_columns col 
                        where  con.constraint_name=col.constraint_name and con.constraint_type='P' and col.table_name=ucc.table_name and col.column_name =  utc.column_name ) 
                        then '' else '' end as 主键, 
                     case when utc.nullable = 'Y' then '' else '' end as 允许空, 
                     utc.data_default as 默认值, 
                     ucc.comments as 列说明 
                     from 
                     user_tab_columns utc,user_col_comments ucc 
                     where  utc.table_name = ucc.table_name and utc.column_name = ucc.column_name  
                     order by   utc.table_name,序号

      2.获取用户选择的表,获取该表的所有字段信息,构建html,存储在tmp临时目录。

    将DataTable的数据转换成HTML
    /* ==============================================================================
       * 文 件 名:DbCommon
       * 功能描述:
       * Copyright (c) 2012 武汉经纬视通科技有限公司
       * 创 建 人: chenbo
       * 创建时间: 2013/3/18 15:21:25
       * 修 改 人: 
       * 修改时间: 
       * 修改描述: 
       * 版    本: v1.0.0.0
       * ==============================================================================*/
    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.IO;
    using System.Text;
    using Chen.Ext;
    namespace Chen.DB
    {
        /// <summary>
        /// 常用功能类
        /// </summary>
        public class DbCommon
        {
            #region 导出表数据为html格式
            /// <summary>
            ///  导出表数据为html格式 居中表格样式
            /// </summary>
            /// <param name="dt">DataTable,需要给TableName赋值</param>
            /// <param name="KeepNull">保持Null为Null值,否则为空</param>
            /// <param name="Path">保存路径</param>
            /// <param name="hasReturn">携带返回目录链接</param>
            /// <param name="tableDesc">携带返回目录链接</param>
            public static void CreateHtml(DataTable dt, bool KeepNull, string Path, bool hasReturn = true, string tableDesc = "")
            {
                var code = new StringBuilder();
                code.AppendLine("<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">");
                code.AppendLine("<html xmlns="http://www.w3.org/1999/xhtml">");
                code.AppendLine("<head>");
                code.AppendLine("    <title>{0}</title>".FormatString(dt.TableName));
                code.AppendLine("    <style type="text/css">");
                code.AppendLine("        body");
                code.AppendLine("        {");
                code.AppendLine("            font-size: 9pt;");
                code.AppendLine("        }");
                code.AppendLine("        .styledb");
                code.AppendLine("        {");
                code.AppendLine("            font-size: 14px;");
                code.AppendLine("        }");
                code.AppendLine("        .styletab");
                code.AppendLine("        {");
                code.AppendLine("            font-size: 14px;");
                code.AppendLine("            padding-top: 15px;");
                code.AppendLine("        }");
                code.AppendLine("        a");
                code.AppendLine("        {");
                code.AppendLine("            color: #015FB6;");
                code.AppendLine("        }");
                code.AppendLine("        a:link, a:visited, a:active");
                code.AppendLine("        {");
                code.AppendLine("            color: #015FB6;");
                code.AppendLine("            text-decoration: none;");
                code.AppendLine("        }");
                code.AppendLine("        a:hover");
                code.AppendLine("        {");
                code.AppendLine("            color: #E33E06;");
                code.AppendLine("        }");
                code.AppendLine("    </style>");
                code.AppendLine("</head>");
                code.AppendLine("<body>");
                code.AppendLine("    <div style="text-align: center">");
                code.AppendLine("        <div>");
                code.AppendLine("            <table border="0" cellpadding="5" cellspacing="0" width="90%">");
                code.AppendLine("                <tr>");
                code.AppendLine("                    <td bgcolor="#FBFBFB">");
                code.AppendLine("                        <table cellspacing="0" cellpadding="5" border="1" width="100%" bordercolorlight="#D7D7E5" bordercolordark="#D3D8E0">");
                code.AppendLine("                        <caption>");
                code.AppendLine("        <div class="styletab">{0}{1}{2}</div>".FormatString(
                    dt.TableName,
                    tableDesc.Length == 0 ? string.Empty : "" + tableDesc + "",
                    hasReturn ? "<a href='../数据库表目录.html' style='float: right; margin-top: 6px;'>返回目录</a>" : string.Empty));
                code.AppendLine("                        </caption>");
                code.AppendLine("                        <tr bgcolor="#F0F0F0">");
                //构建表头
                foreach (DataColumn dc in dt.Columns)
                {
                    code.AppendLine("            <td>{0}</td>".FormatString(dc.ColumnName));
                }
                code.AppendLine("                         </tr>");
                //构建数据行
                foreach (DataRow dr in dt.Rows)
                {
                    code.AppendLine("            <tr>");
                    foreach (DataColumn dc in dt.Columns)
                    {
                        if (KeepNull && dr[dc.ColumnName] == DBNull.Value)
                        {
                            code.AppendLine("            <td>&nbsp;</td>");
                        }
                        else
                        {
                            code.AppendLine("            <td>{0}</td>".FormatString(
                                  dr[dc.ColumnName].ToString().Trim().Length > 0 ? dr[dc.ColumnName].ToString() : "&nbsp;"));
                        }
                    }
                    code.AppendLine("            </tr>");
                }
                code.AppendLine("                        </table>");
                code.AppendLine("                    </td>");
                code.AppendLine("                </tr>");
                code.AppendLine("            </table>");
                code.AppendLine("        </div>");
                code.AppendLine("    </div>");
                code.AppendLine("</body>");
                code.AppendLine("</html>");
                File.WriteAllText(Path, code.ToString(), Encoding.GetEncoding("gb2312"));
                //File.WriteAllText(Path, code.ToString(), Encoding.UTF8);
            }
    
            /// <summary>
            ///  导出表数据为html格式 Oracle导出格式 带搜索框
            /// </summary>
            /// <param name="dt">DataTable,需要给TableName赋值</param>
            /// <param name="KeepNull">保持Null为Null值,否则为空</param>
            /// <param name="Path">保存路径</param>
            public static void CreateHtml2(DataTable dt, bool KeepNull, string Path)
            {
                var code = new StringBuilder();
                code.AppendLine("<html>");
                code.AppendLine("<head>");
                code.AppendLine("    <title>J{0}</title>".FormatString(dt.TableName));
                code.AppendLine("    <meta http-equiv="content-type" content="text/html; charset=GBK">");
                code.AppendLine("    <style type="text/css">");
                code.AppendLine("        table");
                code.AppendLine("        {");
                code.AppendLine("            background-color: #F2F2F5;");
                code.AppendLine("            border- 1px 1px 0px 1px;");
                code.AppendLine("            border-color: #C9CBD3;");
                code.AppendLine("            border-style: solid;");
                code.AppendLine("        }");
                code.AppendLine();
                code.AppendLine("        td");
                code.AppendLine("        {");
                code.AppendLine("            color: #000000;");
                code.AppendLine("            font-family: Tahoma,Arial,Helvetica,Geneva,sans-serif;");
                code.AppendLine("            font-size: 9pt;");
                code.AppendLine("            background-color: #EAEFF5;");
                code.AppendLine("            padding: 8px;");
                code.AppendLine("            background-color: #F2F2F5;");
                code.AppendLine("            border-color: #ffffff #ffffff #cccccc #ffffff;");
                code.AppendLine("            border-style: solid solid solid solid;");
                code.AppendLine("            border- 1px 0px 1px 0px;");
                code.AppendLine("        }");
                code.AppendLine();
                code.AppendLine("        th");
                code.AppendLine("        {");
                code.AppendLine("            font-family: Tahoma,Arial,Helvetica,Geneva,sans-serif;");
                code.AppendLine("            font-size: 9pt;");
                code.AppendLine("            padding: 8px;");
                code.AppendLine("            background-color: #CFE0F1;");
                code.AppendLine("            border-color: #ffffff #ffffff #cccccc #ffffff;");
                code.AppendLine("            border-style: solid solid solid none;");
                code.AppendLine("            border- 1px 0px 1px 0px;");
                code.AppendLine("            white-space: nowrap;");
                code.AppendLine("        }");
                code.AppendLine("        a:link, a:visited, a:active");
                code.AppendLine("        {");
                code.AppendLine("            color: #015FB6;");
                code.AppendLine("            text-decoration: none;");
                code.AppendLine("        }");
                code.AppendLine("        a:hover");
                code.AppendLine("        {");
                code.AppendLine("            color: #E33E06;");
                code.AppendLine("        }");
                code.AppendLine("    </style>");
                code.AppendLine("    <script type="text/javascript">");
                code.AppendLine("        window.apex_search = {};");
                code.AppendLine("        apex_search.init = function () {");
                code.AppendLine("            this.rows = document.getElementById('data').getElementsByTagName('TR');");
                code.AppendLine("            this.rows_length = apex_search.rows.length;");
                code.AppendLine("            this.rows_text = [];");
                code.AppendLine("            for (var i = 0; i < apex_search.rows_length; i++) {");
                code.AppendLine("                this.rows_text[i] = (apex_search.rows[i].innerText) ? apex_search.rows[i].innerText.toUpperCase() : apex_search.rows[i].textContent.toUpperCase();");
                code.AppendLine("            }");
                code.AppendLine("            this.time = false;");
                code.AppendLine("        }");
                code.AppendLine();
                code.AppendLine("        apex_search.lsearch = function () {");
                code.AppendLine("            this.term = document.getElementById('S').value.toUpperCase();");
                code.AppendLine("            for (var i = 0, row; row = this.rows[i], row_text = this.rows_text[i]; i++) {");
                code.AppendLine("                row.style.display = ((row_text.indexOf(this.term) != -1) || this.term === '') ? '' : 'none';");
                code.AppendLine("            }");
                code.AppendLine("            this.time = false;");
                code.AppendLine("        }");
                code.AppendLine();
                code.AppendLine("        apex_search.search = function (e) {");
                code.AppendLine("            var keycode;");
                code.AppendLine("            if (window.event) { keycode = window.event.keyCode; }");
                code.AppendLine("            else if (e) { keycode = e.which; }");
                code.AppendLine("            else { return false; }");
                code.AppendLine("            if (keycode == 13) {");
                code.AppendLine("                apex_search.lsearch();");
                code.AppendLine("            }");
                code.AppendLine("            else { return false; }");
                code.AppendLine("        }</script>");
                code.AppendLine("</head>");
                code.AppendLine("<body onload="apex_search.init();">");
                code.AppendLine("    <table border="0" cellpadding="0" cellspacing="0">");
                code.AppendLine("        <tbody>");
                code.AppendLine("            <tr>    ");
                code.AppendLine("                <td>");
                code.AppendLine("                    <input type="text" size="30" maxlength="1000" value="" id="S" onkeyup="apex_search.search(event);" /><input type="button" value="Search" onclick="apex_search.lsearch();" />");
                code.AppendLine("                </td>");
                code.AppendLine("                <td>");
                code.AppendLine("                        " + dt.TableName);
                code.AppendLine("                </td>");
                code.AppendLine("            </tr>");
                code.AppendLine("        </tbody>");
                code.AppendLine("    </table>");
                code.AppendLine("    <br />");
                code.AppendLine("    <table border="0" cellpadding="0" cellspacing="0">");
                code.AppendLine("        <tr>");
                foreach (DataColumn dc in dt.Columns)
                {
                    code.AppendLine("            <th>{0}</th>".FormatString(dc.ColumnName));
                }
                code.AppendLine("        </tr>");
                code.AppendLine("        <tbody id="data">");
                foreach (DataRow dr in dt.Rows)
                {
                    code.AppendLine("            <tr>");
                    foreach (DataColumn dc in dt.Columns)
                    {
                        if (KeepNull && dr[dc.ColumnName] == DBNull.Value)
                        {
                            //code.AppendLine("            <td>{0}</td>".FormatString(dr[dc.ColumnName].ToString()));
                            code.AppendLine("            <td>&nbsp;</td>");
                        }
                        else//  align="right"
                        {
                            code.AppendLine("            <td>{0}</td>".FormatString(
                                dr[dc.ColumnName].ToString().Length > 0 ? dr[dc.ColumnName].ToString() : "&nbsp;"));
                        }
                    }
                    code.AppendLine("            </tr>");
                }
                code.AppendLine("        </tbody>");
                code.AppendLine("    </table>");
                code.AppendLine("</body>");
                code.AppendLine("</html>");
                File.WriteAllText(Path, code.ToString(), Encoding.GetEncoding("gb2312"));
            }
            #endregion
        }
    }

       3.在创建好所有的html之后,下一步编译成chm文档。编译之前,需要准备3个文件,hhc,hhp,hhk。分别是CHM格式文件的内容文件、编译参数文件、索引文件。文件的格式简单易懂。对比文件夹的内容以及文件夹层次结构,看一下就可以有点清楚了。这里还是简单的贴一下吧,方便大家的了解。

    复制代码
    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
    <HTML>
    <HEAD>
    <meta name="GENERATOR" content="EasyCHM.exe  www.zipghost.com">
    <!-- Sitemap 1.0 -->
    </HEAD><BODY>
    <OBJECT type="text/site properties">
        <param name="ExWindow Styles" value="0x200">
        <param name="Window Styles" value="0x800025">
        <param name="Font" value="MS Sans Serif,9,0">
    </OBJECT>
        <UL>
        <LI> <OBJECT type="text/sitemap">
            <param name="Name" value="数据库表目录">
            <param name="Local" value="数据库表目录.html">
            <param name="ImageNumber" value="11">
            </OBJECT>
        <LI> <OBJECT type="text/sitemap">
            <param name="Name" value="表结构">
            <param name="ImageNumber" value="1">
            </OBJECT>
        <UL>
        <LI> <OBJECT type="text/sitemap">
            <param name="Name" value="Code  ">
            <param name="Local" value="表结构Code  .html">
            <param name="ImageNumber" value="11">
            </OBJECT>
        <LI> <OBJECT type="text/sitemap">
            <param name="Name" value="Files  文件列表">
            <param name="Local" value="表结构Files  文件列表.html">
            <param name="ImageNumber" value="11">
            </OBJECT>
        <LI> <OBJECT type="text/sitemap">
            <param name="Name" value="Menus  菜单表">
            <param name="Local" value="表结构Menus  菜单表.html">
            <param name="ImageNumber" value="11">
            </OBJECT>
        </UL>
        </UL>
    </BODY></HTML>
    复制代码
    复制代码
    [OPTIONS]
    CITATION=Made by Jinwin
    Compatibility=1.1 or later
    Compiled file=D:数据库帮助文档.chm
    Contents file=chm.HHC
    COPYRIGHT=www.jinwin.net
    Default topic=数据库表目录.html
    Default Window=Main
    Display compile notes=Yes
    Display compile progress=Yes
    Full-text search=Yes
    Index file=chm.HHK
    Title=数据库帮助文档
    Enhanced decompilation=yes
    
    [WINDOWS]
    Main="数据库帮助文档","chm.hhc","chm.hhk","数据库表目录.html","数据库表目录.html",,,,,0x63520,180,0x104E, [0,0,745,509],0x0,0x0,,,,,0
    
    [MERGE FILES]
    
    [FILES]
    E:我的代码WinformDBDcoumentCreaterDBDcoumentCreaterinDebug	mp数据库表目录.html
    E:我的代码WinformDBDcoumentCreaterDBDcoumentCreaterinDebug	mp表结构Code  .html
    E:我的代码WinformDBDcoumentCreaterDBDcoumentCreaterinDebug	mp表结构Files  文件列表.html
    E:我的代码WinformDBDcoumentCreaterDBDcoumentCreaterinDebug	mp表结构Menus  菜单表.html
    复制代码
    复制代码
    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
    <HTML>
    <HEAD>
    <meta name="GENERATOR" content="EasyCHM.exe  www.zipghost.com">
    <!-- Sitemap 1.0 -->
    </HEAD><BODY>
    <OBJECT type="text/site properties">
        <param name="ExWindow Styles" value="0x200">
        <param name="Window Styles" value="0x800025">
        <param name="Font" value="MS Sans Serif,9,0">
    </OBJECT>
    <UL>
        <LI> <OBJECT type="text/sitemap">
            <param name="Name" value="数据库表目录">
            <param name="Local" value="数据库表目录.html">
            <param name="ImageNumber" value="11">
            </OBJECT>
        <LI> <OBJECT type="text/sitemap">
            <param name="Name" value="Code  ">
            <param name="Local" value="表结构Code  .html">
            <param name="ImageNumber" value="11">
            </OBJECT>
        <LI> <OBJECT type="text/sitemap">
            <param name="Name" value="Files  文件列表">
            <param name="Local" value="表结构Files  文件列表.html">
            <param name="ImageNumber" value="11">
            </OBJECT>
        <LI> <OBJECT type="text/sitemap">
            <param name="Name" value="Menus  菜单表">
            <param name="Local" value="表结构Menus  菜单表.html">
            <param name="ImageNumber" value="11">
            </OBJECT>
    </UL>
    </BODY></HTML>
    复制代码

      4.chm编译前的相关文件生成完毕后,开始调用微软的hhc文件,一般系统都有,我也只在win7上做过测试。测试不足的话,还请见谅。路径为:

            C:Program Files (x86)HTML Help Workshophhc.exe 。传入指定的参数,就可以得到chm文件了。
      
     5.最后一步则是清理垃圾了。删除掉这些临时文件临时文件夹就好了。
      

    最后:

    
      感兴趣的朋友可以下载可执行程序看看,有需要源码的朋友留言吧,帮忙消灭万恶的零回复,顺手点个推荐吧,您的关注是给我最大的鼓励,谢谢!

    更新:

    
      1.修复了26楼朋友提出的问题:Oracle查询数据的SQL错误。(2013-03-22)
      2.增加连接字符串配置向导。(2013-03-23)
      3.携带hhc.exe,避免有些系统缺少该文件。(2013-03-24)
      4.弃用hhc.exe。直接使用hha.dll提供的接口。修复表目录总是导出全部而非选中的表的问题。(2013-03-27)
      5.整合SQL选项,生成Html文件时gb2312编码,避免部分系统IE自动解析编码错误。(2013-04-01)

    每一次修改,发布的可执行程序和源码均同步更新,链接不变。

    出处:https://www.cnblogs.com/codealone/archive/2013/03/21/2972426.html

    ============================================================================

    开源我的代码生成器以及数据库文档生成器(附截图和源码)

    程序特点:

    1.       可生成实体类,业务逻辑层,数据访问层,数据库文档等,如数据库定义的完整,生成代码也会包括注释(支持批量生成)

    2.       由于Oracle数据表和字段都是大写表示,生成代码可读性较差.本程序可自定义相应的骆驼表示法(UserName),增强生成代码的可读性,对应关系保存在XML文件中,可反复使用.(当能也可生成原始全部大写的代码).

    3.       可进行预览或保存到文件

    4.       生成方法包括 GetList(),GetModel(),GetModelList(),Add(),AddList(),Update(),UpdateList(),Delete(),DeleteList(),DeleteByKeys(),可全部生成也可选择部分生成

    5. 生成的文件默认放在C盘,并可自动打来目录.

    6.       废话少说,上截图!

    主界面

     项目架构

    Word文档

     实体类层

     业务逻辑层

     数据访问层

    数据访问层二

    数据访问层三

     

    /Files/gossip/CodeGenerateOpenSource.zip

    ==

    出处:https://www.cnblogs.com/gossip/archive/2011/11/13/2247154.html

  • 相关阅读:
    排序算法:冒泡和快排 摘自网络
    C语言内存讲解
    查找算法:折半查找
    SQL 相关知识
    位运算 C++
    设计模式学习3 观察者模式
    实验四——多分支结构及本章总结
    作业3for语句及分支结构elseif
    作业心得
    第二次作业及总结数据类型和运算符
  • 原文地址:https://www.cnblogs.com/mq0036/p/12652877.html
Copyright © 2020-2023  润新知