C#自动数据库代码生成的思路
2009-12-25 18:51
197 查看
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的支持。
其实大的思路很简单,获取数据库中的比较原子的对象,比如字段、参数等,并找出数据库各字段类型与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的支持。
相关文章推荐
- 使用xorm工具,根据数据库自动生成 go 代码
- tigercode是一款自动代码生产工具,支持springmvc+spring+mybatis或springmvc+spring+hibernate框架生成,数据库支持mysql ,oracle
- C#分析数据库结构,使用XSL模板自动生成代码
- C#分析数据库结构,使用XSL模板自动生成代码
- [导入]C#分析数据库结构,使用XSL模板自动生成代码
- C#生成安装文件后自动附加数据库的思路跟算法
- 使用CodeSmith根据数据库中的表自动生成WinUI界面(使用TableLayoutPanel布局)的代码.
- 自动生成与数据库交互代码
- C#分析数据库结构,使用XSL模板自动生成代码
- 基于数据库的自动化生成工具,自动生成JavaBean、数据库文档、框架代码等(v5.8.8版)
- C#分析数据库结构,使用XSL模板自动生成代码 - 清清月儿 .NET万花筒 Asp.net技术 Asp.net教程 Asp.net源码 Asp.net基础 Asp.net控件 Asp.net入门 - CSDNBlog
- Mybatis 自动生成代码,数据库postgresql
- C#生成安装文件后自动附加数据库的思路跟算法
- idea中使用Mybatis-generator自动生成数据库持久层代码
- C#分析数据库结构,使用XSL模板自动生成代码
- C#分析数据库结构,使用XSL模板自动生成代码
- 用vfp的数据库自动生成CursorAdapter类代码
- java自动生成数据库代码
- C#分析数据库结构,使用XSL模板自动生成代码
- 上传Excel数据到数据库中(Asp.net自动生成三层代码 第六集 )