Enterprise Library 2.0 里的数据处理的部分--Data Access Application Block为我们开发者提供了对数据处理的大部分通用的方法。其内容包括:
1、使用DataReader返回多行数据
2、使用DataSet返回多行数据
3、返回一个输出型参数
4、返回一个单一值
5、事务处理
6、返回XML数据
7、使用DataSet来修改数据库
...
看起来DataAccess Application Block很像是ADO.NET,确实如此,DataAccess Application Block 不是ADO.NET的替代品,它是对ADO.NET的补充。DataAccess Application Block的优点在于它可以使用相同的代码去访问不同类型的数据库,比如我们的应用程序从Sql Server上转到Oracle,那么使用DataAccess Application Block 可以让你不需要修改任何代码而达到上述功能,不过配置文件是当然要修改的。当然也不是在任何情况下都要用DataAccess Application Block,例如,当我们的代码是为了一种很特殊的数据库而编写的话,这时候应该选用ADO.NET。
首先我们来看一下DataAccess Application Block 是如何配置的(以Sql Server 2000为例)。
首先打开Enterprise Library提供的配置工具,选择File-->Open Application,选中我们项目种的Web.Config或App.Config文件:
![](https://i-blog.csdnimg.cn/blog_migrate/e45b6401e46b929174979ea93b296478.gif)
修改DataBase名称为我们需要连接的数据库名称:
![](https://i-blog.csdnimg.cn/blog_migrate/28ffae9b9dfbeb4dd5cddfa8ec133171.gif)
修改Server,指定数据库服务器名:
![](https://i-blog.csdnimg.cn/blog_migrate/ee0cf37737168e8b889e182decb62701.gif)
再添加两个参数,分别是uid和pwd:
![](https://i-blog.csdnimg.cn/blog_migrate/c6b36cb7fe2f5851119b2536fabe6a65.gif)
最后点 File-->Save All,这样就完成了一个数据库的配置。生成的配置文件内容如下:
<?
xml version="1.0" encoding="utf-8"
?>
<
configuration
>
<
configSections
>
<
section
name
="dataConfiguration"
type
="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
/>
</
configSections
>
<
dataConfiguration
defaultDatabase
="Connection String"
/>
<
connectionStrings
>
<
add
name
="Connection String"
connectionString
="Database=EnterpriseLibrary;Server=shy;Integrated Security=SSPI;uid=sa;pwd=;"
providerName
="System.Data.SqlClient"
/>
</
connectionStrings
>
</
configuration
>
在其中的ConnectionStrings节里我们可以看到我们刚刚配置时输入的数据库信息。
下面我们重点来说一下DataAccess Application Block操作数据库的方法。
1、创建一个数据库实例DataBase
//
创建一个默认的数据库实例
Database defaultdb
=
DatabaseFactory.CreateDatabase();
//
创建一个名为Connection String的数据库实例
Database db
=
DatabaseFactory.CreateDatabase(
"
Connection String
"
);
//
上面两种创建数据库实例的方法的数据库可以是任何类型的数据库,取决于Config文件中的配置信息
//
下面的这种方面展示了创建一个SQL数据库的实例,需引用Microsoft.Practices.EnterpriseLibrary.Data.Sql程序集
SqlDatabase dbsql
=
DatabaseFactory.CreateDatabase(
"
Connection String
"
)
as
SqlDatabase;
//
我们同样也可以不通过配置文件来创建数据库实例,如下
string
connString
=
"
server=.;database=EnterpriseLibrary;uid=sa;pwd=
"
;
SqlDatabase nocofigdb
=
new
SqlDatabase(connString);
2、创建DbCommand
DbCommand的创建方式有两种:一种是为了调用存储过程创建,一种是为了执行一般的SQL语句而创建,具体用哪一种方式,就要看你需要执行的是存储过程还是SQL语句了。
//
创建一个SQL语句的DbCommand
Database db
=
DatabaseFactory.CreateDatabase();
string
sql
=
"
Select * from person
"
;
DbCommand Sqldbcomm
=
db.GetSqlStringCommand(sql);
//
创建一个存储过程的DbCommand
//
存储过程名称为GetAllPersonByName
string
procName
=
"
GetAllPersonByName
"
;
DbCommand Procdbcomm
=
db.GetStoredProcCommand(procName);
3、存储过程中的参数处理
DataBase类中包含多种传递存储过程参数的方法,也包含了得到和设置参数值的方法,如下:
AddParameter. 为存储过程传递一个参数(输入型或输出型)
AddInParameter. 为存储过程传递一个输入型参数
AddOutParameter. 为存储过程传递一个输出型参数
GetParameterValue. 获取某存储过程指定参数的值
SetParameterValue. 为存储过程的某个参数赋值,当你需要用同一个方法来执行插入多条记录时,就可参数给参数赋值的方法来进行
//
创建一个存储过程的DbCommand
//
存储过程名称为GetAllPersonByName
string
procName
=
"
GetAllPersonByName
"
;
DbCommand Procdbcomm
=
db.GetStoredProcCommand(procName);
![](https://i-blog.csdnimg.cn/blog_migrate/de0e88029460e5905c7f927c683143f6.gif)
//
添加一个输入型的参数
db.AddInParameter(Procdbcomm,
"
@sex
"
, DbType.String);
//
添加一个输出型的参数
db.AddOutParameter(Procdbcomm,
"
@name
"
, DbType.String,
20
);
//
设置参数的值
db.SetParameterValue(Procdbcomm,
"
@sex
"
,
"
男
"
);
![](https://i-blog.csdnimg.cn/blog_migrate/de0e88029460e5905c7f927c683143f6.gif)
//
执行存储过程
db.ExecuteNonQuery(Procdbcomm);
![](https://i-blog.csdnimg.cn/blog_migrate/de0e88029460e5905c7f927c683143f6.gif)
//
得到输出参数的值,注意转化返回值类型
string
outvalue
=
(
string
) db.GetParameterValue(Procdbcomm,
"
@name
"
);
4、执行ExecuteReader方法返回一个IDataReader类型的数据集
因为ExecuteReader方法在一开始执行时就打开了一个与数据库的连接,所以我们必须注意在使用结束时关闭连接,而用using(){}语句块就能确保ExecuteReader方法在执行完毕时关闭与数据库的连接。
什么时候使用此方法:
返回的数据仅仅用来显示,并不对其进行修改,删除等操作;
绑定返回的数据到WebForm Control
不需要缓存返回的数据,用完就释放
using
(IDataReader reader
=
db.ExecuteReader(CommandType.Text,
"
select * from person
"
))
![](https://i-blog.csdnimg.cn/blog_migrate/9d630fbf87d008770a1f7ab227c63235.gif)
{
DataGrid1.DataSource = reader;
DataGrid1.DataBind();
}
5、执行ExecuteDataSet方法返回一个DataSet
public
DataSet GetPersonList()
![](https://i-blog.csdnimg.cn/blog_migrate/9d630fbf87d008770a1f7ab227c63235.gif)
{
Database db = DatabaseFactory.CreateDatabase();
DbCommand dbcomm = db.GetSqlStringCommand("select * from person");
![](https://i-blog.csdnimg.cn/blog_migrate/a428f06000d92f3d604c1d6e90af2962.gif)
return db.ExecuteDataSet(dbcomm);
}
什么时候使用此方法:
需要返回多表数据;
如果你需要逐一访问数据库的每一条记录,这个时候如果使用DataReader的话,则会使与数据库的连接一直处于打开的状态,长此以往,就会使应用程序的性能和可伸缩性大大降低;
需要和其他的应用程序交换数据;
6、执行ExecuteNonQuery
该方法返回的是SQL语句执行影响的行数,我们可以利用该方法来执行一些没有返回值的操作(Insert,Update,Delete)
public
void
AddPerson()
![](https://i-blog.csdnimg.cn/blog_migrate/9d630fbf87d008770a1f7ab227c63235.gif)
{
Database db = DatabaseFactory.CreateDatabase();
DbCommand dbcomm = db.GetSqlStringCommand("insert into person values(1,'shy','女','123456')");
![](https://i-blog.csdnimg.cn/blog_migrate/a428f06000d92f3d604c1d6e90af2962.gif)
db.ExecuteNonQuery(dbcomm);
}
7、执行ExecuteScalar返回单值
public
string
GetPersonName()
![](https://i-blog.csdnimg.cn/blog_migrate/9d630fbf87d008770a1f7ab227c63235.gif)
{
Database db = DatabaseFactory.CreateDatabase();
DbCommand dbcomm = db.GetSqlStringCommand("select name from person");
![](https://i-blog.csdnimg.cn/blog_migrate/a428f06000d92f3d604c1d6e90af2962.gif)
return (string)db.ExecuteScalar(dbcomm);
}
8、事务处理
public
void
UseTransaction()
![](https://i-blog.csdnimg.cn/blog_migrate/9d630fbf87d008770a1f7ab227c63235.gif)
{
Database db = DatabaseFactory.CreateDatabase();
DbCommand dbcomm1 = db.GetSqlStringCommand("update person set name='pw'");
DbCommand dbcomm2 = db.GetSqlStringCommand("delete from person where id=1");
![](https://i-blog.csdnimg.cn/blog_migrate/a428f06000d92f3d604c1d6e90af2962.gif)
using (DbConnection conn = db.CreateConnection())
![](https://i-blog.csdnimg.cn/blog_migrate/6c8c92e8ab60254706bcdbea2fe858da.gif)
{
//打开连接
conn.Open();
//创建事务
DbTransaction trans = conn.BeginTransaction();
![](https://i-blog.csdnimg.cn/blog_migrate/a428f06000d92f3d604c1d6e90af2962.gif)
try
![](https://i-blog.csdnimg.cn/blog_migrate/6c8c92e8ab60254706bcdbea2fe858da.gif)
{
db.ExecuteNonQuery(dbcomm1);
![](https://i-blog.csdnimg.cn/blog_migrate/a428f06000d92f3d604c1d6e90af2962.gif)
db.ExecuteNonQuery(dbcomm2);
![](https://i-blog.csdnimg.cn/blog_migrate/a428f06000d92f3d604c1d6e90af2962.gif)
//都执行成功则提交事务
trans.Commit();
}
catch(Exception)
![](https://i-blog.csdnimg.cn/blog_migrate/6c8c92e8ab60254706bcdbea2fe858da.gif)
{
//发生异常,事务回滚
trans.Rollback();
}
//关闭连接
conn.Close();
}
}
9、执行ExecuteXmlReader返回XML数据
支持Sql Server 2000 及以后版本的数据库,对微软以外的数据库应该不支持。
public
void
UseXMLReader()
![](https://i-blog.csdnimg.cn/blog_migrate/9d630fbf87d008770a1f7ab227c63235.gif)
{
SqlDatabase dbSQL = DatabaseFactory.CreateDatabase("Connection String") as SqlDatabase;
![](https://i-blog.csdnimg.cn/blog_migrate/a428f06000d92f3d604c1d6e90af2962.gif)
// 要返回XML数据需要在SQL语句后加 FOR XML AUTO
string sqlCommand = "SELECT ProductID, ProductName FROM Products FOR XML AUTO";
DbCommand dbCommand = dbSQL.GetSqlStringCommand(sqlCommand);
![](https://i-blog.csdnimg.cn/blog_migrate/a428f06000d92f3d604c1d6e90af2962.gif)
XmlReader personReader = null;
StringBuilder personlist = new StringBuilder();
![](https://i-blog.csdnimg.cn/blog_migrate/a428f06000d92f3d604c1d6e90af2962.gif)
try
![](https://i-blog.csdnimg.cn/blog_migrate/6c8c92e8ab60254706bcdbea2fe858da.gif)
{
personReader = dbSQL.ExecuteXmlReader(dbCommand);
![](https://i-blog.csdnimg.cn/blog_migrate/a428f06000d92f3d604c1d6e90af2962.gif)
// 循环向XML中写入我们查询得到的数据
while (!personReader.EOF)
![](https://i-blog.csdnimg.cn/blog_migrate/6c8c92e8ab60254706bcdbea2fe858da.gif)
{
if (personReader.IsStartElement())
![](https://i-blog.csdnimg.cn/blog_migrate/6c8c92e8ab60254706bcdbea2fe858da.gif)
{
personlist.Append(personReader.ReadOuterXml());
personlist.Append(Environment.NewLine);
}
}
}
finally
![](https://i-blog.csdnimg.cn/blog_migrate/6c8c92e8ab60254706bcdbea2fe858da.gif)
{
// 关闭 Reader.
if (personReader != null)
![](https://i-blog.csdnimg.cn/blog_migrate/6c8c92e8ab60254706bcdbea2fe858da.gif)
{
personReader.Close();
}
![](https://i-blog.csdnimg.cn/blog_migrate/a428f06000d92f3d604c1d6e90af2962.gif)
// 关闭数据库连接
if (dbCommand.Connection != null)
![](https://i-blog.csdnimg.cn/blog_migrate/6c8c92e8ab60254706bcdbea2fe858da.gif)
{
dbCommand.Connection.Close();
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/a428f06000d92f3d604c1d6e90af2962.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a428f06000d92f3d604c1d6e90af2962.gif)
}
10、用DataSet批量的添加,修改,删除数据
public
void
UpdateDataBase()
![](https://i-blog.csdnimg.cn/blog_migrate/9d630fbf87d008770a1f7ab227c63235.gif)
{
Database db = DatabaseFactory.CreateDatabase();
![](https://i-blog.csdnimg.cn/blog_migrate/a428f06000d92f3d604c1d6e90af2962.gif)
DataSet personDataSet = new DataSet();
![](https://i-blog.csdnimg.cn/blog_migrate/a428f06000d92f3d604c1d6e90af2962.gif)
string sqlCommand = "Select * from person";
DbCommand dbCommand = db.GetSqlStringCommand(sqlCommand);
![](https://i-blog.csdnimg.cn/blog_migrate/a428f06000d92f3d604c1d6e90af2962.gif)
string personTable = "person";
![](https://i-blog.csdnimg.cn/blog_migrate/a428f06000d92f3d604c1d6e90af2962.gif)
// 得到初始化数据
db.LoadDataSet(dbCommand, personDataSet, personTable);
![](https://i-blog.csdnimg.cn/blog_migrate/a428f06000d92f3d604c1d6e90af2962.gif)
// 得到未修改前的数据集
DataTable table = personDataSet.Tables[personTable];
![](https://i-blog.csdnimg.cn/blog_migrate/a428f06000d92f3d604c1d6e90af2962.gif)
// 往DataSet中添加一行数据
![](https://i-blog.csdnimg.cn/blog_migrate/6c8c92e8ab60254706bcdbea2fe858da.gif)
DataRow addedRow = table.Rows.Add(new object[]
{ 18, "New person", "男", "654321" });
![](https://i-blog.csdnimg.cn/blog_migrate/a428f06000d92f3d604c1d6e90af2962.gif)
// 修改
table.Rows[0]["ProductName"] = "Modified product";
![](https://i-blog.csdnimg.cn/blog_migrate/a428f06000d92f3d604c1d6e90af2962.gif)
// 下面分别创建添加,修改,删除的操作
DbCommand insertCommand = db.GetStoredProcCommand("AddPerson");
db.AddInParameter(insertCommand, "Name", DbType.String, "Name", DataRowVersion.Current);
db.AddInParameter(insertCommand, "Sex", DbType.String, "Sex", DataRowVersion.Current);
db.AddInParameter(insertCommand, "ID", DbType.Int32, "ID", DataRowVersion.Current);
![](https://i-blog.csdnimg.cn/blog_migrate/a428f06000d92f3d604c1d6e90af2962.gif)
DbCommand deleteCommand = db.GetStoredProcCommand("DeletePerson");
db.AddInParameter(deleteCommand, "ID", DbType.Int32, "ID", DataRowVersion.Current);
![](https://i-blog.csdnimg.cn/blog_migrate/a428f06000d92f3d604c1d6e90af2962.gif)
DbCommand updateCommand = db.GetStoredProcCommand("UpdatePerson");
db.AddInParameter(updateCommand, "Name", DbType.String, "Name", DataRowVersion.Current);
db.AddInParameter(updateCommand, "Sex", DbType.String, "Sex", DataRowVersion.Current);
db.AddInParameter(insertCommand, "ID", DbType.Int32, "ID", DataRowVersion.Current);
![](https://i-blog.csdnimg.cn/blog_migrate/a428f06000d92f3d604c1d6e90af2962.gif)
// 提交对DataSet的修改,并返回影响的行数
int rowsAffected = db.UpdateDataSet(productsDataSet, "Products", insertCommand, updateCommand, deleteCommand, Microsoft.Practices.EnterpriseLibrary.Data.UpdateBehavior.Standard);
}
关于DataAccess Application Block 的配置以及使用先介绍到此,更深入的部分,我会在以后的文章里继续写的,也许你想知道2.0和1.0的区别,那么请参考我前面写的一篇1.0的数据访问程序块的介绍吧!
http://pw.cnblogs.com/archive/2006/06/02/415431.html原版地址