用户操作
[即时聊天] [发私信] [加为好友]
李明ID:lemong
5994次访问,排名16500(-12),好友6人,关注者16人。
无论工作或者生活,能找到自己的乐趣才是最重要的。
lemong的文章
原创 10 篇
翻译 0 篇
转载 0 篇
评论 13 篇
最近评论
wosizy:这分页代码 功能如何啊··
xvweilan:把查询的字段设为非聚集,再用这个分页上千万的数据都很快的
yj2173591:能教教我代码生成工具应该怎么做?
yj2173591:能教教我代码生成工具应该怎么做?
HectorPeng:不要灰心,失业是一个新的开始。
我想问下,你的代码生成工具有什么特色。
我很感兴趣。能否告知一二?
文章分类
收藏
    相册
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 [C#]一步一步开发自己的自动代码生成工具之一:获取SQL2005的数据库表结构收藏

    新一篇: [C#]一步一步开发自己的自动代码生成工具之二:SQLServer字段与C#变量的对应转化 | 旧一篇: [C#]Cookie中保存Object类型数据

            多年的代码开发工作中,用过的自动代码生成工具也不少了,有复杂的大家伙,也有公司同事们自己写的东东,不过除了CodeSmith等大家伙之外,能自己制定模板的并不多。

           不能使用模板,就意味着生成的代码不能更改,而生成代码的水平,就看开发人的了,实在是用的不舒服。

           那么,我们自己做一个好了。

           第一步:获取数据库的表列表和单表的表结构

            大家知道,数据库的表结构一般都是存储在系统表里的,针对不同的数据库,获取方式也不一样,我这里只是介绍针对SQL Server 2005的SQL,至于其他的数据库,就靠大家自己摸索了。

            1。获取数据库列表

             针对SQL2005,对于所有的数据库,都存在系统表“sysdatabases”中,获取起来比较简单

             select * from sysdatabases where name not in ('master','model','msdb','tempdb')

             where后面的语句是为了不获取SQL的系统数据库,大家可以不加条件,就能获取所有数据库了。

             2。获取指定数据库中的所有数据表/视图的列表

             针对SQL2005,所有表/视图,都存储在“sysobjects”系统表中,而所有表的字段信息,则主要存储在“syscolumns”系统表中,另外,还有一个重要的系统表“systypes”主要存储数据库中系统定义和用户自定义的数据类型。

             获取所有表的名字和每个表的字段数目:

             

    string SqlStr_Tbl = @"select sysobjects.name ,count(*) as ColsCount  
    
                                            from syscolumns,sysobjects,systypes 
    
                                            where syscolumns.id=sysobjects.id 
    
                                            and syscolumns.xtype=systypes.xtype 
    
                                            and sysobjects.type='U' 
    
                                            and systypes.name <>'_default_' 
    
                                            and systypes.name<>'sysname' 
    
                                            group by sysobjects.name 
    
                                            order by sysobjects.name";

             获取所有视图的名字和每个视图的字段数目:

    string SqlStr_Vw = @"select sysobjects.name ,count(*) as ColsCount  
    
                                            from syscolumns,sysobjects,systypes 
    
                                            where syscolumns.id=sysobjects.id 
    
                                            and syscolumns.xtype=systypes.xtype 
    
                                            and sysobjects.type='V' 
    
                                            and systypes.name <>'_default_' 
    
                                            and systypes.name<>'sysname' 
    
                                            group by sysobjects.name 
    
                                            order by sysobjects.name";

            

               3。获取指定表的所有字段属性

                下面的语句中,只要代入不同的表/视图名,就可以获取该表的所有字段名字、字段长度、字段类型、字段说明、字段是否允许为空、是否主键、是否自增长字段等。

         string SqlStr = @"select syscolumns.name as ColName ,systypes.name as ColTypeName 
    
                            , syscolumns.length, sys.extended_properties.value as Mark
    
                            ,syscolumns.isnullable as AllowNull 
    
                            ,IsPK = Case 
    
                            when exists
    
                            (
    
                            select 1 
    
                            from sysobjects
    
                            inner join sysindexes 
    
                            on sysindexes.name = sysobjects.name
    
                            inner join sysindexkeys
    
                            on sysindexes.id = sysindexkeys.id 
    
                            and  sysindexes.indid = sysindexkeys.indid 
    
                            where xtype='PK' 
    
                            and parent_obj = syscolumns.id  
    
                            and sysindexkeys.colid = syscolumns.colid 
    
                            ) then 1
    
                            else 0
    
                            end
    
                            ,IsIdentity = Case syscolumns.status when 128 then 1 else 0 end 
    
                            from syscolumns
    
                            inner join systypes on 
    
                            (
    
                            syscolumns.xtype = systypes.xtype
    
                            and systypes.name <>'_default_' 
    
                            and systypes.name<>'sysname' 
    
                            )
    
                            left outer join sys.extended_properties on
    
                            (
    
                            sys.extended_properties.major_id=syscolumns.id 
    
                            and minor_id=syscolumns.colid
    
                            )
    
                            where syscolumns.id = (select id from sysobjects where name='" + TableName + @"')
    
                            order by syscolumns.colid ";

     

    好了,到现在为止,已经获取到了我们所需要的数据。

     

    发表于 @ 2008年07月05日 20:59:00|评论(loading...)|编辑|收藏

    新一篇: [C#]一步一步开发自己的自动代码生成工具之二:SQLServer字段与C#变量的对应转化 | 旧一篇: [C#]Cookie中保存Object类型数据

    评论:没有评论。

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © lemong