65.9K
CodeProject 正在变化。 阅读更多。
Home

JohnKenedy 数据访问层库

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.42/5 (12投票s)

2008 年 7 月 11 日

GPL3

7分钟阅读

viewsIcon

53536

downloadIcon

1150

这是一个.NET 3.5库,充当数据访问层,具有许多自动功能

引言

JohnKenedy 库是一个.NET 3.5库。该库是使用ADO.NET创建多层数据库应用程序的一种替代方法,并最大程度地减少了.NET创建的数据访问的依赖性。

文件包含两个项目

  • JohnKenedy.DataAccess (主库)
  • JohnKenedy.DataAccessModule (Windows应用程序)

主要特点

  1. 通过使用名为DataAccessLayer的单个包装器类,可以轻松创建不同的数据库连接(MySQL,Microsoft SQL Server,Oracle以及使用Oledb的一个),该类可以适应不同的连接类型,命令类型,适配器类型等。
  2. 在需要时自动读取表信息架构并将其存储在内存中,以防止读取冗余。此信息由DataAccessTableDefinition准备,可以存储在ASP.NET会话中,或在基于Windows的应用程序中用作单个实例。
  3. 表架构用于自动化功能(DataAccessTableManagerDataAccessTableDefinitionDataAccessTableFiller)。
    功能包括:
    • 自动为所有表创建T-SQL命令
    • 包含标识列的表的T-SQL命令可以进行调整以适应它们,并轻松检索数据库生成的标识值
    • 包含非空列的表的T-SQL命令可以进行调整,以便当程序员未为非空列填写值时,库可以自动为这些列填写默认值
    • 包含string的表的T-SQL命令,如果string值超过最大字符长度,库将截断该值。
    • 包含固定stringchar/varchar)的表的T-SQL命令,库将调整值长度以满足所需长度。
  4. 为从该库执行的每个SQL语句(Insert/Update/Delete)生成审计跟踪,审计跟踪可以与登录用户关联,可以存储在文本文件,数据库表或两者中。该工作由DataAccessAudit类完成。
  5. 可以生成类以简化用户(仅是包装器)在访问表中的数据时。JohnKenedy.DataAccessModule Windows应用程序是代码生成器。
  6. 用户可以创建自己的扩展模块或库,并将其放在JohnKenedy.DataAccessModule Windows应用程序的Plugin文件夹中。Plugin包含继承自ModuleExtendDefinition类的DLL文件。Plugin在生成代码时添加新方法。程序员通常有自己的数据库模型(多个表相互关联以实现某项功能),并且该模型经常被程序员创建的各种项目使用,例如在数据库中存储发票时,会有标题和详细信息表,程序员可以为此目的编写新的Plugin,例如命名为HeaderDetail.dll并放在Plugin文件夹中,在生成代码时,程序员指定一个表为Header,另一个表为DetailHeaderDetail被称为Role。程序员常常发现自己重复创建以前创建过的模型,例如存储历史信息的数据库模型,如用户数据,可以更改用户名,地址等。程序员实际上可以编写一个新的Plugin来生成检索当前数据(姓名,地址等)的代码,以及检索按日期排序的数据的代码,例如,过去(更改前)的用户姓名。

概念

1.JPG

JohnKenedy.DataAccessModule可以生成直接从用户界面用于数据操作的实体类,或者可以由用户创建的业务对象包装。JohnKenedy.DataAccess是实体类直接调用的主库,也可以直接从业务对象调用。JohnKenedy.DataAccess中完成的所有关键操作都会被记录为审计跟踪并存储在数据库中。审计过程对程序员是隐藏的。

JohnKenedy.DataAccessModule可以为不同的类生成不同的代码。场景是,用户从JohnKenedy.DataAccessModule中显示的模块列表中选择一个模块,该模块将显示一个角色列表,对于每个角色,用户必须输入一个表名。所有这些角色都用于选定的模块。模块是一个利用一个或多个表来执行特定任务的小型系统。

JohnKenedy.DataAccessModule为每个表生成两个类:Entity类和EntityCollection类。代码会根据表在不同模块中所扮演的角色进行调整,因为两个或多个模块可以使用同一个表,所以每个表在不同的模块中可以扮演不同的角色。

程序员可以根据每次编写应用程序时遇到的模块事件来编写自己的模块。JohnKenedy.DataAccessModule生成的代码在JohnKenedy.DataAccess准备的方法中得到充分利用。

