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();}

}

posted @ 2017-12-12 20:22  Terrence_Sun  阅读(855)  评论(0)    收藏  举报