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中
<system.web> <compilation debug="true"> <buildProviders> <add extension=".dal" type="AnoopsDALGenerator.DalProvider"/> <buildProviders> </compilation> </system.web>这个意思是编译允许扩展名为.dal的文件添加到项目中。
- 在App_Code目录添加XML文件扩展名为".dal"
<dal> <connectionString> Data Source =XXXXX; Initial Catalog = XXXXX;User Id =XXXXX; Password=XXXXX </connectionString> <nameSpace>DAL1</nameSpace> </dal>在这个以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表,获取各个存储过程的参数信息
SELECT param.name AS [Name], ISNULL(baset.name, N'') AS [SystemType], CAST(CASE WHEN baset.name IN (N'char', N'varchar', N'binary', N'varbinary', N'nchar', N'nvarchar') THEN param.prec ELSE param.length END AS int) AS [Length], CAST(param.xprec AS int) AS [NumericPrecision], CAST(param.xscale AS int) AS [NumericScale], null AS [DefaultValue], CAST( CASE param.isoutparam WHEN 1 THEN param.isoutparam WHEN 0 THEN CASE param.name WHEN '' THEN 1 ELSE 0 END END AS bit) AS [IsOutputParameter] FROM dbo.sysobjects AS sp INNER JOIN sysusers AS ssp ON ssp.uid = sp.uid INNER JOIN syscolumns AS param ON (param.number = 1) AND (param.id=sp.id) LEFT OUTER JOIN systypes AS baset ON baset.xusertype = param.xtype and baset.xuserty pe = baset.xtype WHERE (sp.xtype = N'P' OR sp.xtype = N'RF')and(sp.id= ? and ssp.name=N'dbo') ORDER BY CAST(param.colid AS int) ASC
关注点
这个解决方案是一个演示如何使用 System.CodeDom的很好的示例。
翻译注:代码生成的文件是由代码工具根据database.dal自动生成的.cs文件,不要修改自动生成的代码。因为每次编译都会自动在临时目录中重新生成。例如:C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\dalexample\e75c96fd\7d12d038\Sources_App_Code\database1.dal.72cecc2a.cs。
对于数据库的操作必须由存储过程类完成,作者没有对生成sql语句的介绍。
转载请注明地址:http://dev.mjxy.cn/a-Data-Layer-automatically-generated-library.aspx
转载于:https://blog.51cto.com/mjxycn/617319