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中

 

 

 <system.web>
     <compilation debug="true">
         <buildProviders>
            <add extension=".dal"    type="AnoopsDALGenerator.DalProvider"/>
         <buildProviders>
     </compilation>
 </system.web>
   这个意思是编译允许扩展名为.dal的文件添加到项目中。
  1. 在App_Code目录添加XML文件扩展名为".dal"
 
<dal>
  <connectionString>
     Data Source =XXXXX; Initial Catalog = XXXXX;User Id =XXXXX; Password=XXXXX
  </connectionString>
  <nameSpace>DAL1</nameSpace>
</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表,获取各个存储过程的参数信息

  

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