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

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

(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());
}
}
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值