如何使用 UDLA 框架执行与数据库无关的数据绑定






3.80/5 (5投票s)
如何使用 UDLA(通用数据库层访问)执行与数据库无关的数据绑定
引言
在本文中,我们将介绍如何使用UDLA框架进行数据访问。在实际操作中,我们将演示如何从数据库中获取数据,以及如何执行简单的查询来插入、更新或删除行。

背景
当我们构建一个软件应用程序时,首先通常会设计数据库。这是应用程序的底层。之后,我们会编写所有其他层,直到用户界面层。大多数开发都基于数据库的选择。实际上,很多情况下是这样的。大多数程序员会固定一个数据库类型(例如,Microsoft Access、SQL Server、Postgres、Oracle、MySql等),并基于此选择开发所有应用程序。这意味着我们**不能**在之后更改数据库类型,并且在新的项目中**不能重用**大部分代码(如果我们使用不同的数据库类型)。确实有很多O/R映射器和代码生成器为我们编写代码,使构建和重建数据库访问层变得容易。在此背景下,UDLA框架试图采用一种不同的方法。使用UDLA,您无需关心您正在使用什么数据库,因为它提供了统一的数据库访问标准。UDLA的缩写是Uniformed Database Layer Access,强调了这一特性。UDLA框架在底层工作,管理连接、数据获取和命令执行。所有数据库元素都由称为“实体”的对象映射。例如,我们有一个用于select
语句的SelectEntity
,或用于update
命令的UpdateEntity
……所有这些对象都是自执行的:select
实体会自行执行并返回结果。这样,我们就无需编写更多SQL查询。SQL查询可能因数据库而异,且无法重用。然而,这些实体不依赖于数据库,我们也不需要数据库特定的SQL。
Using the Code
在本节中,我们将简要介绍如何使用UDLA框架。我们将列出UDLA框架所有最重要的功能。首先,我们关注数据获取。我们将使用SQL语句从NorthWind
数据库的product
表中检索价格大于5美元的所有产品。使用ADO,我们应该编写SQL语句,用正确的参数值填充它,并使用某个对象(DataReader
或DataAdapter
)来获取数据。事实上,SQL语句的语法可能因数据库而异,例如字段名或string
的定界符可能不同。使用这个库,我们不需要显式任何SQL语句。每个查询都由一个名为“Entity
”的类的实例表示。例如,一个select
查询映射到一个SelectEntity
对象。我们添加所有需要的字段(如果未指定,则选择所有字段),指定用于数据截断和数据过滤的所有约束,以及一些排序子句。当这个对象填满后,我们将其传递给DatabaseManager
对象执行。DatabaseManager
是数据库无关的:配置它时,我们可以指定要使用的数据库类型和连接字符串。因此,执行此select
所需做的就是调用DatabaseManager
的static
方法。
//Fetch Data and Fill Table
SelectEntity selectData = new SelectEntity();
selectData.Table.Name = "Products";
selectData.WhereClauses.AddFilter("UnitPrice",
this.numericUpDown1.Value, SqlComparers.EqualMoreThan);
this.dataGridView1.DataSource = dataManager.ReadDataTable(selectData);
DatabaseManager
对象负责管理连接。
因此,我们可以列出此框架中的所有实体:
SelectEntity
InsertEntity
DeleteEntity
UpdateEntity
这些其他对象的使用方式类似于selectEntity
示例。在上面的代码的最后几行中,我们解释了命令和查询的所有用法,但没有提及DatabaseManager
对象。这是因为该类的使用非常简单。DatabaseManager
是一个**执行**数据库操作的类。我们唯一需要做的是在应用程序启动时初始化它。我们只需要提供几个包含数据库和连接信息的对象。一个重要的注意事项是,这个初始化是应用程序中唯一可能因数据库而异的部分。对于每种已知的数据库类型,都有一个名为XXXConnectionInfoEntity的对象,其中XXX代表数据库名称。例如,如果您使用Microsoft Access数据库,您将创建一个新的MSAccessConnectionInfoEntity
。所有这些类都继承了IconnectionInfoEntity
接口,并实现了统一数据库访问的方法。DatabaseManager
包含一个跟踪连接的对象,一个允许数据获取的对象,以及一个用于命令执行的对象。对于每种数据库类型,都存在一个继承共享接口的对象。换句话说,ConnectionInfoEntity
提供了有关所选数据库的信息。因此,您可以轻松地在不同数据库之间切换。您也可以在不同的数据库之间共享相同的查询。
关注点
使用UDLA,您可以:
- 执行数据获取和任何类型的命令。
- 在所有项目中采用相同的方法。
- 为不同数据库重用相同的代码。
- 将
DatabaseLayer
与应用程序解耦。