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
{
    /// 
    /// 常用功能类
    /// 
    public class DbCommon
    {
        #region 导出表数据为html格式
        /// 
        ///  导出表数据为html格式 居中表格样式
        /// 
        /// DataTable,需要给TableName赋值
        /// 保持Null为Null值,否则为空
        /// 保存路径
        /// 携带返回目录链接
        /// 携带返回目录链接
        public static void CreateHtml(DataTable dt, bool KeepNull, string Path, bool hasReturn = true, string tableDesc = "")
        {
            var code = new StringBuilder();
            code.AppendLine("");
            code.AppendLine("");
            code.AppendLine("");
            code.AppendLine("    {0}".FormatString(dt.TableName));
            code.AppendLine("    ");
            code.AppendLine("");
            code.AppendLine("");
            code.AppendLine("    
"); code.AppendLine("
"); code.AppendLine(" "); code.AppendLine(" "); code.AppendLine(" "); code.AppendLine(" "); code.AppendLine("
"); code.AppendLine(" "); code.AppendLine(" "); code.AppendLine(" "); //构建表头foreach (DataColumn dc in dt.Columns) { code.AppendLine(" ".FormatString(dc.ColumnName)); } code.AppendLine(" "); //构建数据行foreach (DataRow dr in dt.Rows) { code.AppendLine(" "); foreach (DataColumn dc in dt.Columns) { if (KeepNull && dr[dc.ColumnName] == DBNull.Value) { code.AppendLine(" "); } else { code.AppendLine(" ".FormatString( dr[dc.ColumnName].ToString().Trim().Length > 0 ? dr[dc.ColumnName].ToString() : " ")); } } code.AppendLine(" "); } code.AppendLine("
"); code.AppendLine("
{0}{1}{2}
".FormatString( dt.TableName, tableDesc.Length == 0 ? string.Empty : "" + tableDesc + "", hasReturn ? "返回目录" : string.Empty)); code.AppendLine("
{0}
 {0}
"); code.AppendLine("
"); code.AppendLine("
"); code.AppendLine("
"); code.AppendLine(""); code.AppendLine(""); File.WriteAllText(Path, code.ToString(), Encoding.GetEncoding("gb2312")); //File.WriteAllText(Path, code.ToString(), Encoding.UTF8); } /// /// 导出表数据为html格式 Oracle导出格式 带搜索框 /// /// DataTable,需要给TableName赋值 /// 保持Null为Null值,否则为空 /// 保存路径 public static void CreateHtml2(DataTable dt, bool KeepNull, string Path) { var code = new StringBuilder(); code.AppendLine(""); code.AppendLine(""); code.AppendLine(" J{0}".FormatString(dt.TableName)); code.AppendLine(" "); code.AppendLine(" "); code.AppendLine(" "); code.AppendLine(""); code.AppendLine(""); code.AppendLine(" "); code.AppendLine(" "); code.AppendLine(" "); code.AppendLine(" "); code.AppendLine(" "); code.AppendLine(" "); code.AppendLine(" "); code.AppendLine("
"); code.AppendLine(" "); code.AppendLine(" "); code.AppendLine(" " + dt.TableName); code.AppendLine("
"); code.AppendLine("
"); code.AppendLine(" "); code.AppendLine(" "); foreach (DataColumn dc in dt.Columns) { code.AppendLine(" ".FormatString(dc.ColumnName)); } code.AppendLine(" "); code.AppendLine(" "); foreach (DataRow dr in dt.Rows) { code.AppendLine(" "); foreach (DataColumn dc in dt.Columns) { if (KeepNull && dr[dc.ColumnName] == DBNull.Value) { //code.AppendLine(" ".FormatString(dr[dc.ColumnName].ToString())); code.AppendLine(" "); } else// align=\"right\" { code.AppendLine(" ".FormatString( dr[dc.ColumnName].ToString().Length > 0 ? dr[dc.ColumnName].ToString() : " ")); } } code.AppendLine(" "); } code.AppendLine(" "); code.AppendLine("
{0}
{0}  {0}
"); code.AppendLine(""); code.AppendLine(""); 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">

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:\我的代码\Winform\DBDcoumentCreater\DBDcoumentCreater\bin\Debug\tmp\数据库表目录.html
E:\我的代码\Winform\DBDcoumentCreater\DBDcoumentCreater\bin\Debug\tmp\表结构\Code  .html
E:\我的代码\Winform\DBDcoumentCreater\DBDcoumentCreater\bin\Debug\tmp\表结构\Files  文件列表.html
E:\我的代码\Winform\DBDcoumentCreater\DBDcoumentCreater\bin\Debug\tmp\表结构\Menus  菜单表.html
DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<HTML>
<HEAD>
<meta name="GENERATOR" content="EasyCHM.exe  www.zipghost.com">

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 Workshop\hhc.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)

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

出处:

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

程序特点:

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

==

出处: