推荐下载EnterpriseLibrary 20企业库常用方法 精品.docx
《推荐下载EnterpriseLibrary 20企业库常用方法 精品.docx》由会员分享,可在线阅读,更多相关《推荐下载EnterpriseLibrary 20企业库常用方法 精品.docx(23页珍藏版)》请在冰豆网上搜索。
推荐下载EnterpriseLibrary20企业库常用方法精品
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、创建Dbmand
Dbmand的创建方式有两种:
一种是为了调用存储过程创建,一种是为了执行一般的SQL语句而创建,具体用哪一种方式,就要看你需要执行的是存储过程还是SQL语句了。
//创建一个SQL语句的Dbmand
Databasedb=DatabaseFactory.CreateDatabase();
stringsql="Select*fromperson";
DbmandSqldbm=db.GetSqlStringmand(sql);
//创建一个存储过程的Dbmand
//存储过程名称为GetAllPersonByName
stringproame="GetAllPersonByName";
DbmandProcdbm=db.GetStoredProcmand(proame);
3、存储过程中的参数处理
DataBase类中包含多种传递存储过程参数的方法,也包含了得到和设置参数值的方法,如下:
AddParameter.为存储过程传递一个参数(输入型或输出型)
AddInParameter.为存储过程传递一个输入型参数
AddOutParameter.为存储过程传递一个输出型参数
GetParameterValue.获取某存储过程指定参数的值
SetParameterValue.为存储过程的某个参数赋值,当你需要用同一个方法来执行插入多条记录时,就可参数给参数赋值的方法来进行
//创建一个存储过程的Dbmand
//存储过程名称为GetAllPersonByName
stringproame="GetAllPersonByName";
DbmandProcdbm=db.GetStoredProcmand(proame);
//添加一个输入型的参数
db.AddInParameter(Procdbm,"@sex",DbType.String);
//添加一个输出型的参数
db.AddOutParameter(Procdbm,"@name",DbType.String,20);
//设置参数的值
db.SetParameterValue(Procdbm,"@sex","男");
//执行存储过程
db.ExecuteNonQuery(Procdbm);
//得到输出参数的值,注意转化返回值类型
stringoutvalue=(string)db.GetParameterValue(Procdbm,"@name");
4、执行ExecuteReader方法返回一个IDataReader类型的数据集
因为ExecuteReader方法在一开始执行时就打开了一个与数据库的连接,所以我们必须注意在使用结束时关闭连接,而用using(){}语句块就能确保ExecuteReader方法在执行完毕时关闭与数据库的连接。
什么时候使用此方法:
返回的数据仅仅用来显示,并不对其进行修改,删除等操作;
绑定返回的数据到WebFormControl
不需要缓存返回的数据,用完就释放
using(IDataReaderreader=db.ExecuteReader(mandType.Text,"select*fromperson"))
{
DataGrid1.DataSource=reader;
DataGrid1.DataBind();
}
5、执行ExecuteDataSet方法返回一个DataSet
publicDataSetGetPersonList()
{
Databasedb=DatabaseFactory.CreateDatabase();
Dbmanddbm=db.GetSqlStringmand("select*fromperson");
returndb.ExecuteDataSet(dbm);
}
什么时候使用此方法:
需要返回多表数据;
如果你需要逐一访问数据库的每一条记录,这个时候如果使用DataReader的话,则会使与数据库的连接一直处于打开的状态,长此以往,就会使应用程序的性能和可伸缩性大大降低;
需要和其他的应用程序交换数据;
6、执行ExecuteNonQuery
该方法返回的是SQL语句执行影响的行数,我们可以利用该方法来执行一些没有返回值的操作(Insert,Update,Delete)
publicvoidAddPerson()
{
Databasedb=DatabaseFactory.CreateDatabase();
Dbmanddbm=db.GetSqlStringmand("insertintopersonvalues(1,'shy','女','123456')");
db.ExecuteNonQuery(dbm);
}
7、执行ExecuteScalar返回单值
publicstringGetPersonName()
{
Databasedb=DatabaseFactory.CreateDatabase();
Dbmanddbm=db.GetSqlStringmand("selectnamefromperson");
return(string)db.ExecuteScalar(dbm);
}
8、事务处理
publicvoidUseTransaction()
{
Databasedb=DatabaseFactory.CreateDatabase();
Dbmanddbm1=db.GetSqlStringmand("updatepersonsetname='pw'");
Dbmanddbm2=db.GetSqlStringmand("deletefrompersonwhereid=1");
using(DbConnectionconn=db.CreateConnection())
{
//打开连接
conn.Open();
//创建事务
DbTransactiontrans=conn.BeginTransaction();
try
{
db.ExecuteNonQuery(dbm1);
db.ExecuteNonQuery(dbm2);
//都执行成功则提交事务
trans.mit();
}
catch(Exception)
{
//发生异常,事务回滚
trans.Rollback();
}
//关闭连接
conn.Close();
}
}
9、执行ExecuteXmlReader返回XML数据
支持SqlServer2000及以后版本的数据库,对微软以外的数据库应该不支持。
publicvoidUseXMLReader()
{
SqlDatabasedbSQL=DatabaseFactory.CreateDatabase("ConnectionString")asSqlDatabase;
//要返回XML数据需要在SQL语句后加FORXMLAUTO
stringsqlmand="SELECTProductID,ProductNameFROMProductsFORXMLAUTO";
Dbmanddbmand=dbSQL.GetSqlStringmand(sqlmand);
XmlReaderpersonReader=null;
StringBuilderpersonlist=newStringBuilder();
try
{
personReader=dbSQL.ExecuteXmlReader(dbmand);
//循环向XML中写入我们查询得到的数据
while(!
personReader.EOF)
{
if(personReader.IsStartElement())
{
personlist.Append(personReader.ReadOuterXml());
personlist.Append(Environment.NewLine);
}
}
}
finally
{
//关闭Reader.
if(personReader!
=null)
{
personReader.Close();
}
//关闭数据库连接
if(dbmand.Connection!
=null)
{
dbmand.Connection.Close();
}
}
}
10、用DataSet批量的添加,修改,删除数据
publicvoidUpdateDataBase()
{
Databasedb=DatabaseFactory.CreateDatabase();
DataSetpersonDataSet=newDataSet();
stringsqlmand="Select*fromperson";
Dbmanddbmand=db.GetSqlStringmand(sqlmand);
stringpersonTable="person";
//得到初始化数据
db.LoadDataSet(dbmand,personDataSet,personTable);
//得到未修改前的数据集
DataTabletable=personDataSet.Tables[personTable];
//往DataSet中添加一行数据
DataRowaddedRow=table.Rows.Add(newobject[]{18,"Newperson","男","654321"});
//修改
table.Rows[0]["ProductName"]="Modifiedproduct";
//下面分别创建添加,修改,删除的操作
Dbmandinsertmand=db.GetStoredProcmand("AddPerson");
db.AddInParameter(insertmand,"Name",DbType.String,"Name",DataRowVersion.Current);
db.AddInParameter(insertmand,"Sex",DbType.String,"Sex",DataRowVersion.Current);
db.AddInParameter(insertmand,"ID",DbType.Int32,"ID",DataRowVersion.Current);
Dbmanddeletemand=db.GetStoredProcmand("DeletePerson");
db.AddInParameter(deletemand,"ID",DbType.Int32,"ID",DataRowVersion.Current);
Dbmandupdatemand=db.GetStoredProcmand("UpdatePerson");
db.AddInParameter(updatemand,"Name",DbType.String,"Name",DataRowVersion.Current);
db.AddInParameter(updatemand,"Sex",DbType.String,"Sex",DataRowVersion.Current);
db.AddInParameter(insertmand,"ID",DbType.Int32,"ID",DataRowVersion.Current);
//提交对DataSet的修改,并返回影响的行数
introwsAffected=db.UpdateDataSet(productsDataSet,"Products",insertmand,updatemand,deletemand,Microsoft.Practices.EnterpriseLibrary.Data.UpdateBehavior.Standard);
}
//-->
EnterpriseLibrary2.0数据库常用操作2(不同版本的解释)
今天学习了EnterpriseLibrary2.0的DataAccessApplicationBlock,DataAccessApplicationBlock提供了通用的数据访问的功能,随着2.0版本的推出有了很大变化。
俺就多写了对SQL和ACCESS数据库自由切换的一些代码出来共享。
先看完原文再接俺的代码吧。
一.改进
在DAAB1.1里面我们知道Database方法返回或者创建一个DBmandWrapper对象,而在DAAB2.0里面移除了DBmandWrapper类,用ADO.NET2.0里面的DBmand类代替实现类似的功能,这样使得DAAB跟我们的.NET类库的结合更加紧密,回忆一下我们在1.1里面用DBmandWrapper来访问数据时的代码:
二.使用示例
Databasedb=DatabaseFactory.CreateDatabase();
DBmandWrapperdbmand=db.GetStoredProcmandWrapper("GetProductsByCategory");
dbmand.AddInParameter("CategoryID",DbType.Int32,Category);
DataSetproductDataSet=db.ExecuteDataSet(dbmand);
而用了新的DBmand类之后则变成了:
Databasedb=DatabaseFactory.CreateDatabase();
Dbmanddbmand=db.GetStoredProcmand("GetProductsByCategory");
db.AddInParameter(dbmand,"CategoryID",DbType.Int32,Category);
DataSetproductDataSet=db.ExecuteDataSet(dbmand);
数据库连接字符串在我们基于数据库的开发永远是少不了的,但是在DAAB1.1下,它所使用的字符串跟我们在.NET类库中使用的连接字符串却是不能共享的,它们分别保存在不同的位置。
而在2.0的DataAccessApplicationBlock使用了ADO.NET2.0里面配置区,这样带来的一个好处是连接字符串可以在ApplicationBlock和自定义的.NET类之间共享使用该配置区,如:
name="DataAccessQuickStart"
providerName="System.Data.SqlClient"
connectionString="server=(local)\SQLEXPRESS;database=EntLibQuickStarts;IntegratedSecurity=true"/>
在.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语句创建Dbmand对象
stringsqlmand="SelectCustomerID,Name,Address,City,Country,PostalCode"+
"FromCustomers";
Dbmanddbmand=db.GetSqlStringmand(sqlmand);
StringBuilderreaderData=newStringBuilder();
//调用ExecuteReader方法
using(IDataReaderdataReader=db.ExecuteReader(dbmand))
{
while(dataReader.Read())
{
//Getthevalueofthe'Name'columnintheDataReader
readerData.Append(dataReader["Name"]);
readerData.Append(Environment.NewLine);
}
}
returnreaderData.ToString();
}
执行存储过程并传递参数,返回DataSet
publicDataSetGetProductsInCategory(intCategory)
{
//CreatetheDatabaseobject,usingthedefaultdatabaseservice.The
//defaultdatabaseserviceisdeterminedthroughconfiguration.
Databasedb=DatabaseFactory.CreateDatabase();
stringsqlmand="GetProductsByCategory";
Dbmanddbmand=db.GetStoredProcmand(sqlmand);
//Retrieveproductsfromthespecifiedcategory.
db.AddInParameter(dbmand,"CategoryID",DbType.Int32,Category);
//DataSetthatwillholdthereturnedresults
DataSetproductsDataSet=null;
productsDataSet=db.ExecuteDataSet(dbmand);
//Note:
connectionwasclosedbyExecuteDataSetmethodcall
returnproductsDataSet;
}
利用DataSet更新数据
publicintUpdateProducts()
{
//CreatetheDatabaseobject,usingthedefaultdatabaseservice.The
//defaultdatabaseserviceisdeterminedthroughconfiguration.
Databasedb=DatabaseFactory.CreateDatabase();
DataSetproductsDataSet=newDataSet();
stringsqlmand="SelectProductID,ProductName,CategoryID,UnitPrice,LastUpdate"+
"FromProducts";
Dbmanddbmand=db.GetSqlStringmand(sqlmand);
stringproductsTable="Products";
//Retrievetheinitialdata
db.LoadDataSet(dbmand,productsDataSet,productsTable);
//Getthetablethatwillbemodified
DataTabletable=productsDataSet.Tables[productsTable];
//