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) 创建数据库连接操作类:

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

(4) 执行SQL语句:

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

(5) 执行存储过程:

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

(6) 更新DataSet:

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

(7) 处理事务:

None.gif public   bool  Transfer( int  transactionAmount,  int  sourceAccount,  int  destinationAccount)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif     
bool result = false;
InBlock.gif     Database db 
= DatabaseFactory.CreateDatabase();
InBlock.gif
InBlock.gif     
string sqlCommand = "Command1";
InBlock.gif     DbCommand creditCommand 
= db.GetStoredProcCommand(sqlCommand);
InBlock.gif
InBlock.gif     sqlCommand 
= "Comand2";
InBlock.gif     DbCommand debitCommand 
= db.GetStoredProcCommand(sqlCommand);
InBlock.gif
InBlock.gif     
using (DbConnection connection = db.CreateConnection())
ExpandedSubBlockStart.gifContractedSubBlock.gif     
dot.gif{
InBlock.gif          connection.Open();
InBlock.gif          DbTransaction transaction 
= connection.BeginTransaction();
InBlock.gif          
try
ExpandedSubBlockStart.gifContractedSubBlock.gif          
dot.gif{
InBlock.gif               db.ExecuteNonQuery(creditCommand, transaction);
InBlock.gif               db.ExecuteNonQuery(debitCommand, transaction);
InBlock.gif               transaction.Commit();
InBlock.gif               result 
= true;
ExpandedSubBlockEnd.gif          }

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

InBlock.gif          connection.Close();                
InBlock.gif          
return result;
ExpandedSubBlockEnd.gif     }

ExpandedBlockEnd.gif}

None.gif
None.gif

   

3. Data Access Application Block 的设计:

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

None.gif DbCommand dbCommand  =  db.GetStoredProcCommand(commandTest / storeProcName, productID);
None.gif
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/happyhippy/archive/2007/08/08/848294.html

你可能感兴趣的:(EntLib 3.1学习笔记(2) : Data Access Application Block)