Enterprise-Library20-企业库常用方法_第1页
Enterprise-Library20-企业库常用方法_第2页
Enterprise-Library20-企业库常用方法_第3页
Enterprise-Library20-企业库常用方法_第4页
Enterprise-Library20-企业库常用方法_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/EnterpriseLibrary2.0--企业库常用方法下面我们重点来说一下DataAccessApplicationBlock操作数据库的方法。

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

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

Databasedefaultdb=DatabaseFactory.CreateDatabase();

//创立一个名为ConnectionString的数据库实例

Databasedb=DatabaseFactory.CreateDatabase("ConnectionString");

//上面两种创立数据库实例的方法的数据库可以是任何类型的数据库,取决于Config文件中的配置信息

//下面的这种方面展示了创立一个SQL数据库的实例,需引用Microsoft.Practices.EnterpriseLibrary.Data.Sql程序集

SqlDatabasedbsql=DatabaseFactory.CreateDatabase("ConnectionString")asSqlDatabase;

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

stringconnString="server=.;database=EnterpriseLibrary;uid=sa;pwd=";

SqlDatabasenocofigdb=newSqlDatabase(connString);

2、创立DbCommand

DbCommand的创立方式有两种:一种是为了调用存储过程创立,一种是为了执行一般的SQL语句而创立,具体用哪一种方式,就要看你需要执行的是存储过程还是SQL语句了。

//创立一个SQL语句的DbCommand

Databasedb=DatabaseFactory.CreateDatabase();

stringsql="Select*fromperson";

DbCommandSqldbcomm=db.GetSqlStringCommand(sql);

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

//存储过程名称为GetAllPersonByName

stringprocName="GetAllPersonByName";

DbCommandProcdbcomm=db.GetStoredProcCommand(procName);

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

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

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

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

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

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

SetParameterValue.为存储过程的某个参数赋值,当你需要用同一个方法来执行插入多条记录时,就可参数给参数赋值的方法来进行

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

//存储过程名称为GetAllPersonByName

stringprocName="GetAllPersonByName";

DbCommandProcdbcomm=db.GetStoredProcCommand(procName);

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

db.AddInParameter(Procdbcomm,"@sex",DbType.String);

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

db.AddOutParameter(Procdbcomm,"@name",DbType.String,20);

//设置参数的值

db.SetParameterValue(Procdbcomm,"@sex","男");

//执行存储过程

db.ExecuteNonQuery(Procdbcomm);

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

stringoutvalue=(string)db.GetParameterValue(Procdbcomm,"@name");

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

因为ExecuteReader方法在一开始执行时就翻开了一个与数据库的连接,所以我们必须注意在使用结束时关闭连接,而用using(){}语句块就能确保ExecuteReader方法在执行完毕时关闭与数据库的连接。

什么时候使用此方法:

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

绑定返回的数据到WebFormControl

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

using(IDataReaderreader=db.ExecuteReader(CommandType.Text,"select*fromperson"))

{

DataGrid1.DataSource=reader;

DataGrid1.DataBind();

}

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

publicDataSetGetPersonList()

{

Databasedb=DatabaseFactory.CreateDatabase();

DbCommanddbcomm=db.GetSqlStringCommand("select*fromperson");

returndb.ExecuteDataSet(dbcomm);

}

什么时候使用此方法:

需要返回多表数据;

如果你需要逐一访问数据库的每一条记录,这个时候如果使用DataReader的话,则会使与数据库的连接一直处于翻开的状态,长此以往,就会使应用程序的性能和可伸缩性大大降低;

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

6、执行ExecuteNonQuery

该方法返回的是SQL语句执行影响的行数,我们可以利用该方法来执行一些没有返回值的操作(Insert,Update,Delete)

publicvoidAddPerson()

{

Databasedb=DatabaseFactory.CreateDatabase();

DbCommanddbcomm=db.GetSqlStringCommand("insertintopersonvalues(1,'shy','女','123456')");

db.ExecuteNonQuery(dbcomm);

}

7、执行ExecuteScalar返回单值

publicstringGetPersonName()

{

Databasedb=DatabaseFactory.CreateDatabase();

DbCommanddbcomm=db.GetSqlStringCommand("selectnamefromperson");

return(string)db.ExecuteScalar(dbcomm);

}

8、事务处理

publicvoidUseTransaction()

