第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,如需转载请自行联系原作者

相关文章
|
2月前
|
存储 SQL 数据库
如何避免数据库表结构冗余?
【7月更文挑战第28天】如何避免数据库表结构冗余?
33 5
|
3月前
|
运维 Oracle 关系型数据库
screw生成数据库文档
screw生成数据库文档
37 12
|
11天前
|
SQL 存储 关系型数据库
C#一分钟浅谈:使用 ADO.NET 进行数据库访问
【9月更文挑战第3天】在.NET开发中,与数据库交互至关重要。ADO.NET是Microsoft提供的用于访问关系型数据库的类库,包含连接数据库、执行SQL命令等功能。本文从基础入手,介绍如何使用ADO.NET进行数据库访问,并提供示例代码,同时讨论常见问题及其解决方案,如连接字符串错误、SQL注入风险和资源泄露等,帮助开发者更好地利用ADO.NET提升应用的安全性和稳定性。
42 6
|
1月前
|
关系型数据库 Java MySQL
C#winform中使用SQLite数据库
C#winform中使用SQLite数据库
39 3
C#winform中使用SQLite数据库
|
1月前
|
关系型数据库 MySQL 大数据
C#使用SqlSugar操作MySQL数据库实现简单的增删改查
C#使用SqlSugar操作MySQL数据库实现简单的增删改查
140 2
|
2月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的《数据库原理及应用》课程平台的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的《数据库原理及应用》课程平台的详细设计和实现(源码+lw+部署文档+讲解等)
|
1月前
|
SQL Oracle 关系型数据库
.NET 开源快捷的数据库文档查询和生成工具
【8月更文挑战第1天】推荐几款.NET开源数据库文档工具:1. DBDocumentor,支持多类型数据库,快速生成详尽文档;2. SqlDoc,界面简洁,自定义内容与格式;3. DBInfo,强大查询功能,支持多种导出格式。这些工具有效提升文档管理效率与质量。
|
2月前
|
Web App开发 缓存 数据管理
数据管理DMS使用问题之执行SHOW CREATE TABLE命令查看表结构时,数据库管理员和普通授权账号看到的为什么不一样
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
|
2月前
|
SQL Java 持续交付
实时计算 Flink版产品使用问题之源数据库一直在新增表或修改表结构,需要进行相应的修改和重启,该如何简化
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
3月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue的数据库课程在线教学的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue的数据库课程在线教学的详细设计和实现(源码+lw+部署文档+讲解等)
37 2