DataAccessTableFiller是一个执行所有Insert/Update/Delete方法的类。由于该类拥有一个存储表信息的DataAccessTableDefinition对象的实例,因此DataAccessTableFiller(我们以后称之为filler)使用这些信息来创建上面描述的自动化T-SQL命令。用户获取filler对象的新实例,然后将列值添加到filler类中。然后,用户只需调用以GetInsertGetUpdate…或GetDelete…语句开头的方法,这些方法会自动创建具有已设置的CommandTextParametersCommandType属性的IDbCommand对象。

背景

我常常觉得我在一遍又一遍地重建相同的数据库模型并一遍又一遍地为它编写代码。这就是为什么我认为应该有一种方法可以创建一个工具来列出我们创建过的所有数据库模型,然后工具可以为我们生成相同的代码。

Using the Code

要使用代码,您应该阅读完整的文档。简而言之,这是我们使用该库的方法。

初始化

using JohnKenedy.DataAccess;

DataAccessLayer _dal = null;
protected void Page_Load(object sender, EventArgs e)
{
    _dal = new DataAccessLayer(SqlServerType.MSSQL, 
    System.Configuration.ConfigurationManager.
            ConnectionStrings["connection"].ConnectionString);
        
    if (DataAccessLayer.Manager == null) 
	DataAccessLayer.Manager = _dal.GetDataAccessTableManager();
    else DataAccessLayer.Manager.DALLayer = _dal;
        
    if (DataAccessLayer.Audit == null) 
        DataAccessLayer.Audit = _dal.GetAudit();
}        

您可以看到创建了一个DataAccessLayer对象,这是该库的主要对象。通过传递两个参数来创建对象,第一个是一个枚举,用于指定数据库类型,第二个是连接字符串,在本例中是从web.config中检索的。

稍后您将看到,我们检查DataAccessLayer.Manager是否为null,这个Manager属性是DataAccessTableManager类的一个实例。该对象用于存储表定义集合或DataAccessTableDefinition的实例。我们检查它是否为null,当我们回溯代码时,代码会自动检查会话名称。此会话用于存储之前创建的任何DataAccessTableManager对象。如果会话包含之前的对象,则使用之前的对象,这样就可以最大限度地减少库查询数据库以检查表架构的次数。如果不是,那么我们需要创建一个并将其存储在Manager属性中,库会自动将其存储到会话中。

此会话行为也适用于DataAccessLayer.Audit属性。此属性是DataAccessAudit类的一个对象。该对象用于在数据库表或文件中记录审计跟踪。要修改Audit的默认设置,请检查DataAccessStringAndDefault.GetDefaultAudit()属性。

插入/更新/删除操作

假设我们有一个如下所示的表

7.JPG

JohnKenedy库使用户能够向该表插入、更新和删除数据,而无需创建任何SQL命令。SQL命令将由库自动生成,它具有介绍部分中所述的几项自动化功能。

_dal.OpenConnection();
DataAccessTableFiller _filler = DataAccessLayer.Manager["MFood"].GetFiller();
_Filler.AddColumnValue("Name", "Chicken Soup");
_Filler.AddColumnValue("Price", 1000);
_Filler.AddDefaultColumnValueForOtherNotNullableColumn();
IDbCommand _command = _filler.GetInsertStatementFilterIdentity();
long _value2 =
    DataAccessLayer.Manager["MFood"].
    ExecuteNonQueryInsertIdentityValueFromCommand(_command);
_dal.CloseConnection(); 

_value2将包含NoFood的标识值。如果Name的长度超过50个字符,文本将在插入之前截断为50个字符的长度,以防止错误。尽管我们没有为Status提供值,但库将自动为Status列添加默认值,int的默认值是0,这就是代码不会出错的原因。截断和自动添加默认值将被记录在审计跟踪中。请阅读准备审计跟踪部分以准备完整文档(JohnKenedy DAL.pdf)中的库的审计跟踪。

上面的示例直接使用了DataAccess,实际上程序员可以使用JohnKenedy.DataAccessModule工具来生成实体类和实体集合代码。使用实体类和实体集合类的代码如下所示。

假设我们有从JohnKenedy.DataAccessModule生成的MFood.csMFoodCollection.cs

MFood _food = new MFood();
_food.Filler.AddColumnValue("Name", "Chicken Soup");
_food.Filler.AddColumnValue("Price", 1000);
_food.Filler.AddDefaultColumnValueForOtherNotNullableColumn();
long _value2 = _food.InsertIdentity();

关注点

请随意使用此库。如有错误或建议,请告知我。谢谢。

历史

  • 2008年7月10日:这是该应用程序的第一个版本。
    如果库有任何更改,我将更新本文。
© . All rights reserved.