Enterprise Library6.0之数据访问模块
The Data Access Application(数据访问模块)
适用场景
一般用于解决多种数据库类型之间的访问,同时适合统一面向多种数据库的开发
优点
- 既可以使用静态对象创建数据库对象,也可以使用非静态对象创建数据库,灵活
- 对于数据库的连接会自动管理,不需要开发者进行手动管理,资源释放的灵活
- 提供对SQLServer、Oralce和SQLServer精简版的支持,同时可以扩展,对于Mysql和SQlite等其他数据库支持社区中已经有了,可以参考扩展
- 提供多种执行返回类型,如存储过程,事务,返回XML化,异步访问数据库
数据操作所支持的数据访问块功能
|
功能 |
方法 |
|
1.查询填充DataSet 2.从DataSet更新数据库 |
ExecuteDataSet():执行查询并返回一个数据集 LoadDataSet():填充现有的DataSet UpdateDataSet():从DataSet更新到数据库 |
|
读取多个数据行 |
ExecuteReader():提供一个独立DBDataReader实例可供读取多行数据 |
|
执行命令返回执行影响行数 |
ExecuteNonQuery():执行命令返回影响的行数 ExecuteScalar():执行并返回一个值 |
|
检索数据作为对象序列 |
ExecuteSprocAccessor():客户端的查询对象的序列由存储过程选择放回数据 ExecuteSqlStringAccessor():客户端的查询对象的序列通过SQL语句选择的返回数据 |
|
检索XML数据 |
ExecuteXmlReader():返回数据作为一个XMLReader |
|
创建获取命令对象 |
GetStoredProcCommond():执行存储过程的对象 GetSqlStringCommand():返回执行一个SQL语句命令对象 |
|
带命令行参数的工作 |
AddInParameter():创建一个新输入参数且添加到参数集合 AddOutParameter():创建一个新输出参数且添加到参数集合 AddParameter():创建一个新参数且添加到参数集合 GetParamterValue():返回一个为Object类型指定参数值 SetParamterVlaue():设置指定参数的值 |
应用数据访问步骤
1) 引用组件到你的项目中:除了必选组件,其他都是可选
Microsoft.Practies.EnterpriseLibrary.Common.dll(必选组件)
Microsoft.Practies.EnterpriseLibrary.Data(必选组件)
System.Data.Common(.net组件)
Microsoft.Practies.Unity.dll
2) 在配置文件中配置数据访问模块进行访问,如图

3) 创建Database 对象,用以创建不同数据库对象
Constr为数据库连接字符串在配置文件中的名称
通过静态对象工厂创建的:
Database db = DatabaseFactory.CreateDatabase(ConStr);
通过非静态对象创建:
//创建数据提供者工厂实例
DatabaseProviderFactory factory = new DatabaseProviderFactory();
//根据工厂实例对象创建默认的数据库
Database defaultDb = factory.CreateDefault();
//根据工厂实例对象创建指定名称的数据库
Database namedDb = factory.Create(Constr);
4) 创建DbCommand对象用于执行相应的指令
Strsql为执行的SQL脚本,strStoredName为存储过程名称
DbCommand cmd = db.GetSqlStringCommand(strsql);
DbCommand cmd = db.GetStoredProcCommand(strStoredName);
5) 执行DbCommand得到不同的结果集
l 返回多行查询结果
该方法将不会立刻关闭数据库连接,可以通过CommandBehavior对象读取CloseConnection
using (IDataReader reader = db.ExecuteReader(cmd))
{//若不需要返回多行以下就不需要执行
//当查询返回多行,将一行一行进行读取,并做操作
while (reader.Read()){
for (int i = 0; i < reader.FieldCount; i++){
//分别获取列名和值
string fieldname = reader.GetName(i);
string fieldvalue = reader[i].ToString();
//可以进行其他的操作}}
}
l 返回影响的行数,可以执行Insert、Delete、Update和Seclet等
int line= db.ExecuteNonQuery(cmd);
int line = db.ExecuteNonQuery(System.Data.CommandType.Text, strsql);
l 返回DataSet数据集或DataTable表,执行更新操作
执行以下操作,是会自动关闭连接,不需要我们去管理数据库的连接
DataSet ds= db.ExecuteDataSet(cmd);
DataTable dt= db.ExecuteDataSet(cmd).Tables[0];
还可以使用LoadDataSet方法加载数据到指定的数据集:
DataSet ds = new DataSet();
db.LoadDataSet(cmd, ds, "测试表");
使用UpdateDataSet方法更新数据集到数据库中:
//将要更新到数据库的数据集,一般应该有数据
DataSet ds=new DataSet();
DbCommand insertcmd=db.GetSqlStringCommand(strsql);
DbCommand updatecmd=db.GetSqlStringCommand(strsql);
DbCommand deletecmd=db.GetSqlStringCommand(strsql);
int rowsline = db.UpdateDataSet(ds, "表名称", insertcmd, updatecmd, deletecmd, UpdateBehavior.Standard);
l 返回查询的一条记录
//返回object对象,业务需要可以转换类型
object obj = db.ExecuteScalar(cmd);
l 返回数据对象化

假设Product是已经存在一个实体对象类型
var reader = db.ExecuteSprocAccessor<Product>("存储过程名或sql语句","可选参数集合");
l 异步访问数据库对象
使用传统的Begin和End异步模式进行读取数据内容:
db.BeginExecuteReader(cmd, asynResult =>{
try {using (IDataReader reader = db.EndExecuteReader(asynResult)){
//进行处理}}
catch(Exception ex){//进行异常处理}},null);
使用任务异步模式进行读取数据内容:
protected async Task DoRead(string strsql){
DbCommand cmd = db.GetSqlStringCommand(strsql);
using (var reader = await Task<IDataReader>.Factory.FromAsync<DbCommand>(db.BeginExecuteReader, db.EndExecuteReader, cmd, null)){//处理操作}
}
l 使用事务回流:
//该方法可以创建一个已经实例化的数据库对象的连接
using (DbConnection conn = db.CreateConnection())
{conn.Open();
DbTransaction trans = conn.BeginTransaction();
try{db.ExecuteNonQuery(cmd,trans);
//如果执行成功,则进行提交
trans.Commit();}
catch{//如果执行异常,则进行回滚
trans.Rollback();}
}

浙公网安备 33010602011771号