Microsoft Enterprise Library 5.0 系列(五) Data Access Application Block

本文详细介绍了 Microsoft Enterprise Library 5.0 中的数据库访问模块,包括其功能、使用方法以及如何配置和实现事务、异步访问数据库等特性。通过实例演示了如何使用模块执行 SQL 语句、返回数据集、获取特定信息、执行存储过程、更新数据库、XML 化数据以及数据对象化等操作。

企业库数据库访问模块通过抽象工厂模式,允许用户通过简单的配置选择不同的数据库作为程序的数据源,大大解决了切换数据库时带来的麻烦.因为我本机只安装了SQL Server 2005,所以在此只做SQL的演示,需要深究的朋友可以访问以下网站:

http://msdn.microsoft.com/en-us/library/ff664408%28v=PandP.50%29.aspx

 

企业库数据库访问模块的几大功能:

1.        最简单的功能,通过ExecuteNonQuery.方法执行SQL语句.

2.        执行ExecuteDataSet,返回DataSet类型的数据集.

3.        执行ExecuteScalar,获取返回的第一行第一列的信息.

4.        执行存储过程.

5.        通过代码实现事务.

6.        通过DataSet更新数据库.

7.        返回值XML化.

8.       将返回的数据对象化.

9.       异步访问数据库.


以上的功能我会在下面一一介绍,测试程序我已打包,大家可以 点击这里下载.


下面介绍如何使用Microsoft Enterprise Library 5.0中的数据库访问模块.

1.   首先创建一个测试数据库,创建数据库的SQL文件我打包在压缩包里了,大家可以点击上面的下载链接下载.执行完SQL文件后,可以看到我们创建好的TestDB数据库:

2.   下载安装好MicrosoftEnterprise Library 5.0,然后在运行EntLibConfig.exe,选择Blocks菜单 ,单击 AddDatabase Settings .


3.    配置好文件之后保存为App.config文件,并添加到创建好的应用程序中.并添加相应的引用,在此我不再多讲,大家下载我打包好的程序运行即可看到

 

4.      下面来介绍我在应用程序中实现的各个功能:

(1)     通过ExecuteNonQuery.方法执行SQL语句:      

     
/// <summary> /// 执行ExecuteNonQuery /// </summary> private void ExecuteNonQuery_Click(object sender, EventArgs e) { db.ExecuteNonQuery(CommandType.Text, "INSERT INTO [College] ([CollegeID],[Name]) values (6,'体育学院')"); }
   

(2)    执行ExecuteDataSet,返回DataSet类型的数据集.

     
/// <summary> /// 执行ExecuteDataSet,返回College列表 /// </summary> /// <returns></returns> private void ExecuteDataSet_Click(object sender, EventArgs e) { string sql = "select * from College"; DbCommand dw = db.GetSqlStringCommand(sql); dataGridView1.DataSource = db.ExecuteDataSet(dw).Tables[0]; }
  


(3)    执行ExecuteScalar,返回第一行第一列的值. 

     
/// <summary> /// 执行ExecuteScalar,返回第一行第一列的值 /// </summary> /// <returns></returns> private void ExecuteScalar_Click(object sender, EventArgs e) { Database db = DatabaseFactory.CreateDatabase("ConnectionString"); string sql = "select [Name] from College where [CollegeID] = 1"; DbCommand dc = db.GetSqlStringCommand(sql); string str = "获取的学院名称为:" + (string)db.ExecuteScalar(dc); MessageBox.Show(str); sql = "select [CollegeID] from College where [CollegeID] = 1"; dc = db.GetSqlStringCommand(sql); str = "获取的学院ID为:" + (int)db.ExecuteScalar(dc); MessageBox.Show(str); }
 

(4)    执行存储过程.

     
/// <summary> /// 执行存储过程 /// </summary> private void StoredProcCommand_Click(object sender, EventArgs e) { DbCommand dc = db.GetStoredProcCommand("usp_College_LoadByID"); db.AddInParameter(dc, "@CollegeID", System.Data.DbType.Int32, 5); dataGridView1.DataSource = db.ExecuteDataSet(dc).Tables[0]; }
 

(5)    通过代码实现事务.

     
/// <summary> /// 事务 /// </summary> private void Transaction_Click(object sender, EventArgs e) { DbCommand dc1 = db.GetStoredProcCommand("usp_College_Insert"); db.AddInParameter(dc1, "@CollegeID", DbType.Int32, 7); db.AddInParameter(dc1, "@Name", DbType.String, "文旅学院"); DbCommand dc2 = db.GetStoredProcCommand("usp_College_Insert"); db.AddInParameter(dc2, "@CollegeID", DbType.Int32, 7); db.AddInParameter(dc2, "@Name", DbType.String, "化工学院"); using (DbConnection conn = db.CreateConnection()) { conn.Open(); DbTransaction trans = conn.BeginTransaction(); try { //添加一个ID为7的学院 db.ExecuteNonQuery(dc1, trans); //添加一个ID为7的学院,主键重复,事务将回滚 db.ExecuteNonQuery(dc2, trans); //提交事务. trans.Commit(); } catch { //回滚 trans.Rollback(); } conn.Close(); } //查看数据库,数据未被添加,说明事务已回滚 ExecuteDataSet_Click(null, null); }
 

