[翻译]数据层(DAL)自动生成

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代码参见以下步骤:

  1. 为项目添加DalProvider.dll引用,它是一个自动生成DAL的库。
  2. 添加下面的配置到web.config中

                 

 
1  <system.web>
2      <compilation debug="true">
3          <buildProviders>
4             <add extension=".dal"    type="AnoopsDALGenerator.DalProvider"/>
5          <buildProviders>
6      </compilation>
7  </system.web>

                 这个意思是编译允许扩展名为.dal的文件添加到项目中。

  1. 在App_Code目录添加XML文件扩展名为".dal"
 
1 <dal>
2   <connectionString>
3      Data Source =XXXXX; Initial Catalog = XXXXX;User Id =XXXXX; Password=XXXXX
4   </connectionString>
5   <nameSpace>DAL1</nameSpace>
6 </dal>

          在这个以dal为根标签的配置文件中,定义了链接数据的字符串,还有访问自动生成代码的命名空间。

  1. 编译你的ASP.NET项目。生成的DAL代码具有以下特点:
  2. 命名空间是 “DAL1”这个在XML文件中指定。
  3. 所有的表都会被生成为类,表中的列对应生成类的字段和属性,它们的名称是使用"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表,获取各个存储过程的参数信息

           

 
01 SELECT
02   
03 param.name AS [Name],
04   
05 ISNULL(baset.name, N'') AS [SystemType],
06   
07 CAST(CASE WHEN baset.name IN (N'char', N'varchar', N'binary', N'varbinary',
08   
09     N'nchar', N'nvarchar')
10   
11 THEN param.prec ELSE param.length END AS int) AS [Length],
12   
13 CAST(param.xprec AS int) AS [NumericPrecision],
14   
15 CAST(param.xscale AS int) AS [NumericScale],
16   
17 null AS [DefaultValue],
18   
19 CAST(
20   
21     CASE param.isoutparam WHEN 1 THEN param.isoutparam WHEN 0 THEN
22   
23        CASE param.name WHEN ''
24   
25 THEN 1 ELSE 0 END END AS bit) AS [IsOutputParameter]
26   
27 FROM
28   
29 dbo.sysobjects AS sp
30   
31 INNER JOIN sysusers AS ssp ON ssp.uid = sp.uid
32   
33 INNER JOIN syscolumns AS param ON (param.number = 1) AND (param.id=sp.id)
34   
35 LEFT OUTER JOIN systypes AS baset ON baset.xusertype =
36   
37     param.xtype and baset.xuserty
38   
39 pe = baset.xtype
40   
41 WHERE
42   
43  (sp.xtype = N'P' OR sp.xtype = N'RF')and(sp.id= ?  and ssp.name=N'dbo')
44   
45 ORDER BY
46   
47 CAST(param.colid AS int) ASC
  • 根据这些信息生成访问存储过程的对应的方法

更多内容参见:http://dev.mjxy.cn/a-Data-Layer-automatically-generated-library.aspx

posted @ 2011-07-19 17:38  敏捷学院  阅读(485)  评论(0编辑  收藏  举报