Data Access Layer Auto Generation Library
英文源文档 <http://www.codeproject.com/KB/aspnet/auto_generation_library.aspx>
翻译: 白水 引用请注明出处 <敏捷学院>
源代码下载:http://dev.mjxy.cn/a-Data-Layer-automatically-generated-library.aspx
介绍
数据访问层(DAL)几乎是所有体系中很重要的一部分。我遇到的一个难题就是为大型数据库创建DAL,而维持这些数据库的DAL简直就是另一个噩梦。因此我认为解决这个问题的办法就是自动生成DAL层。
代码使用
在ASP.NET项目中生成DAL代码参见以下步骤:
- 为项目添加DalProvider.dll引用,它是一个自动生成DAL的库。
- 添加下面的配置到web.config中
2 |
< compilation debug = "true" > |
4 |
< add extension = ".dal" type = "AnoopsDALGenerator.DalProvider" /> |
这个意思是编译允许扩展名为.dal的文件添加到项目中。
- 在App_Code目录添加XML文件扩展名为".dal"
3 |
Data Source =XXXXX; Initial Catalog = XXXXX;User Id =XXXXX; Password=XXXXX |
5 |
< nameSpace >DAL1</ nameSpace > |
在这个以dal为根标签的配置文件中,定义了链接数据的字符串,还有访问自动生成代码的命名空间。
- 编译你的ASP.NET项目。生成的DAL代码具有以下特点:
- 命名空间是 “DAL1”这个在XML文件中指定。
- 所有的表都会被生成为类,表中的列对应生成类的字段和属性,它们的名称是使用"Col"+列名来表示。这样使得用户可以创建表的对象
DAL1.TableName table1 = new DAL1.TableName();
tabel1.ColColumnName1 = "2";
table2.ColColumnName2 = "Trial";
Response.Write ("Data in column2:" + table2.ColColumnName2);
- 所有访问存储过程的方法都定义在 DataProcedure类中。因此,要访问一个存储过程只需要调用("Access"+存储过程名)的方法即可。
DAL2.DataProcedure dbObject = new DAL2.DataProcedure();
DataTable dataResult=new DataTable();
int returnStatus = dbObject.AccessStoredProcedureName(ref dataResult, "21", "Thomas", "Atlas", "ITDept");
if (returnStatus>
程序使用一个 datatable的对象传递给存储过程对应的方法来接收返回的数据。
代码
代码很多但是很简单。这个库的工作流程如下:
- 在编译过程中从XML文件提取连接字符串和命名空间
- 查询 systemobjects表和systemcolumns表,分别列出表和列。
--To extract the table information from database
Select * from sysobjects where type = 'u'
--To extract the column information with respect to the table
Select * from syscolumns根据表名称生成类,根据列名称生成成员变量
- 创建一个为DataProcedure的类来,以便保存调用存储过程对应的方法。
- 查询systemobjects表列出所有的存储过程
Select * from sysobjects where type = 'p' and category = 0
- 查询systemcolumns表,获取各个存储过程的参数信息
05 |
ISNULL (baset. name , N '' ) AS [SystemType], |
07 |
CAST ( CASE WHEN baset. name IN (N 'char' , N 'varchar' , N 'binary' , N 'varbinary' , |
09 |
N 'nchar' , N 'nvarchar' ) |
11 |
THEN param.prec ELSE param.length END AS int ) AS [Length], |
13 |
CAST (param.xprec AS int ) AS [NumericPrecision], |
15 |
CAST (param.xscale AS int ) AS [NumericScale], |
17 |
null AS [DefaultValue], |
21 |
CASE param.isoutparam WHEN 1 THEN param.isoutparam WHEN 0 THEN |
23 |
CASE param. name WHEN '' |
25 |
THEN 1 ELSE 0 END END AS bit ) AS [IsOutputParameter] |
31 |
INNER JOIN sysusers AS ssp ON ssp.uid = sp.uid |
33 |
INNER JOIN syscolumns AS param ON (param.number = 1) AND (param.id=sp.id) |
35 |
LEFT OUTER JOIN systypes AS baset ON baset.xusertype = |
37 |
param.xtype and baset.xuserty |
43 |
(sp.xtype = N 'P' OR sp.xtype = N 'RF' ) and (sp.id= ? and ssp. name =N 'dbo' ) |
47 |
CAST (param.colid AS int ) ASC |
更多内容参见:http://dev.mjxy.cn/a-Data-Layer-automatically-generated-library.aspx