(6)    通过DataSet更新数据库.

     
/// <summary> /// 通过DataSet更新数据库 /// </summary> private void DataSetUpdate_Click(object sender, EventArgs e) { DataSet productsDataSet = new DataSet(); string sql = "Select * From College"; DbCommand cmd = db.GetSqlStringCommand(sql); string CollegeTableName = "College"; //恢复原始数据 db.LoadDataSet(cmd, productsDataSet, CollegeTableName); //获取数据表格 DataTable dTable = productsDataSet.Tables[CollegeTableName]; //添加一个新信息入DataSet中 DataRow addedRow = dTable.Rows.Add(new object[] { 8, "外国语学院" }); //修改一个原有数据 dTable.Rows[0]["Name"] = "国教院"; //提供插入,更新,删除存储过程 DbCommand insertCommand = db.GetStoredProcCommand("usp_College_Insert"); db.AddInParameter(insertCommand, "@CollegeID", DbType.Int32, "CollegeID", DataRowVersion.Current); db.AddInParameter(insertCommand, "@Name", DbType.String, "Name", DataRowVersion.Current); DbCommand deleteCommand = db.GetStoredProcCommand("usp_College_Delete"); db.AddInParameter(deleteCommand, "@CollegeID", DbType.Int32, "CollegeID", DataRowVersion.Current); DbCommand updateCommand = db.GetStoredProcCommand("usp_College_Update"); db.AddInParameter(updateCommand, "@CollegeID", DbType.Int32, "CollegeID", DataRowVersion.Current); db.AddInParameter(updateCommand, "@Name", DbType.String, "Name", DataRowVersion.Current); //通过DataSet更新数据库 int rowsAffected = db.UpdateDataSet(productsDataSet, CollegeTableName, insertCommand, updateCommand, deleteCommand, Microsoft.Practices.EnterpriseLibrary.Data.UpdateBehavior.Standard); MessageBox.Show("影响的行数:" + rowsAffected); }
 

(7)    返回值XML化.

     
/// <summary> /// 返回值XML化 /// </summary> private void ReturnXML_Click(object sender, EventArgs e) { //使用"FOR XML AUTO"参数使得SQL返回XML格式的信息 SqlDatabase sqldb = (SqlDatabase)DatabaseFactory.CreateDatabase("ConnectionString"); DbCommand cmd = sqldb.GetSqlStringCommand("SELECT * FROM College FOR XML AUTO"); IEnumerable<string> productList; using (var reader = sqldb.ExecuteXmlReader(cmd)) { if (reader.IsStartElement()) { var root = (XElement)XNode.ReadFrom(reader); productList = root.Elements("CollegeID") .Attributes("Name") .Select(a => a.Value).ToArray(); MessageBox.Show(((XElement)root).ToString()); } } }
 

(8)    将返回的数据对象化.

     
/// <summary> /// DataAsObject /// </summary> private void DataAsObject_Click(object sender, EventArgs e) { //将返回的数据对象化 var results = db.ExecuteSprocAccessor<College>("usp_College_LoadAll"); MessageBox.Show(results.ElementAt(0).ToString()); }
 


(9)    异步访问数据库.

     
/// <summary> /// 异步访问数据库 /// </summary> private void Async_Click(object sender, EventArgs e) { //创建新的数据库连接,属性必须添加:Asynchronous Processing=true String connectionString = @"server=(local); database=TestDB; Integrated Security=true; Asynchronous Processing=true"; Database Sqldb = new SqlDatabase(connectionString); DbCommand cmd = Sqldb.GetStoredProcCommand("usp_College_LoadbyID"); Sqldb.AddInParameter(cmd, "@CollegeID", DbType.Int32, 1); try { IAsyncResult result = Sqldb.BeginExecuteReader(cmd, MyEndExecuteCallback, Sqldb); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } //当获取完毕执行该函数 private void MyEndExecuteCallback(IAsyncResult result) { try { Database Sqldb = (Database)result.AsyncState; IDataReader reader = db.EndExecuteReader(result); College c = new College((int)reader[0], (string)reader[1]); MessageBox.Show(c.ToString()); } catch(Exception ex) { MessageBox.Show(ex.ToString()); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值