{

Databasedb=DatabaseFactory.CreateDatabase();

DbCommanddbcomm1=db.GetSqlStringCommand("updatepersonsetname='pw'");

DbCommanddbcomm2=db.GetSqlStringCommand("deletefrompersonwhereid=1");

using(DbConnectionconn=db.CreateConnection())

{

//翻开连接

conn.Open();

//创立事务

DbTransactiontrans=conn.BeginTransaction();

try

{

db.ExecuteNonQuery(dbcomm1);

db.ExecuteNonQuery(dbcomm2);

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

trans.Commit();

}

catch(Exception)

{

//发生异常,事务回滚

trans.Rollback();

}

//关闭连接

conn.Close();

}

}

9、执行ExecuteXmlReader返回XML数据

支持SqlServer2000及以后版本的数据库,对微软以外的数据库应该不支持。

publicvoidUseXMLReader()

{

SqlDatabasedbSQL=DatabaseFactory.CreateDatabase("ConnectionString")asSqlDatabase;

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

stringsqlCommand="SELECTProductID,ProductNameFROMProductsFORXMLAUTO";

DbCommanddbCommand=dbSQL.GetSqlStringCommand(sqlCommand);

XmlReaderpersonReader=null;

StringBuilderpersonlist=newStringBuilder();

try

{

personReader=dbSQL.ExecuteXmlReader(dbCommand);

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

while(!personReader.EOF)

{

if(personReader.IsStartElement())

{

personlist.Append(personReader.ReadOuterXml());

personlist.Append(Environment.NewLine);

}

}

}

finally

{

//关闭Reader.

if(personReader!=null)

{

personReader.Close();

}

//关闭数据库连接

if(dbCommand.Connection!=null)

{

dbCommand.Connection.Close();

}

}

}

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

publicvoidUpdateDataBase()

{

Databasedb=DatabaseFactory.CreateDatabase();

DataSetpersonDataSet=newDataSet();

stringsqlCommand="Select*fromperson";

DbCommanddbCommand=db.GetSqlStringCommand(sqlCommand);

stringpersonTable="person";

//得到初始化数据

db.LoadDataSet(dbCommand,personDataSet,personTable);

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

DataTabletable=personDataSet.Tables[personTable];

//往DataSet中添加一行数据

DataRowaddedRow=table.Rows.Add(newobject[]{18,"Newperson","男","654321"});

//修改

table.Rows[0]["ProductName"]="Modifiedproduct";

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

DbCommandinsertCommand=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);

DbCommanddeleteCommand=db.GetStoredProcCommand("DeletePerson");

db.AddInParameter(deleteCommand,"ID",DbType.Int32,"ID",DataRowVersion.Current);

DbCommandupdateCommand=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);

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

introwsAffected=db.UpdateDataSet(productsDataSet,"Products",insertCommand,updateCommand,deleteCommand,Microsoft.Practices.EnterpriseLibrary.Data.UpdateBehavior.Standard);

}//-->EnterpriseLibrary2.0数据库常用操作2(不同版本的解释)今天学习了EnterpriseLibrary2.0的DataAccessApplicationBlock,DataAccessApplicationBlock提供了通用的数据访问的功能,随着2.0版本的推出有了很大变化。俺就多写了对SQL和ACCESS数据库自由切换的一些代码出来共享。先看完原文再接俺的代码吧。一.改良在DAAB1.1里面我们知道Database方法返回或者创立一个DBCommandWrapper对象,而在DAAB2.0里面移除了DBCommandWrapper类,用ADO.NET2.0里面的DBCommand类代替实现类似的功能,这样使得DAAB跟我们的.NET类库的结合更加紧密,回忆一下我们在1.1里面用DBCommandWrapper来访问数据时的代码:二.使用例如Databasedb=DatabaseFactory.CreateDatabase();DBCommandWrapperdbCommand=db.GetStoredProcCommandWrapper("GetProductsByCategory");dbCommand.AddInParameter("CategoryID",DbType.Int32,Category);DataSetproductDataSet=db.ExecuteDataSet(dbCommand);而用了新的DBCommand类之后则变成了:Databasedb=DatabaseFactory.CreateDatabase();DbCommanddbCommand=db.GetStoredProcCommand("GetProductsByCategory");db.AddInParameter(dbCommand,"CategoryID",DbType.Int32,Category);DataSetproductDataSet=db.ExecuteDataSet(dbCommand);数据库连接字符串在我们基于数据库的开发永远是少不了的,但是在DAAB1.1下,它所使用的字符串跟我们在.NET类库中使用的连接字符串却是不能共享的,它们分别保存在不同的位置。而在2.0的DataAccessApplicationBlock使用了ADO.NET2.0里面<connectionStrings>配置区,这样带来的一个好处是连接字符串可以在ApplicationBlock和自定义的.NET类之间共享使用该配置区,如:<connectionStrings>

