[c#]一步一步开发自己的自动代码生成工具之一:获取sql2005的数据库表结构
2010-10-12 23:28
1221 查看
多年的代码开发工作中,用过的自动代码生成工具也不少了,有复杂的大家伙,也有公司同事们自己写的东东,不过除了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 ";
好了,到现在为止,已经获取到了我们所需要的数据。
不能使用模板,就意味着生成的代码不能更改,而生成代码的水平,就看开发人的了,实在是用的不舒服。
那么,我们自己做一个好了。
第一步:获取数据库的表列表和单表的表结构
大家知道,数据库的表结构一般都是存储在系统表里的,针对不同的数据库,获取方式也不一样,我这里只是介绍针对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 ";
好了,到现在为止,已经获取到了我们所需要的数据。
相关文章推荐
- [C#]一步一步开发自己的自动代码生成工具之一:获取SQL2005的数据库表结构
- [C#]一步一步开发自己的自动代码生成工具之二:SQLServer字段与C#变量的对应转化
- [C#]一步一步开发自己的自动代码生成工具之三:代码生成引擎
- [C#]一步一步开发自己的自动代码生成工具之四:简单三层代码模板实例Model层
- [C#]一步一步开发自己的自动代码生成工具之五:DAL层模板
- [C#]一步一步开发自己的自动代码生成工具之六:业务层模板
- C#分析数据库结构,使用XSL模板自动生成代码
- C#分析数据库结构,使用XSL模板自动生成代码
- C#分析数据库结构,使用XSL模板自动生成代码
- C#分析数据库结构,使用XSL模板自动生成代码
- 用Pytohn写了一个根据表结构自动生成C#对像代码的小工具
- C#分析数据库结构,使用XSL模板自动生成代码
- C#分析数据库结构,使用XSL模板自动生成代码
- C#分析数据库结构,使用XSL模板自动生成代码
- C#分析数据库结构,使用XSL模板自动生成代码
- C#分析数据库结构,使用XSL模板自动生成代码(二)
- C#分析数据库结构,使用XSL模板自动生成代码
- C# 代码结构自动化生成文档工具开发
- C#分析数据库结构,使用XSL模板自动生成代码(一)
- [导入]C#分析数据库结构,使用XSL模板自动生成代码