当前位置: 首页 > news >正文

第100篇博文纪念 | C# 根据数据库表结构生成DOC数据库文档(1)

正文
一、目标
下图是我们要实现的目标:

 

 

 二、实现
原理非常简单,首先制作样式模版,可以参照文章2,将排版好的Word另存为html,然后复制粘贴到aspx页面中,然后从数据库读取表以及字段信息,动态的插入表名和字段信息。
2.1  SqlSchemaProvider.cs
 

// ==============================================================================
//
//  作 者:农民伯伯
//  邮 箱:over140@gmail.com
//  博 客: http://over140.cnblogs.com/
//  时 间:2009-9-9
//  描 述:获取SQL SERVER 元数据
//
// ==============================================================================


using  System;
using  System.Collections.Generic;
using  System.Text;
using  System.Data;
using  System.Data.SqlClient;
using  System.Linq;

public   sealed   class  SqlSchemaProvider
{

    
#region  Constructor

    
public  SqlSchemaProvider( string  connectstring)
    {
        ConnectString 
=  connectstring;
    }

    
#endregion

    
#region  GetTableColumns

    
public  IList < ColumnInfo >  GetTableColumns( string  tableName)
    {
        IList
< ColumnInfo >  result  =   new  List < ColumnInfo > ();

        SqlConnectionStringBuilder scsb 
=   new  SqlConnectionStringBuilder(ConnectString);

        
using  (SqlConnection conn  =   new  SqlConnection(scsb.ConnectionString))
        {
            conn.Open();
            SqlCommand cmd 
=   new  SqlCommand(SQL2000_GetTableColumns, conn);
            cmd.Parameters.Add(
new  SqlParameter( " @DatabaseName " , scsb.InitialCatalog));
            cmd.Parameters.Add(
new  SqlParameter( " @SchemaName " " dbo " ));
            cmd.Parameters.Add(
new  SqlParameter( " @TableName " , tableName));
            SqlDataReader reader 
=  cmd.ExecuteReader(CommandBehavior.CloseConnection);
            
while  (reader.Read())
            {
                result.Add(
new  ColumnInfo()
                {
                    Name 
=  reader.GetString( 0 ),
                    DataType 
=  reader.GetString( 1 ),
                    Length 
=  reader.GetInt32( 3 ),
                    Nullable 
=  reader.GetString( 6 ).Trim().Equals( " YES " ?   true  :  false ,
                    DefaultValue 
=  reader.IsDBNull( 7 ?   ""  : reader[ 7 ].ToString(),
                    Identity 
=  reader.GetInt32( 8 ),
                    IdentitySeed 
=  Convert.ToInt32(reader.GetString( 12 )),
                    IdentityIncrement 
=  Convert.ToInt32(reader.GetString( 13 )),
                    ColumnDesc 
=  reader.GetString( 17 )
                });
            }
            reader.Close();
        }

        
return  result;
    }

    
public  IList < string >  GetTables()
    {
        IList
< string >  result  =   new  List < string > ();

        SqlConnectionStringBuilder scsb 
=   new  SqlConnectionStringBuilder(ConnectString);

        
using  (SqlConnection conn  =   new  SqlConnection(scsb.ConnectionString))
        {
            conn.Open();
            SqlCommand cmd 
=   new  SqlCommand(SQL2000_GetTables, conn);
            SqlDataReader reader 
=  cmd.ExecuteReader(CommandBehavior.CloseConnection);
            
while  (reader.Read())
            {
                result.Add(reader.GetString(
0 ));
            }
            reader.Close();
        }

        
return  result;
    }


    
#region  Type Maps

    
private   string  GetCSharpType( string  type)
    {
        
if  ( string .IsNullOrEmpty(type))
            
return   " string " ;

        
string  reval  =   string .Empty;
        
switch  (type.ToLower())
        {
            
case   " varchar " :
            
case   " nchar " :
            
case   " ntext " :
            
case   " text " :
            
case   " char " :
            
case   " nvarchar " :
                reval 
=   " string " ;
                
break ;
            
case   " int " :
                reval 
=   " int " ;
                
break ;
            
case   " smallint " :
                reval 
=   " Int16 " ;
                
break ;
            
case   " bigint " :
                reval 
=   " Int64 " ;
                
break ;
            
case   " float " :
                reval 
=   " double " ;
                
break ;
            
case   " bit " :
                reval 
=   " bool " ;
                
break ;
            
case   " decimal " :
            
case   " smallmoney " :
            
case   " money " :
            
case   " numeric " :
                reval 
=   " decimal " ;
                
break ;
            
case   " binary " :
                reval 
=   " System.Byte[] " ;
                
break ;
            
case   " real " :
                reval 
=   " System.Single " ;
                
break ;
            
case   " datetime " :
            
case   " smalldatetime " :
            
case   " timestamp " :
                reval 
=   " System.DateTime " ;
                
break ;
            
case   " tinyint " :
                reval 
=   " System.Byte " ;
                
break ;
            
case   " uniqueidentifier " :
                reval 
=   " System.Guid " ;
                
break ;
            
case   " image " :
            
case   " varbinary " :
                reval 
=   " System.Byte[] " ;
                
break ;
            
case   " Variant " :
                reval 
=   " Object " ;
                
break ;

            
default :
                reval 
=   " string " ;
                
break ;
        }
        
return  reval;
    }

    
#endregion

    
#endregion

    
#region  SQL Templates

    
#region  GetTableColumns

    
private   const   string  SQL2000_GetTables  =   @"
          SELECT
              object_name(so.id) AS OBJECT_NAME,
              user_name(so.uid)  AS USER_NAME,
              so.type            AS TYPE,
              so.crdate          AS DATE_CREATED,
              fg.file_group      AS FILE_GROUP,
              so.id              AS OBJECT_ID
          FROM 
              dbo.sysobjects so
          LEFT JOIN (
                SELECT 
                    s.groupname AS file_group,
                    i.id        AS id
                FROM dbo.sysfilegroups s
                INNER JOIN dbo.sysindexes i
                    ON i.groupid = s.groupid 
                WHERE i.indid < 2                           
              ) AS fg
              ON so.id = fg.id
          WHERE
              so.type = N'U'
              AND permissions(so.id) & 4096 <> 0
              AND ObjectProperty(so.id, N'IsMSShipped') = 0
          ORDER BY user_name(so.uid), object_name(so.id)
" ;

    
private   const   string  SQL2000_GetTableColumns  =   @"
              SELECT
                clmns.[name] AS [Name],
                usrt.[name] AS [DataType],
                ISNULL(baset.[name], N'') AS [SystemType],
                CAST(CASE WHEN baset.[name] IN (N'char', N'varchar', N'binary', N'varbinary', N'nchar', N'nvarchar') THEN clmns.prec ELSE clmns.length END AS INT) AS [Length],
                CAST(clmns.xprec AS TINYINT) AS [NumericPrecision],
                CAST(clmns.xscale AS INT) AS [NumericScale],
                CASE CAST(clmns.isnullable AS BIT) WHEN 1 THEN 'YES' ELSE 'NO' END AS [Nullable],
                defaults.text AS [DefaultValue],
                CAST(COLUMNPROPERTY(clmns.id, clmns.[name], N'IsIdentity') AS INT) AS [Identity],
                CAST(COLUMNPROPERTY(clmns.id, clmns.[name], N'IsRowGuidCol') AS INT) AS IsRowGuid,
                CAST(COLUMNPROPERTY(clmns.id, clmns.[name], N'IsComputed') AS INT) AS IsComputed,
                CAST(COLUMNPROPERTY(clmns.id, clmns.[name], N'IsDeterministic') AS INT) AS IsDeterministic,
                CAST(CASE COLUMNPROPERTY(clmns.id, clmns.[name], N'IsIdentity') WHEN 1 THEN IDENT_SEED(QUOTENAME(stbl.[name]) + '.' + QUOTENAME(tbl.[name])) ELSE 0 END AS NVARCHAR(40)) AS [IdentitySeed],
                CAST(CASE COLUMNPROPERTY(clmns.id, clmns.[name], N'IsIdentity') WHEN 1 THEN IDENT_INCR(QUOTENAME(stbl.[name]) + '.' + QUOTENAME(tbl.[name])) ELSE 0 END AS NVARCHAR(40)) AS [IdentityIncrement],
                cdef.[text] AS ComputedDefinition,
                clmns.[collation] AS Collation,
                CAST(clmns.colid AS int) AS ObjectId,
        isnull(prop.value, '') AS ColumnDesc
              FROM
                dbo.sysobjects AS tbl
                INNER JOIN dbo.sysusers AS stbl ON stbl.[uid] = tbl.[uid]
                INNER JOIN dbo.syscolumns AS clmns ON clmns.id=tbl.id
                LEFT JOIN dbo.systypes AS usrt ON usrt.xusertype = clmns.xusertype
                LEFT JOIN dbo.sysusers AS sclmns ON sclmns.uid = usrt.uid
                LEFT JOIN dbo.systypes AS baset ON baset.xusertype = clmns.xtype and baset.xusertype = baset.xtype
                LEFT JOIN db.syscomments AS defaults ON defaults.id = clmns.cdefault
                LEFT JOIN dbo.syscomments AS cdef ON cdef.id = clmns.id AND cdef.number = clmns.colid
        LEFT OUTER JOIN sysproperties prop ON clmns.id = prop.id AND clmns.colid = prop.smallid 
              WHERE
                (tbl.[type] = 'U' OR tbl.[type] = 'S') 
                AND stbl.[name] = 'dbo'
                AND tbl.[name] = @TableName
              ORDER BY
                  clmns.colorder
" ;

    
#endregion

    
#endregion

    
#region  Properties

    
public   string  ConnectString {  get set ; }

    
#endregion

}

 本文转自over140 51CTO博客,原文链接:http://blog.51cto.com/over140/584153,如需转载请自行联系原作者

相关文章:

  • Drawable、Bitmap、Canvas和Paint的关系以及部分使用方法
  • 嫌访问速度慢?教你秒速打开你的WordPress
  • 玩转Bootstrap(JS插件篇)-第1章 模态弹出框 :1-1导入JavaScript插件
  • 借用Snippet插件美化博客中的代码
  • Python的CSV模块
  • IT运维管理之自动化运维篇
  • zookeeper分布式安装
  • 百度面试题:求绝对值最小的数
  • 3-9 读写缓存流 ——BufferedStream类
  • Java线程:线程私有变量
  • 使用Seam-gen生成基础项目骨架
  • 计算机中的颜色XII——快速计算纯色的色相值(新的公式)
  • juniper交换机 mac地址和端口绑定
  • asp.net开发必备51种代码(非常实用)
  • 06.GitHub实战系列~6.过滤器过滤掉的文件如何上传
  • 【个人向】《HTTP图解》阅后小结
  • Android 控件背景颜色处理
  • JavaScript异步流程控制的前世今生
  • JS变量作用域
  • web标准化(下)
  • 搞机器学习要哪些技能
  • 给github项目添加CI badge
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 经典排序算法及其 Java 实现
  • 学习ES6 变量的解构赋值
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 用jQuery怎么做到前后端分离
  • MyCAT水平分库
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • # Maven错误Error executing Maven
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (八)Flask之app.route装饰器函数的参数
  • (备忘)Java Map 遍历
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (三)docker:Dockerfile构建容器运行jar包
  • (四)汇编语言——简单程序
  • (一)appium-desktop定位元素原理
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)负载均衡,回话保持,cookie
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .netcore如何运行环境安装到Linux服务器
  • .NET建议使用的大小写命名原则
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • .sdf和.msp文件读取
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题