<add

name="DataAccessQuickStart"

providerName="System.Data.SqlClient"

connectionString="server=(local)\SQLEXPRESS;database=EntLibQuickStarts;IntegratedSecurity=true"/></connectionStrings>在.NET2.0下,泛型编程已经成为了一个核心,而2.0版的DAAB中也新增了一个GenericDatabase对象。DAAB中虽然已经包含了SqlDatabase和OrcaleDatabase,但是如果我们需要使用其他的像DB2等数据库时,就需要用到GenericDatabase,它可以用于任何.NET类库中的数据提供者,包括OdbcProvider和OleDbProvider。DAAB2.0的配置非常简单,主要有以下几方面的配置:配置连接字符串配置默认数据库添加相关的命名空间:usingMicrosoft.Practices.EnterpriseLibrary.Data;usingSystem.Data;使用DataAccessApplicationBlock进行数据的读取和操作,一般分为三步:1.创立Database对象2.提供命令参数,如果需要的话3.执行命令下面分别看一下DataAccessQuickStart中提供的一些例子:执行静态的SQL语句publicstringGetCustomerList(){//创立Database对象Databasedb=DatabaseFactory.CreateDatabase();//使用SQL语句创立DbCommand对象stringsqlCommand="SelectCustomerID,Name,Address,City,Country,PostalCode"+

"FromCustomers";DbCommanddbCommand=db.GetSqlStringCommand(sqlCommand);StringBuilderreaderData=newStringBuilder();//调用ExecuteReader方法using(IDataReaderdataReader=db.ExecuteReader(dbCommand)){

while(dataReader.Read())

{

//Getthevalueofthe'Name'columnintheDataReader

readerData.Append(dataReader["Name"]);

readerData.Append(Environment.NewLine);

}}returnreaderData.ToString();}执行存储过程并传递参数,返回DataSetpublicDataSetGetProductsInCategory(intCategory){

//CreatetheDatabaseobject,usingthedefaultdatabaseservice.The

//defaultdatabaseserviceisdeterminedthroughconfiguration.

Databasedb=DatabaseFactory.CreateDatabase();

stringsqlCommand="GetProductsByCategory";

DbCommanddbCommand=db.GetStoredProcCommand(sqlCommand);

//Retrieveproductsfromthespecifiedcategory.

db.AddInParameter(dbCommand,"CategoryID",DbType.Int32,Category);

//DataSetthatwillholdthereturnedresults

DataSetproductsDataSet=null;

productsDataSet=db.ExecuteDataSet(dbCommand);

//Note:connectionwasclosedbyExecuteDataSetmethodcall

returnproductsDataSet;}利用DataSet更新数据publicintUpdateProducts(){

//CreatetheDatabaseobject,usingthedefaultdatabaseservice.The

//defaultdatabaseserviceisdeterminedthroughconfiguration.

Databasedb=DatabaseFactory.CreateDatabase();

DataSetproductsDataSet=newDataSet();

stringsqlCommand="SelectProductID,ProductName,CategoryID,UnitPrice,LastUpdate"+

"FromProducts";

DbCommanddbCommand=db.GetSqlStringCommand(sqlCommand);

stringproductsTable="Products";

//Retrievetheinitialdata

db.LoadDataSet(dbCommand,productsDataSet,productsTable);

//Getthetablethatwillbemodified

DataTabletable=productsDataSet.Tables[productsTable];

//AddanewproducttoexistingDataSet

DataRowaddedRow=table.Rows.Add(newobject[]{DBNull.Value,"Newproduct",11,25});

//Modifyanexistingproduct

table.Rows[0]["ProductName"]="Modifiedproduct";

//EstablishourInsert,Delete,andUpdatecommands

DbCommandinsertCommand=db.GetStoredProcCommand("AddProduct");

db.AddInParameter(insertCommand,"ProductName",DbType.String,"ProductName",DataRowVersion.Current);

db.AddInParameter(insertCommand,"CategoryID",DbType.Int32,"CategoryID",DataRowVersion.Current);

db.AddInParameter(insertCommand,"UnitPrice",DbType.Currency,"UnitPrice",DataRowVersion.Current);

DbCommanddeleteCommand=db.GetStoredProcCommand("DeleteProduct");

db.AddInParameter(deleteCommand,"ProductID",DbType.Int32,"ProductID",DataRowVersion.Current);

DbCommandupdateCommand=db.GetStoredProcCommand("UpdateProduct");

db.AddInParameter(updateCommand,"ProductID",DbType.Int32,"ProductID",DataRowVersion.Current);

db.AddInParameter(updateCommand,"ProductName",DbType.String,"ProductName",DataRowVersion.Current);

db.AddInParameter(updateCommand,"LastUpdate",DbType.DateTime,"LastUpdate",DataRowVersion.Current);

//SubmittheDataSet,capturingthenumberofrowsthatwereaffected

introwsAffected=db.UpdateDataSet(productsDataSet,"Products",insertCommand,updateCommand,

deleteCommand,UpdateBehavior.Standard);

returnrowsAffected;}通过ID获取记录详细信息publicstringGetProductDetails(intproductID){

//CreatetheDatabaseobject,usingthedefaultdatabaseservice.The

//defaultdatabaseserviceisdeterminedthroughconfiguration.

Databasedb=DatabaseFactory.CreateDatabase();

stringsqlCommand="GetProductDetails";

DbCommanddbCommand=db.GetStoredProcCommand(sqlCommand);

//Addparamters

//Inputparameterscanspecifytheinputvalue

db.AddInParameter(dbCommand,"ProductID",DbType.Int32,productID);

//Outputparametersspecifythesizeofthereturndata

db.AddOutParameter(dbCommand,"ProductName",DbType.String,50);

db.AddOutParameter(dbCommand,"UnitPrice",DbType.Currency,8);

db.ExecuteNonQuery(dbCommand);

//Rowofdataiscapturedviaoutputparameters

stringresults=string.Format(CultureInfo.CurrentCulture,"{0},{1},{2:C}",

db.GetParameterValue(dbCommand,"ProductID"),

db.GetParameterValue(dbCommand,"ProductName"),

db.GetParameterValue(dbCommand,"UnitPrice"));

returnresults;}以XML格式返回数据publicstringGetProductList(){

//UseanameddatabaseinstancethatreferstoaSQLServerdatabase.

SqlDatabasedbSQL=DatabaseFactory.CreateDatabase()asSqlDatabase;

//Use"FORXMLAUTO"tohaveSQLreturnXMLdata

stringsqlCommand="SelectProductID,ProductName,CategoryID,UnitPrice,LastUpdate"+

"FromProductsFORXMLAUTO";

DbCommanddbCommand=dbSQL.GetSqlStringCommand(sqlCommand);

XmlReaderproductsReader=null;

StringBuilderproductList=newStringBuilder();

try

{

productsReader=dbSQL.ExecuteXmlReader(dbCommand);

//IteratethroughtheXmlReaderandputthedataintoourresults.

while(!productsReader.EOF)

{

if(productsReader.IsStartElement())

{

productList.Append(productsReader.ReadOuterXml());

productList.Append(Environment.NewLine);

}

}

}

finally

{

//ClosetheReader.

if(productsReader!=null)

{

productsReader.Close();

}

//Explicitlyclosetheconnection.Theconnectionisnotclosed

//whentheXmlReaderisclosed.

if(dbCommand.Connection!=null)

{

dbCommand.Connection.Close();

}

}

returnproductList.ToString();}使用事务publicboolTransfer(inttransactionAmount,intsourceAccount,intdestinationAccount){

boolresult=false;

//CreatetheDatabaseobject,usingthedefaultdatabaseservice.The

//defaultdatabaseserviceisdeterminedthroughconfiguration.

Databasedb=DatabaseFactory.CreateDatabase();

//Twooperations,onetocreditanaccount,andonetodebitanother

//account.

stringsqlCommand="CreditAccount";

DbCommandcreditCommand=db.GetStoredProcCommand(sqlCommand);

db.AddInParameter(creditCommand,"AccountID",DbType.Int32,sourceAccount);

db.AddInParameter(creditCommand,"Amount",DbType.Int32,transactionAmount);

sqlCommand="DebitAccount";

DbCommanddebitCommand=db.GetStoredProcCommand(sqlCommand);

db.AddInParameter(debitCommand,"AccountID",DbType.Int32,destinationAccount);

db.AddInParameter(debitCommand,"Amount",DbType.Int32,transactionAmount);

using(DbConnectionconnection=db.CreateConnection())

{

connection.Open();

DbTransactiontransaction=connection.BeginTransaction();

try

{

//Creditthefirstaccount

db.ExecuteNonQuery(creditCommand,transaction);

//Debitthesecondaccount

db.ExecuteNonQuery(debitCommand,transaction);

//Committhetransaction

transaction.Commit();

result=true;

}

catch

{

//Rollbacktransaction

transaction.Rollback();

}

connection.Close();

returnresult;

}}三.常见功能1.创立Database对象创立一个默认的Database对象DatabasedbSvc=DatabaseFactory.CreateDatabase();默认的数据库在配置文件中:<dataConfigurationdefaultDatabase="DataAccessQuickStart"/>创立一个实例Database对象//Useanameddatabaseinstancethatreferstoanarbitrarydatabasetype,//whichisdeterminedbyconfigurationinformation.DatabasemyDb=DatabaseFactory.CreateDatabase("DataAccessQuickStart");创立一个具体的类型的数据库对象//CreateaSQLdatabase.SqlDatabasedbSQL=DatabaseFactory.CreateDatabase("DataAccessQuickStart")asSqlDatabase;2.创立DbCommand对象静态的SQL语句创立一个DbCommandDatabasedb=DatabaseFactory.CreateDatabase();stringsqlCommand="SelectCustomerID,LastName,FirstNameFromCustomers";DbCommanddbCommand=db.GetSqlStringCommand(sqlCommand);存储过程创立一个DbCommandDatabasedb=DatabaseFactory.CreateDatabase();DbCommanddbCommand=db.GetStoredProcCommand("GetProductsByCategory");3.管理对象当连接对象翻开后,不需要再次连接Databasedb=DatabaseFactory.CreateDatabase();stringsqlCommand="SelectProductID,ProductNameFromProducts";DbCommanddbCommand=db.GetSqlStringCommand(sqlCommand);//Noneedtoopentheconnection;justmakethecall.DataSetcustomerDataSet=db.ExecuteDataSet(dbCommand);使用Using及早释放对象Databasedb=DatabaseFactory.CreateDatabase();DbCommanddbCommand=db.GetSqlStringCommand("SelectName,AddressFromCustomers");using(IDataReaderdataReader=db.ExecuteReader(dbCommand)){//Processresults}4.参数处理Database类提供了如下的方法,用于参数的处理:AddParameter.传递参数给存储过程AddInParameter.传递输入参数给存储过程AddOutParameter.传递输出参数给存储过程GetParameterValue.得到指定参数的值SetParameterValue.设定参数值使用例如如下:Databasedb=DatabaseFactory.CreateDatabase();stringsqlCommand="GetProductDetails";DbCommanddbCommand=db.GetStoredProcCommand(sqlCommand);db.AddInParameter(dbCommand,"ProductID",DbType.Int32,5);db.AddOutParameter(dbCommand,"ProductName",DbType.String,50);db.AddOutParameter(dbCommand,"UnitPrice",DbType.Currency,8);Databasedb=DatabaseFactory.CreateDatabase();DbCommandinsertCommand=db.GetStoredProcCommand("AddProduct");db.AddInParameter(insertCommand,"ProductName",DbType.String,"ProductName",DataRowVersion.Current);db.AddInParameter(insertCommand,"CategoryID",DbType.Int32,"CategoryID",DataRowVersion.Current);db.AddInParameter(insertCommand,"UnitPrice",DbType.Currency,"UnitPrice",DataRowVersion.Current);四.使用场景DAAB2.0是对ADO.NET2.0的补充,它允许你使用相同的数据访问代码来支持不同的数据库,您通过改变配置文件就在不同的数据库之间切换。目前虽然只提供SQLServer和Oracle的支持,但是可以通过GenericDatabase和ADO.NET2.0下的DbProviderFactory对象来增加对其他数据库的支持。如果想要编写出来的数据库访问程序具有更好的移植性,则DAAB2.0是一个不错的选择,但是如果您想要针对特定数据库的特性进行编程,就要用ADO.NET了。参考:EnterpriseLibaray–January2006帮助文档及QuickStart好,看到这里俺应该根本懂得使用了,俺就动手试一下SQL和ACCESS数据库自由切换的方法,因俺平时的习惯是使用写东西,所以只写出的代码出来,有兴趣的自己改成C#好了,看以下html代码:<%...@PageLanguage="VB"AutoEventWireup="false"CodeFile="sql.aspx.vb"Inherits="sql"%><!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN"""><html

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论