企业程序库-数据访问应用程序块
数据访问应用程序块简介
Enterprise Library Data Access Application Block 1.0 版可以简化实现通用数据访问功能的开发任务。应用程序可以在很多情况下使用应用程序块,例如读取显示数据、获得通过应用程序层的数据,以及将更改过的数据提交回数据库系统等。
应用程序块包括对存储过程和内嵌 SQL 以及常见内务处理任务(例如,管理连接、创建与缓存封装在应用程序块的方法中的参数)的支持。换句话说,数据访问应用程序块提供对最常用的 ADO.NET 功能的访问。
该应用程序块还简化了可移植应用程序代码的开发,允许多个数据库服务器(包括 Microsoft SQL Server、Oracle 和 DB2中的代码保持一致。 为此,可以使用抽象基类来定义公共接口并提供数据访问方法的多种实现,为一种数据库(例如 SQL Server£©编写的应用程序看起来与为另一种数据库(例如 oracle)编写的应用程序相同。通过使用数据访问应用程序块并遵循本文档中的准则,您的代码大部分都可以移植。
另一个功能是,应用程序代码可以通过名称(例如,“Customer”或“Inventory”)来引用特定的数据库。更改应用程序配置中的名称允许开发人员以不同的数据库配置来使用他们的应用程序,而无需重新编译他们的代码。
图 1 展示了数据访问应用程序块中关键类的相互关系。
抽象基类 Database 定义了公共接口,并提供了数据访问方法的多种实现。SqlDatabase、OracleDatabase 和 Db2Database 类均派生于 Database 类。它们为其各自的数据库服务器系统提供方法,这包括常见功能(根据数据库的不同,其实现也不同)以及该数据库系统所特有的功能。
数据库命令和参数在数据库系统中的处理是不同的。 抽象类 DbCommandWrapper 提供特定数据库类的接口定义,它将包装 IDbCommand 并提供参数处理。
DatabaseFactory 类提供了静态方法 CreateDatabase,以封装创建适当 Database 对象的逻辑。通过使用工厂来创建正确的数据库对象,客户端代码就不会绑定到特定的数据库类型。
DatabaseFactory 类使用配置应用程序块来检索所需的配置信息,包括要创建的、派生于 Database 的特定类的完全限定类型名和连接字符串。
该应用程序块支持动态发现参数。这种发现机制需要往返于数据库系统。ParameterCache 类允许缓存参数信息,因此可以避免同一存储过程后续调用的往返行程。
使用方法:企业程序库Enterprise Library 3.0中需要引用两个关键程序集,分别是Microsoft.Practices.EnterpriseLibrary.Common.dll和Microsoft.Practices.EnterpriseLibrary.Data.dll。另外为了简化代码的编写,我们再在需要用到DAAB的地方using一下Microsoft.Practices.EnterpriseLibrary.Data这个命名空间。
创建数据库实例有两种方法,一是默认的数据库实例,一是用命名实例映射到配置文件。
/**////创建默认的实例
Database db = DatabaseFactory.CreateDatabase();
/**////创建数据库实例
Database db = DatabaseFactory.CreateDatabase(”NorthWind”);
/**//// <summary>
/// 返回DataSet类型
/// </summary>
private DataSet GetDataSet()
{
DataSet ds = db.ExecuteDataSet(CommandType.Text,”SELECT * FROM Employees”);
return ds;
}
/**//// <summary>
/// 返回DataReader类型
/// </summary>
/// <returns></returns>
private DataReader GetDataReader()
{
DataReader dr = db.ExecuteReader(CommandType.Text,”SELECT * FROM Employees”);
return dr;
}
/**//// <summary>
/// 返回单值
/// </summary>
/// <returns></returns>
private int GetSigleValue()
{
int iCount = db.ExecuteScalar(CommandType.Text,”SELECT COUNT(*) FROM Employees”);
return iCount;
}
使用存储过程:
1.不传递参数:不传递参数时值需要指定存储过程的名称,已经命令的类型即可。
/**//// <summary>
/// 执行存储过程(1)——不传递参数(NoPara)
/// </summary>
private void FormatDataBySp1()
{
/**////创建数据库实例
Database db = DatabaseFactory.CreateDatabase(”NorthWind”);
/**////传递参数
DBCommandWrapper dbc = db.GetStoredProcCommandWrapper(”GetProductsList”);
/**////执行存储过程
DataSet ds = db.ExecuteDataSet(dbc);
/**////绑定数据
DataGrid1.DataSource = ds.Tables[0];
DataGrid1.DataBind();
}
2.传递输入参数:需要注意的是在增加参数时是AddInParameter。
/**//// <summary>
/// 执行存储过程(2)——传递输入参数(Input)
/// </summary>
private void FormatDataBySp2()
{
/**////创建数据库实例
Database db = DatabaseFactory.CreateDatabase(”NorthWind”);
/**////传递参数
DBCommandWrapper dbc = db.GetStoredProcCommandWrapper(”CustOrdersDetail”);
dbc.AddInParameter(”@OrderID”,System.Data.DbType.Int32,10248);
/**////执行存储过程
DataSet ds = db.ExecuteDataSet(dbc);
/**////绑定数据
DataGrid1.DataSource = ds.Tables[0];
DataGrid1.DataBind();
}
3.传递输出参数:需要注意的是在增加参数时是AddOutParameter。
/**//// <summary>
/// 执行存储过程(3)——传递输出参数(Output)
/// </summary>
private void FormatDataBySp3()
{
/**////创建数据库实例
Database db = DatabaseFactory.CreateDatabase(”NorthWind”);
/**////传递参数
DBCommandWrapper dbc = db.GetStoredProcCommandWrapper(”GetProductDetails”);
dbc.AddInParameter(”@ProductID”,System.Data.DbType.Int32,12);
dbc.AddOutParameter(”@ProductName”,System.Data.DbType.String,50); //输出
/**////执行存储过程
db.ExecuteNonQuery(dbc);
string result = dbc.GetParameterValue(”@ProductName”).ToString(); //得到输出参数的值
}
使用事务:
在企业库数据访问应用程序块里面,对事务提供了很好的支持,具体的使用方法在程序里面有注释,这里就不多说了。
/// <summary>
/// 利用事务更改数据
/// </summary>
private void ExecuteUseTran()
{
/**////创建数据库实例
Database db = DatabaseFactory.CreateDatabase(”NorthWind”);
using(IDbConnection Idbconn = db.GetConnection())
{
/**////打开连接
Idbconn.Open();
/**////创建事务
IDbTransaction Idbtran = Idbconn.BeginTransaction();
try
{
/**////执行两个存储过程
db.ExecuteNonQuery(CommandType.StoredProcedure,”InserOrders”);
db.ExecuteDataSet(CommandType.StoredProcedure,”UpdateProducts”);
/**////执行完成后提交事务
Idbtran.Commit();
}
catch
{
/**////回滚事务
Idbtran.Rollback();
}
finally
{
/**////关闭连接
Idbconn.Close();
}
}
}
)告知,即刻删除。