数据库表结构生成器v1.0发布

发布一个小工具——数据库表结构生成器

用途:面对大型项目,根据数据库表结构生成图片,可以瞬间摸清项目底细,一切尽在掌握。

功能介绍:

* 根据数据库表结构生成图片
* 适用于MS Sql Server 2000, Sql Server 2005 and Sql Server 2008 etc.
* 根据系统sql语句导出数据库表结构
* 利用GDI+将表结构生成图片

符程序截图:

截图1:登录

截图2:生成后

截图3:生成的表结构

下面记录下程序的实现思路:

  1. 连接到指定数据库,由特定系统sql语句得到数据表table
  2. 根据table name得到该表单表结构,如字段名、类型、长度以及注释说明等,当然,还有table的说明(注释)
    如图所示:
  3. 将该结果集利用GDI+技术生成图片并加上特定的修改.

程序中用到很多sql server 系统sql语句,如下:

  • 得到sql server的版本
    exec master.dbo.xp_msver 'ProductVersion'

    介绍下sql server的发展历史:

    version  对应数据库
    7.0 是由Microsoft Sybase 和Ashton-Tate三家公司共同开发的,于1988 年推出了第一个OS/2 版本
    8.0 sql srever 2000
    9.0 sql server 2005
    10.0 sql server 2008
    11.0 sql server 2012(没试过,推测)






  • 得到非系统数据表——即得到用户自己创建的表
    SELECT 
        O.object_id AS TableId,
        TableName=O.name  ,
        TableDesc= PTB.[value]  
    FROM sys.columns C
        INNER JOIN sys.objects O
            ON C.[object_id]=O.[object_id]
                AND O.type='U'
                AND O.is_ms_shipped=0
        INNER JOIN sys.types T
            ON C.user_type_id=T.user_type_id
        LEFT JOIN sys.extended_properties PTB
            ON PTB.class=1 
                AND PTB.minor_id=0 
                AND C.[object_id]=PTB.major_id
    WHERE C.column_id=1 
    ORDER BY TableName
  • 根据表名得到表结构,类似于oracle或者mysql的desc 命令
    SELECT     
      TableName=case   when   a.colorder=1   then   d.name   else   ''   end,   
      TableDesc=case   when   a.colorder=1   then   isnull(f.value,'')   else   ''   end,   
        ColumnId=a.colorder,   
      ColumnName=a.name,   
      [Identity]=case   when   COLUMNPROPERTY(   a.id,a.name,'IsIdentity')=1   then   ''else   ''   end,   
      PrimaryKey=case   when   exists(SELECT   1   FROM   sysobjects   where   xtype='PK'   and   name   in   (   
      SELECT   name   FROM   sysindexes   WHERE   indid   in(   
      SELECT   indid   FROM   sysindexkeys   WHERE   id   =   a.id   AND   colid=a.colid   
      )))   then   ''   else   ''   end,   
      Type=b.name,   
        [Precision]=a.length,   
       Length=COLUMNPROPERTY(a.id,a.name,'PRECISION'),   
      Scale=isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0),   
       NullAble=case   when   a.isnullable=1   then   ''else   ''   end,   
      [Default]=isnull(e.text,''),   
      ColumnDesc=isnull(g.[value],'')   ,
    IndexName=case when isnull(h.索引名称,'') like 'IX_%' then '' else '' end,   
      IndexSort=case when isnull(h.索引名称,'') like 'IX_%' then isnull(h.排序,'') else '' end  
      FROM   syscolumns   a   
      left   join   systypes   b   on   a.xtype=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   
      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   
      left   join(   
      select   索引名称=a.name,c.id,d.colid   
      ,排序=case   indexkey_property(c.id,b.indid,b.keyno,'isdescending')   
      when   1   then   '降序'   when   0   then   '升序'   end   
      from   sysindexes   a   
      join   sysindexkeys   b   on   a.id=b.id   and   a.indid=b.indid   
      join   (--这里的作用是有多个索引时,取索引号最小的那个   
      select   id,colid,indid=min(indid)   from   sysindexkeys   
      group   by   id,colid)   b1   on   b.id=b1.id   and   b.colid=b1.colid   and   b.indid=b1.indid   
      join   sysobjects   c   on   b.id=c.id   and   c.xtype='U'   and     c.name<>'dtproperties'   
      join   syscolumns   d   on   b.id=d.id   and   b.colid=d.colid   
      where   a.indid   not   in(0,255)   
      )   h   on   a.id=h.id   and   a.colid=h.colid  
    
     where   d.name=N'{0}'         
      order   by   a.id,a.colorder
  • 剩下的重点应该就是GDI+了,这个就自己认真看代码吧 :)

source code

最后,最重要的是源代码在哪里? 在这,https://github.com/FrankFan/DatabasePicExporter

可执行文件在这里:https://files.cnblogs.com/fanyong/DatabasePicExporter.rar

原文地址:https://www.cnblogs.com/fanyong/p/DatabasePicExporter.html