EntLib 3.1学习笔记(2) : Data Access Application Block


 

简化实现通用数据访问功能的开发任务。应用程序可以在很多情况下使用应用程序块,例如读取显示数据、获得通过应用程序层的数据,以及将更改过的数据提交回数据库系统等。应用程序块包括对存储过程和内嵌 SQL 以及常见内务处理任务(例如,管理连接、创建与缓存封装在应用程序块的方法中的参数)的支持。换句话说,数据访问应用程序块提供对最常用的 ADO.NET 功能的访问。

1. 解决的问题:
(1) 它可以减少编写样本代码以执行标准任务的需要。 
(2) 它有助于在应用程序和整个企业中维护一致的数据访问做法。 
(3) 它可以降低更改物理数据库目标的难度。
(4) 它使开发人员免于学习不同类型数据库的不同编程模型。 
(5) 将应用程序移植到不同类型的数据库时,它可以减少需要重新编写的代码数量。

2. 使用:
(1) 使用Enterprise Library Configuration打开应用程序配置文件。
(2) 添加引用:Microsoft.Practices.EnterpriseLibrary.Data.dll
    using Microsoft.Practices.EnterpriseLibrary.Data;
(3) 创建数据库连接操作类:

   Database db  =  DatabaseFactory.CreateDatabase( " NorthWind " );

(4) 执行SQL语句:

    DataSet ds  =  db.ExecuteDataSet(CommandType.Text,commandText);
    DataReader dr 
=  db.ExecuteReader(CommandType.Text,commandText); 用完后记得要dr.Close();
    
object  result  =  db.ExecuteScalar(CommandType.Text,commandText);
    
// 或者
    DbCommand dbCommand  =  db.GetSqlStringCommand(commandText);
    
object  result  =  db.Execute * (dbCommand);

(5) 执行存储过程:

    DbCommand dbCommand  =  db.GetStoredProcCommand(storeProcName);
    db.AddInParameter(dbCommand, 
" inParam " , DbType.Int32, Category); // 注意这里和下面不用加@,DAAB会自动加。
    db.AddOutParameter(dbCommand,  " outParam " , DbType.Int32, Category);
    
object  result  =  db.Execute * (dbCommand);
    
object  outValue  =  db.GetParameterValue(dbCommand,  " outParam " );

(6) 更新DataSet:

    DbCommand insertCommand  =  db.GetStoredProcCommand( " AddCommand " ); // 可以再添加处理参数,下同
    DbCommand deleteCommand  =  db.GetStoredProcCommand( " DeleteCommand " );
    DbCommand updateCommand 
=  db.GetStoredProcCommand( " UpdateCommand " );
    
int  rowsAffected  =  db.UpdateDataSet(dataSet,  " tableName " , insertCommand, updateCommand,
 deleteCommand, UpdateBehavior.Standard);

(7) 处理事务:

public   bool  Transfer( int  transactionAmount,  int  sourceAccount,  int  destinationAccount)
ExpandedBlockStart.gifContractedBlock.gif
{
     
bool result = false;
     Database db 
= DatabaseFactory.CreateDatabase();

     
string sqlCommand = "Command1";
     DbCommand creditCommand 
= db.GetStoredProcCommand(sqlCommand);

     sqlCommand 
= "Comand2";
     DbCommand debitCommand 
= db.GetStoredProcCommand(sqlCommand);

     
using (DbConnection connection = db.CreateConnection())
ExpandedSubBlockStart.gifContractedSubBlock.gif     
{
          connection.Open();
          DbTransaction transaction 
= connection.BeginTransaction();
          
try
ExpandedSubBlockStart.gifContractedSubBlock.gif          
{
               db.ExecuteNonQuery(creditCommand, transaction);
               db.ExecuteNonQuery(debitCommand, transaction);
               transaction.Commit();
               result 
= true;
          }

          
catch
ExpandedSubBlockStart.gifContractedSubBlock.gif          
{
               transaction.Rollback();
          }

          connection.Close();                
          
return result;
     }

}


   

3. Data Access Application Block 的设计:

4. 暂时还没有搞明白的地方:

DbCommand dbCommand  =  db.GetStoredProcCommand(commandTest / storeProcName, productID);
object  value  =  db.ExecuteScalar(dbCommand);

     Passing the productID value to the commandTest/storeProcName results in parameter discovery being used to correctly establish the parameter information for the productID. Subsequent calls to this method will cause the block to retrieve the parameter information from the cache, and not require rediscovery。
http://davidhayden.com/blog/dave/archive/2006/11/03/CachingStoredProcedureParameters.aspx
http://davidhayden.com/blog/dave/archive/2006/11/01/SqlCommandBuilderDeriveParameters.aspx
貌似是在说对参数进行缓存什么的,但不知道究竟有啥用?真的能提高性能?-_-


转载于:https://www.cnblogs.com/China-Dragon/archive/2009/03/08/1406299.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值