2024年4月8日发(作者:)

【精编推荐】

EnterpriseLibrary企

业库常用办法

Enterprise Library 2.0 --企业库常用方法

下面我们重点来说一下DataAccess Application Block操作数据库

的方法。

1、创建一个数据库实例DataBase

//创建一个默认的数据库实例

Database defaultdb = Database();

//创建一个名为Connection String的数据库实例

Database db = Database("Connection St

ring");

//上面两种创建数据库实例的方法的数据库可以是任何类型的数据

库,取决于Config文件中的配置信息

//下面的这种方面展示了创建一个SQL数据库的实例,需引用Micros

程序集

SqlDatabase dbsql = Database("Connect

ion String") as SqlDatabase;

//我们同样也可以不通过配置文件来创建数据库实例,如下

string connString = "server=.;database=EnterpriseLibrary;ui

d=sa;pwd=";

SqlDatabase nocofigdb = new SqlDatabase(connString);

2、创建DbCommand

DbCommand的创建方式有两种:一种是为了调用存储过程创建,一种

是为了执行一般的SQL语句而创建,具体用哪一种方式,就要看你需

要执行的是存储过程还是SQL语句了。

//创建一个SQL语句的DbCommand

Database db = Database();

string sql = "Select * from person";

DbCommand Sqldbcomm = StringCommand(sql);

//创建一个存储过程的DbCommand

//存储过程名称为GetAllPersonByName

string procName = "GetAllPersonByName";

DbCommand Procdbcomm = redProcCommand(procName);

3、存储过程中的参数处理

DataBase类中包含多种传递存储过程参数的方法,也包含了得到和

设置参数值的方法,如下:

AddParameter. 为存储过程传递一个参数(输入型或输出型)

AddInParameter. 为存储过程传递一个输入型参数

AddOutParameter. 为存储过程传递一个输出型参数

GetParameterValue. 获取某存储过程指定参数的值

SetParameterValue. 为存储过程的某个参数赋值,当你需要用同一

个方法来执行插入多条记录时,就可参数给参数赋值的方法来进行

//创建一个存储过程的DbCommand

//存储过程名称为GetAllPersonByName

string procName = "GetAllPersonByName";

DbCommand Procdbcomm = redProcCommand(procName);

//添加一个输入型的参数

arameter(Procdbcomm, "@sex", );

//添加一个输出型的参数

Parameter(Procdbcomm, "@name", ,20);

//设置参数的值

ameterValue(Procdbcomm, "@sex", "男");

//执行存储过程

eNonQuery(Procdbcomm);

//得到输出参数的值,注意转化返回值类型

string outvalue = (string) ameterValue(Procdbcomm,

"@name");

4、执行ExecuteReader方法返回一个IDataReader类型的数据集

因为ExecuteReader方法在一开始执行时就打开了一个与数据库的

连接,所以我们必须注意在使用结束时关闭连接,而用using(){}语

句块就能确保ExecuteReader方法在执行完毕时关闭与数据库的连

接。

什么时候使用此方法:

返回的数据仅仅用来显示,并不对其进行修改,删除等操作;

绑定返回的数据到WebForm Control

不需要缓存返回的数据,用完就释放

using (IDataReader reader = eReader(

xt, "select * from person"))

{

urce = reader;

nd();

}

5、执行ExecuteDataSet方法返回一个DataSet

public DataSet GetPersonList()

{

Database db = Database();

DbCommand dbcomm = StringCommand("select * from pe

rson");

return eDataSet(dbcomm);

}

什么时候使用此方法:

需要返回多表数据;

如果你需要逐一访问数据库的每一条记录,这个时候如果使用DataR

eader的话,则会使与数据库的连接一直处于打开的状态,长此以往,

就会使应用程序的性能和可伸缩性大大降低;

需要和其他的应用程序交换数据;

6、执行ExecuteNonQuery

该方法返回的是SQL语句执行影响的行数,我们可以利用该方法来执

行一些没有返回值的操作(Insert,Update,Delete)

public void AddPerson()

{

Database db = Database();

DbCommand dbcomm = StringCommand("insert into pers

on values(1,'shy','女','123456')");

eNonQuery(dbcomm);

}

7、执行ExecuteScalar返回单值

public string GetPersonName()

{

Database db = Database();

DbCommand dbcomm = StringCommand("select name from

person");

return (string)eScalar(dbcomm);

}

8、事务处理

public void UseTransaction()

{

Database db = Database();

DbCommand dbcomm1 = StringCommand("update person s

et name='pw'");

DbCommand dbcomm2 = StringCommand("delete from per

son where id=1");

using (DbConnection conn = Connection())

{

//打开连接

();

//创建事务

DbTransaction trans = ransaction();

try

{

eNonQuery(dbcomm1);

eNonQuery(dbcomm2);

//都执行成功则提交事务

();

}

catch(Exception)

{

//发生异常,事务回滚

ck();

}

//关闭连接

();

}

}

9、执行ExecuteXmlReader返回XML数据

支持Sql Server 2000 及以后版本的数据库,对微软以外的数据库

应该不支持。

public void UseXMLReader()

{

SqlDatabase dbSQL = Database("Connect

ion String") as SqlDatabase;

// 要返回XML数据需要在SQL语句后加 FOR XML AUTO

string sqlCommand = "SELECT ProductID, ProductName FROM Pro

ducts FOR XML AUTO";

DbCommand dbCommand = StringCommand(sqlCommand);

XmlReader personReader = null;

StringBuilder personlist = new StringBuilder();

try

{

personReader = eXmlReader(dbCommand);

// 循环向XML中写入我们查询得到的数据

while (!)

{

if (tElement())

{

(terXml());

(e);

}

}

}

finally

{

// 关闭 Reader.

if (personReader != null)

{

();

}

// 关闭数据库连接

if (tion != null)

{

();

}

}

}

10、用DataSet批量的添加,修改,删除数据

public void UpdateDataBase()

{

Database db = Database();

DataSet personDataSet = new DataSet();

string sqlCommand = "Select * from person";

DbCommand dbCommand = StringCommand(sqlCommand);

string personTable = "person";

// 得到初始化数据

taSet(dbCommand, personDataSet, personTable);

// 得到未修改前的数据集

DataTable table = [personTable];

// 往DataSet中添加一行数据

DataRow addedRow = (new object[] { 18, "New

person", "男", "654321" });

// 修改

[0]["ProductName"] = "Modified product";

// 下面分别创建添加,修改,删除的操作

DbCommand insertCommand = redProcCommand("AddPers

on");

arameter(insertCommand, "Name", , "Na

me", t);

arameter(insertCommand, "Sex", , "Sex

", t);

arameter(insertCommand, "ID", 32, "ID",

t);

DbCommand deleteCommand = redProcCommand("DeleteP

erson");

arameter(deleteCommand, "ID", 32, "ID",

t);

DbCommand updateCommand = redProcCommand("UpdateP

erson");

arameter(updateCommand, "Name", , "Na

me", t);

arameter(updateCommand, "Sex", , "Sex

", t);

arameter(insertCommand, "ID", 32, "ID",

t);

// 提交对DataSet的修改,并返回影响的行数

int rowsAffected = DataSet(productsDataSet, "Prod

ucts",

insertCommand, updateCommand, deleteCommand

, Micros

rd);

}

//-->

Enterprise Library2.0数据库常用操作2(不同版本的解释)

今天学习了Enterprise Library2.0的Data Access Applicati

on Block,Data Access Application Block提供了通用的数据访问

的功能,随着2.0版本的推出有了很大变化。俺就多写了对SQL和A

CCESS数据库自由切换的一些代码出来共享。先看完原文再接俺的代

码吧。

一.改进

在DAAB1.1里面我们知道Database方法返回或者创建一个DBCo

mmandWrapper对象,而在DAAB2.0里面移除了DBCommandWrapper类,

用2.0里面的DBCommand类代替实现类似的功能,这样使得

DAAB跟我们的.NET类库的结合更加紧密,回忆一下我们在1.1里面

用DBCommandWrapper来访问数据时的代码:

二.使用示例

Database db = Database();

DBCommandWrapper dbCommand = redProcCommandWr

apper("GetProductsByCategory");

arameter("CategoryID", 32, C

ategory);

DataSet productDataSet = eDataSet(dbCommand);

而用了新的DBCommand类之后则变成了:

Database db = Database();

DbCommand dbCommand = redProcCommand("GetProd

uctsByCategory");

arameter(dbCommand, "CategoryID", 3

2, Category);

DataSet productDataSet = eDataSet(dbCommand);

数据库连接字符串在我们基于数据库的开发永远是少不了的,但

是在DAAB1.1下,它所使用的字符串跟我们在.NET类库中使用的连

接字符串却是不能共享的,它们分别保存在不同的位置。而在2.0的

Data Access Application Block使用了2.0里面

ionStrings>配置区,这样带来的一个好处是连接字符串可以在Appl

ication Block和自定义的.NET类之间共享使用该配置区,如:

name="DataAccessQuickStart"

providerName="ent"

connectionString="server=(local)SQLEXPRESS;da

tabase=EntLibQuickStarts;Integrated Security=true" />

在.NET2.0下,泛型编程已经成为了一个核心,而2.0版的DAAB

中也新增了一个GenericDatabase对象。DAAB中虽然已经包含了Sq

lDatabase和OrcaleDatabase,但是如果我们需要使用其他的像DB2

等数据库时,就需要用到GenericDatabase,它可以用于任何.NET

类库中的数据提供者,包括OdbcProvider和OleDbProvider。

DAAB2.0的配置非常简单,主要有以下几方面的配置:

配置连接字符串

配置默认数据库