Enterprise Library for .NET Framework 2.0 – January 2006是微软最新发布的企业库,它支持最新的.NET Framework 2.0。它由一系列的企业应用程序块来构成:
1.Data Access Application Block
好处:
减少编写重复累赘代码去执行标准的任务。
帮助在应用程序内部和跨企业应用维护一致的数据访问实践。
降低改变物理数据目标的难度。
减轻开发人员学习不同数据库类型的不同编程模型。
当移植应用程序到不同数据库类型时,减少重写代码的数量。
ADO.NET2.0提供了诸如DbCommand、DbConnection这些类帮助抽象对特定数据库的访问实现,该程序块得益于这些类并提供了更好的封装,例如参数发现和数据类型转换。因此程序可以在不改变客户端代码的情况下从一种数据库类型转向为另一种类型
使用DAAB您只需要做如下工作:
1. 创建Database对象
2. 提供需要的参数
3. 调用适当的方法(这些方法都经过了一定的优化,保障了性能)
例程1.1调用存储过程
Database db = DatabaseFactory.CreateDatabase();
DbCommand dbCommand = db.GetStoredProcCommand("GetProductsByCategory");
// 检索分类ID为7的数据.
db.AddInParameter(dbCommand, "CategoryID", DbType.Int32, 7);
DataSet productDataSet = db.ExecuteDataSet(dbCommand);
使用场景
何时该使用DAAB?
该应用程序块是对ADO.NET2.0的补充,它允许你使用相同的数据访问代码来支持不同的数据库。目前虽然只提供SQLServer和Oracle的支持,不过你可以通过GenericDatabase和ADO.NET 2.0 DbProviderFactory对象来增加对其他数据库的支持
如果你想更方便的编写数据访问代码,并具有很好的移植性,DAAB是您很好的选择
何时该直接使用ADO.NET
DAAB是ADO.NET的有效补充,而不是取代它。如果你的程序需要以专门的方法来检索数据,或者使用特定数据库的某些特有功能时,ADO.NET将是你更好的选择
参数处理和参数发现
Database类有一系列的方法来向存储过程传递参数:
AddParameter. 传递参数给存储过程
AddInParameter. 传递输入参数给存储过程
AddOutParameter. 传递输出参数给存储过程
GetParameterValue. 得到指定参数的值
SetParameterValue. 设定参数值
当使用参数发现机制,你必须指定所有的参数值,并将输出参数值设为NULL
例程1.2
Database db = DatabaseFactory.CreateDatabase();
string sqlCommand = "UpdateProduct";
DbCommand dbCommand = db.GetStoredProcCommand(sqlCommand, 11, "Queso Cabrales", 4, 25);
当第一次使用该方法时,会从数据库中来获得参数结构类型,这些参数将被缓存下来,也就是说再次调用该方法时,不需要再次查询数据库获得参数结构类型。
常见操作
1. 使用DbDataReader检索数据
什么情况下使用?
您想快速显示一些只读的数据,并将这些数据绑定到web窗体,这些数据不需要缓存,使用后就可以丢弃掉。
例程1.3
Database db = DatabaseFactory.CreateDatabase();
using (IDataReader dataReader = db.ExecuteReader(CommandType.Text, "Select Name, Address, City From Customers" ))
{
customerGrid.DataSource = dataReader;
customerGrid.DataBind();
}
用法注意:
由于DataReader在使用时数据库连接是打开的,因此你必须在使用后尽早地关闭它。使用using语法保证它总是及时地释放。
2. 使用DataSet检索数据
什么情况下使用?
您想从多表或多数据源中获取数据
你想和其他程序或组件交换数据,例如WebService.
你想检索相关记录
你想执行XML操作,诸如将你的数据进行XSLT转换。
例程1.4
Database db = DatabaseFactory.CreateDatabase();
string sqlCommand = "GetProductsByCategory";
DbCommand dbCommand = db.GetStoredProcCommand(sqlCommand);
// Retrieve products from category 7.
int category = 7;
db.AddInParameter(dbCommand, "CategoryID", DbType.Int32, category);
DataSet productDataSet = db.ExecuteDataSet(dbCommand);
用法注意:
如果你想使用已有的DataSet对象,使用LoadDataSet方法
3.执行一个Command对象并取得输出参数
例程1.5
Database db = DatabaseFactory.CreateDatabase();
string sqlCommand = "GetProductDetails";
DbCommand dbCommand = db.GetStoredProcCommand(sqlCommand);
db.AddInParameter(dbCommand, "ProductID", DbType.Int32, 3);
db.AddOutParameter(dbCommand, "ProductName", DbType.String, 50);
db.AddOutParameter(dbCommand, "UnitPrice", DbType.Currency, 8);
db.ExecuteNonQuery(dbCommand);
string results = string.Format(CultureInfo.CurrentCulture, "{0}, {1}, {2:C} ",
db.GetParameterValue(dbCommand, "ProductID"),
db.GetParameterValue(dbCommand, "ProductName"),
db.GetParameterValue(dbCommand, "UnitPrice"));
用法注意:
你可以使用ExecuteNonQuery方法而不使用DataSet的insert,delete,update方法来改变数据