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

数据库抽象

starIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

1.00/5 (3投票s)

2007年8月10日

3分钟阅读

viewsIcon

25694

downloadIcon

347

使用工厂设计模式进行数据库抽象。

简化数据库抽象

人们可能会认为,在当今世界,数据库抽象应该是一个完全解决的问题,大多数(如果不是全部)平台都有适当的通用方法。 但是,当我当时所在的公司决定将我们的 Web 环境从 PHP 切换到 .NET 时,我发现事实并非如此——考虑到公司开发环境的性质,他们有许多充分的理由这样做。

我尝试的第一个 .NET 数据库抽象库是由该公司聘用的一位新的“.NET 专家”编写的,事实证明这是一个笨拙但功能强大的解决方案。 为了寻找更好的东西,我尝试了 Microsoft 企业库中的数据库库。 虽然这个解决方案在许多方面都比我们的内部库好得多,但它做了一些不适用于我们环境的假设,而且我觉得它需要最终程序员直接管理和操作太多的对象(我只是想访问我的数据)!

所以我决定着手编写我希望成为更好的数据库抽象解决方案,该解决方案在小型项目和大型公司系统中都能很好地工作。 我对我的库有以下目标

  • 它必须提供快速简便地访问任意数量的数据库服务器。
  • 同一个库必须能够与同一应用程序中的许多不同的数据源一起使用,所有数据源都使用相同的语法和约定(即使底层连接基于破坏 Microsoft 约定的数据提供程序,例如,要求参数名称使用 ? 前缀字符)。
  • 允许从应用程序内部以及配置文件级别快速轻松地设置查询日志记录。
  • 定义方法和属性,以简化最终程序员的数据访问和操作,方便使用。
  • 尽可能基于 ADO.NET 语法和约定,以减少学习曲线。

Using the Code

使用此库(特别是与 XML 配置文件结合使用)是一个相当简单的过程。 与本文一致,我将展示以下内容:创建数据库连接,插入记录,检索自动 ID 号,以及从表中查询数据。

本文附带一个示例应用程序,可让您更多地使用该库。 第一步:创建连接。 使用配置文件,您只需命名要连接的连接,在本例中,MainDatabaseServer 是我们感兴趣的连接

//MainDatabaseServer is defined with in the configuration file
DBCommon Connection = DBProvider.Connect("MainDatabaseServer");

接下来,将数据插入到具有以下模式的表中

CREATE TABLE Accounts(
    AccountNumber BIGINT IDENTITY( 1, 1 ) PRIMARY KEY,
    FirstName VARCHAR(50) NOT NULL,
    LastName VARCHAR(50) NOT NULL,
    AccountBalance MONEY NOT NULL,
    Street VARCHAR(128),
    ..... 
    //whatever else you might need
    );

//Function params used are: ( paramName, sourceColumn, paramValue )
Connection.Parameters.Add("@fname", "FirstName", "John");
Connection.Parameters.Add("@lname", "LastName", "Doe");
Connection.Parameters.Add("@bal", "AccountBalance", 160.00);
....//more params
Commmection.ExecuteAutoInsert("Accounts");

现在我将展示如何访问自动生成的主键

long AccountNumber = ((long)Connection.LastAutoID;

最后,这展示了最终程序员如何使用 AutoSelect 功能快速访问数据

//Parameters used in this case: ( paramName, sourceColumn, paramValue, 
    isSearchKey )
Connection.Parameters.Add("@acctNum", "AccountNumber", 123, true);
DataTable Account = Connection.ExecuteAutoSelect("Accounts");

//Finally close the connection
Connection.Disconnect();

好吧,这些是该库的非常基本的功能。 我当然希望其他人会发现这个库有用和/或有趣。 如果您有任何意见/建议,请随时给我发送电子邮件,或在下面的论坛上发表消息——我完全赞成进行修改以改进这个库。

© . All rights reserved.