企业库数据库访问模块通过抽象工厂模式,允许用户通过简单的配置选择不同的数据库作为程序的数据源,大大解决了切换数据库时带来的麻烦.因为我本机只安装了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());
}
}

出处:http://www.cnblogs.com/huangcong/archive/2010/05/31/1748672.html 请输
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

Microsoft Enterprise Library 5.0 系列(五) Data Access Application Block相关推荐

  1. 黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (高级)

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (高级) 本章介绍的是企业库加密应用程序模块 ...

  2. Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (初级)

    企业库加密应用程序模块提供了2种方式让用户保护自己的数据: Hashingproviders:  离散加密法, 简单来说就是把你的信息保存到内存中后用一个离散值表示并返回给程序,这样在程序中只能看到离 ...

  3. 黄聪:Microsoft Enterprise Library 5.0 系列教程(四) Logging Application Block

    企业库日志应用程序模块工作原理图:   从上图我们可以看清楚企业库日志应用程序模块的工作原理,其中LogFilter,Trace Source,Trace Listener,Log Formatter ...

  4. 黄聪:Microsoft Enterprise Library 5.0 系列教程(七) Exception Handling Application Block

    黄聪:Microsoft Enterprise Library 5.0 系列教程(七) Exception Handling Application Block 原文:黄聪:Microsoft Ent ...

  5. 黄聪mysql_黄聪:Microsoft Enterprise Library 5.0 系列教程(五) Data Acc

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

  6. Microsoft Enterprise Library 5.0 系列(二) Cryptography Application Block (初级)

    企业库加密应用程序模块提供了2种方式让用户保护自己的数据: Hashingproviders:  离散加密法, 简单来说就是把你的信息保存到内存中后用一个离散值表示并返回给程序,这样在程序中只能看到离 ...

  7. Microsoft Enterprise Library 5.0 系列(十) Configuration Application Block

    到目前为止,我们使用的模块都是在同一个配置文件中,这显然是不灵活的,我们希望每个功能模块能独立的在一个配置文件中体现,这样不仅易于管理,易于扩展,也易于阅读和分类.企业库当然考虑到了这个问题并且提供了 ...

  8. Microsoft Enterprise Library 5.0 系列(四) Logging Application Block

    企业库日志应用程序模块工作原理图: 从上图我们可以看清楚企业库日志应用程序模块的工作原理,其中LogFilter,Trace Source,Trace Listener,Log Formatter的信 ...

  9. 黄聪:Microsoft Enterprise Library 5.0 系列教程(九) Policy Injection Application Block

    代理对象(Proxy Object)会通过Handler链定位到真实对象(Real Object),而Policy则被注入到代理对象和真实对象中.整个流程如图: 我个人对Policy Injectio ...

最新文章

  1. R语言ggplot2可视化在特定数据点添加竖直的虚线实战:Add a dotted vertical line on certain x-axis values
  2. Linux系统16进制形式查看二进制文件
  3. 优化春运服务 北京铁路局在车站设置哺乳室等设施
  4. 活动 | Daung~!他们用产品思维改变医疗挂号问题
  5. Vue钩子函数mounted实现进入页面立即查询的功能案例
  6. Python selenium —— 用chrome的Mobile emulation模拟手机浏览器测试手机网页
  7. c得到当前时分秒 linux_Linuxc - Linux系统下的时间知识点
  8. 外贸网站建设(转自xmfish)
  9. 易宝典文章——怎样配置TMG能够使外部用户成功访问Outlook Anywhere?
  10. poj 2417 Discrete Logging
  11. 如何自动升级php数据库,php – 如何在现实世界中“升级”数据库?
  12. Linux开发环境的搭建和使用——Linux本必备软件SSH
  13. IEEE-access 模板LaTeX Error: Something's wrong--perhaps a missing \item.
  14. python神经网络编程 豆瓣,神经网络算法python实现
  15. 苹果如何将图片转换为文字手机
  16. 【Pandas 基础应用 拆分Excel工作簿】
  17. 【threejs开发随笔】three.js基于八叉树的碰撞检测
  18. 妙用Java 8中的 Function接口 消灭if...else...
  19. 腾讯云数据库 CynosDB应用场景与产品优势有哪些?
  20. java集成腾讯地图并获取用户附近商家

热门文章

  1. 埃及分数(信息学奥赛一本通-T1444)
  2. vue子组件赋值props_vue 父子传值props赋值失效问题
  3. 一起学习C语言:初谈指针(一)
  4. 字符串16进制数字转换到Ascll字符串
  5. 校园网下载IEEE论文
  6. pytorch1.7教程实验——DCGAN生成对抗网络
  7. cycleGAN的改进文章(CyCADA + U-GAT-IT)
  8. wine mac 中文 方块乱码 解决
  9. TypeScript接口
  10. c++for循环求最大公约数_C/C++编程笔记:C语言 for 循环精讲!实例讲解带你吃透...