C#自动数据库代码生成的思路

来源:互联网 发布:apache 官方下载 编辑:程序博客网 时间:2024/05/19 05:06

C#操作数据库,写来写去就那么几句套话,烦。尽管有SqlHelper之类的辅助类,但还是有一堆参数要自己填,继续烦。最近有朋友问起自动代码生成工具的原理,那今天就说说我的思路吧。我只会MS SQL SERVER,所以就只拿它说事儿了。

 

其实大的思路很简单,获取数据库中的比较原子的对象,比如字段、参数等,并找出数据库各字段类型与C#中各种类型之间的对应关系即可。但具体到细节,诸如是不是需要引号,是不是需要提供长度,默认值的确定,参数的方向等等还是需要比较费些心思的。

 

举个简单例子吧,我们要从表中生成一个实体类,每个表字段也是实体对象的字段。很显然,只要知道表结构就可以精确的产生这个类定义。所以现在问题暂时就转换到了“知道表名,如何获取它包含的字段名和类型”。

 

最简单的方法,sp_columns '表名或视图名' 即可。不难发现,TYPE_NAME和COLUMN_NAME是我们想要的。

 

当然这样查出来的还都只是sql的类型,需要自己写个函数做下转换,转换成C#的类型。比如,将"varchar"转为"string"。

 

select * from sys.types order by name可以获取全部SQL的类型。

 

自动生成参数化的SELECT,INSERT,UPDATE等语句也可以用类似的方法获取字段名,然后参数就在字段名前加@符号,同样也可以依次拼装Parameters.AddWith("@字段名",....)语句。喜欢继续用SqlHelper的同学也可以生成参数列表。当然实际操作中还要考虑字段名的空格、保留字等因素。比如可以约定SQL字段的空格转换到C#变量的时候就用下划线代替,字段都用方括号引起来。

 

存储过程稍复杂点。首先当然根据存储过程名获取参数了。

select parameter_name,DATA_TYPE,PARAMETER_MODE,CHAR_LENGTH = isnull(CHARACTER_MAXIMUM_LENGTH,0)
from INFORMATION_SCHEMA.PARAMETERS
where specific_name='存储过程名' and Parameter_name <> ''

我们需要另外一套转换机制,从SQL类型转换到SqlDbType.XXX。比如,SQL类型是char(20),那么对应的C#有可能就是cmd.Parameters.Add("@参数名",SqlDbType.Char,20);。如果SQL类型是int型的,那就可以不需要考虑长度了。另外就是该参数的方向,并且体现在ParameterDirection上。

 

至于获取全部数据库常用对象,比如表、视图、存储过程、标量函数、表值函数等,可以用select * from sys.objects where type = 'U' and is_ms_shipped = 0 order by [name]语句。注意这里的 type,等于U是表,等于V就是视图,等于P是存储过程,等于FN是标量函数,等于TF就是表函数。

 

做到更好一点的话还可以考虑对DataSet的支持。

 

 

原创粉丝点击