认识DataQuicker(ORM)之三 Provider数据访问者
(过时,请在我的Blog上参看最新文档)本文介绍了DataQuicker数据操作的核心部分Provider,Provider其实可以看作一个Wrapper,它包括了ITransaction、IDbCommand、IDbConnection等数据库相关的接口,它是抽象类,继承于MarshalByRefObject。不同的Provider派生类提供对不同数据库的访问和操作,比如SqlProvider用于MSSQL、JetProvider用于Access、用于其他数据库的Provider…
Provider是一个数据库操作的Wrapper, 实质上它包括了连接、事务、执行等常用的数据库操作,以下是Provider的相关UML类图(在该图中,JetProvider还没有实现),
根据这张UML图我们来熟悉Provider包含的各部分操作
配置
所有的Provider都需要在DataQuicker.config中配置,
<Providers>
--
Name="Provider的唯一名称" (必须)
Value="数据库的连接字符串,对于MSSQL,则为SqlConnection的连接字符串" (必须)
Type="Provider的类型字符串,比如DataQuicker.Framework.SqlProvider" (必须)
OLEConnectionString="OleConnection的连接字符串,DataQuicker使用OLE获取数据库的Schema" (必须)
-->
<Provider Name="" Value="" Type="" OLEConnectionString=""/>
Providers>
在进行了上述配置后,才能在系统中构造相应的Provider,比如
SqlProvider provider = new SqlProvider(“ProviderName”); //以Provider的唯一名称来构造相应的Provider
这样,在每次构造Provider时,都需要带入ProviderName参数,会比较麻烦,我们可以在config中配置一个Provider类型默认的值,如下,
<ProviderDefaultName2Types>
--
Name="Provider的唯一名称,该Provider必须在Providers节中已经配置" (必须)
Type="Provider的类型,在所有的ProviderDefaultName2Type节点中,该类型必须唯一" (必须)
-->
<ProviderDefaultName2Type Name="DB1" Type="DataQuicker.Framework.SqlProvider">ProviderDefaultName2Type>
ProviderDefaultName2Types>
通过这样的配置,我们就可以忽略参数来表示构造一个DB1的Provider,如下
SqlProvider provider = new SqlProvider();
等同于
SqlProvider provider = new SqlProvider(“DB
数据库连接相关方法
public bool AutoCloseConnection
设置/获取 在每次Provider的操作执行后,DataQuicker是否自动立即关闭连接,当Connection连接已经打开时,不能设置该值
public ConnectionState ConnectionState
获取 Connection的连接状态
public string ConnectionString
获取 数据库连接字符串
public void Open()
打开数据库连接,该方法内会自动判断数据库连接是否已经打开,如果已经打开,则不会进行打开操作或抛错,否则打开数据库连接。注,在一般情况,不需要手动Open数据库连接,在DataQuicker执行中会自动去Open
public void Close()
关闭数据库连接,该方法内会自动判断数据库连接是否已经关闭,如果已经关闭,则不会进行打开操作或抛错,否则关闭数据库连接,如果此时有Transaction事务尚未提交,在关闭之前DataQuicker会默认Commit事务。如果AutoCloseConnection为false,则需要手动Close数据库连接
事务
public bool IsTrans
获取 是否存在事务
public void BeginTrans()
开始事务,事务等级为ADO.NET默认等级。在BeginTrans时,DataQuicker会自动Open数据库连接,并且置AutoCloseConnection为false,凡是BeginTrans的Provider需要手动调用Commit或者Rollback
public void BeginTrans(IsolationLevel il)
同上,手动设定事务等级
public void Commit()
提交事务,在该方法中,DataQuicker会自动Close数据库连接,所以不需要我们手动再去关闭
public void Rollback()
回滚事务,在该方法中,DataQuicker会自动Close数据库连接,所以不需要我们手动再去关闭
数据库操作
public IDataParameter CreateParameter()
根据Provider拥有的特定的IDbCommand创建一个IDataParameter对象
public virtual void Update(TableMapping entity)
更新实体entity
public virtual void Insert(TableMapping entity)
插入实体,插入成功后,实体的PrimaryKey会自动被填充(当PrimaryKey为自增长类型或者由DataQuicker管理类型时),实体被标记为Exist
public virtual void Delete(TableMapping entity)
删除实体对象
public virtual void DeleteByQuery(TableMapping entity)
根据在实体上设置的查询条件生成批量删除SQL语句进行批量删除,该方法很危险,如果当没有设定任何条件时调用该方法会导致数据表被清空,不推荐使用。
public virtual DataTable Select(EntityMapping entity)
public virtual DataTable Select(EntityMapping entity, FieldMapping[] selectFields)
public virtual DataTable Select(EntityMapping entity, FieldMapping[] selectFields, bool distinct)
public virtual DataTable Select(EntityMapping entity, FieldMapping[] selectFields, bool distinct, int topRows
public virtual DataTable Select(EntityMapping entity, bool distinct, int topRows)
根据在实体上设置的查询条件查询出DataTable数据集。注,DataQuicker并没有实现完全的对象模型,查询的结果是.NET内置对象DataTable
public virtual void LoadObject(EntityMapping entity)
根据在实体上设定的PrimaryKey值加载对象
public virtual void LoadObject(EntityMapping entity, bool byPrimaryKey)
当byPrimaryKey为false时,根据在实体上设定的所有值来加载对象,当结果记录唯一时,则加载记录到实体上;当结果记录为空时,则标记实体不存在;否则,DataQuicker会抛出异常。
代码示例
(假定我们已配置好DataQuicker)
(1)插入记录
Employees employee = Employees.CreateInstrance();
employee.LastName += "Jian";
employee.FirstName += "Liu";
employee.Title += "Software Engineer";
employee.TitleOfCourtesy += "Mr.";
employee.BirthDate += new DateTime(1982, 2, 7);
employee.HireDate += new DateTime(2005, 6, 28);
new SqlProvider().Insert(employee);
//在一般情况下,不需要我们手动管理数据库连接,在插入数据前,DataQuicker会自动打开连接,在插入数据后,DataQuicker会自动断开
(2)更新Orders表,Employees、Customers和Orders的关系参考Northwind数据库
Employees employee = Employees.CreateInstrance(5);
Customers customer = Customers.CreateInstrance("HANAR");
Orders order = Orders.CreateInstrance(10248);
order.Employees = employee;
order.Customers = customer;
new SqlProvider().Update(order);
(3)多实体事务
//我们需要先插入一条Employee记录,再更新Orders表
Employees employee = Employees.CreateInstrance();
employee.LastName += "Jian";
employee.FirstName += "Liu";
Orders order = Orders.CreateInstrance(10248);
order.Employees = employee;
SqlProvider provider = new SqlProvider();
provider.BeginTrans(); //开启事务,之后我们需要手动提交/回滚事务
try
{
provider.Insert(employee);
// 实际上,我们也可以在插入employee后在设置order相关的employee,如下
// Orders order = Orders.CreateInstrance(10248);
// order.Employees = employee;
provider.Update(order);
}
finally
{
provider.Commit();
}
更多实例,请参考即将发布的DataQuicker第一版中的NUnit项目,版本号

浙公网安备 33010602011771号