微软企业库5.0学习笔记(三十五)数据访问模块 DataSet以及数据库事务

  使用DataSet进行工作

  使用Database类的ExecuteDataSet方法获取DataSet对象,在DataSet对象中,默认的表名称依次为Table,Table1,Table2.。。。。。。。。。。。。

  如果你想要将数据加载到一个已经存在的DataSet对象中,可以使用LoadDataSet方法。

  

ExpandedBlockStart.gif 代码
<!--<br/ /> <br/ /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ /> http://www.CodeHighlighter.com/<br/ /> <br/ /> --> DataSet productDataSet;
//  Using a SQL statement and a parameter array.
productDataSet  =  db.ExecuteDataSet(CommandType.Text,  " GetProductsByCategory " ,
new  Object[] {  " %bike% "  });
//  Using a stored procedure and a parameter array.
productDataSet  =  db.ExecuteDataSet( " GetProductsByCategory " ,
new  Object[] {  " %bike% "  });
//  Using a stored procedure and a named parameter.
DbCommand cmd  =  db.GetStoredProcCommand( " GetProductsByCategory " );
db.AddInParameter(cmd, 
" CategoryID " , DbType.Int32,  7 );
productDataSet 
=  db.ExecuteDataSet(cmd);
  

 

  将DataSet中的数据更新回数据库

  如果要更新数据库,可以使用Database的UpdateDataSet方法,返回受影响的行数总和。

  有一个参数是UpdateBehavior,决定了更新目标数据库表的方式。包括下面的几个值:

  Standard:如果更新失败,停止更新。

  Continue:如果更新失败,将继续其他的更新。

  Transactional:如果更新失败,所有的操作都将回滚。

  另外你还可以为UpdateDataSet方法的UpdateBatchSize参数提供一个值,设置更新方式为批量更新而不是一个一个的发送到数据库。这么做更高效,但是返回值就是最后一次批量发送的影响行数了,而不是所有的更新总数。

  加载数据到一个已经存在的DataSet  

 

ExpandedBlockStart.gif 代码
<!--<br/ /> <br/ /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ /> http://www.CodeHighlighter.com/<br/ /> <br/ /> --> string  selectSQL  =   " SELECT Id, Name, Description FROM Products WHERE Id > 90 " ;
//  Fill a DataSet from the Products table using the simple approach
DataSet simpleDS  =  defaultDB.ExecuteDataSet(CommandType.Text, selectSQL);
DisplayTableNames(simpleDS, 
" ExecuteDataSet " );
//  Fill a DataSet from the Products table using the LoadDataSet method
//  This allows you to specify the name(s) for the table(s) in the DataSet
DataSet loadedDS  =   new  DataSet( " ProductsDataSet " );
defaultDB.LoadDataSet(CommandType.Text, selectSQL, loadedDS,
new   string [] {  " Products "  });
DisplayTableNames(loadedDS, 
" LoadDataSet " );

 

  更新数据库UpdateDataSet

 

ExpandedBlockStart.gif 代码
<!--<br/ /> <br/ /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ /> http://www.CodeHighlighter.com/<br/ /> <br/ /> --> string  addSQL  =   " INSERT INTO Products (Name, Description) VALUES (@name,
@description); " ;
string  updateSQL  =   " UPDATE Products SET Name = @name, Description = @description
WHERE Id  =  @id " ;
string  deleteSQL  =   " DELETE FROM Products WHERE Id = @id " ;
//  Create the commands to update the original table in the database
DbCommand insertCommand  =  defaultDB.GetSqlStringCommand(addSQL);
defaultDB.AddInParameter(insertCommand, 
" name " , DbType.String,  " Name " ,
DataRowVersion.Current);
defaultDB.AddInParameter(insertCommand, 
" description " , DbType.String,
" Description " , DataRowVersion.Current);
DbCommand updateCommand 
=  defaultDB.GetSqlStringCommand(updateSQL);
defaultDB.AddInParameter(updateCommand, 
" name " , DbType.String,  " Name " ,
DataRowVersion.Current);
defaultDB.AddInParameter(updateCommand, 
" description " , DbType.String,
" Description " , DataRowVersion.Current);
defaultDB.AddInParameter(updateCommand, 
" id " , DbType.String,  " Id " ,
DataRowVersion.Original);
DbCommand deleteCommand 
=  defaultDB.GetSqlStringCommand(deleteSQL);
defaultDB.AddInParameter(deleteCommand, 
" id " , DbType.Int32,  " Id " ,
DataRowVersion.Original);
Finally, you can apply the changes by calling the UpdateDataSet method, 
as  shown here.
//  Apply the updates in the DataSet to the original table in the database
int  rowsAffected  =  defaultDB.UpdateDataSet(loadedDS,  " Products " ,
insertCommand, updateCommand, deleteCommand,
UpdateBehavior.Standard);
Console.WriteLine(
" Updated a total of {0} rows in the database. " , rowsAffected);

 

 

 

  以数据库连接为基础的事务操作

  就是操作一个数据库,以一个数据库连接为基础。

  一个常用的数据库解决方案,都会包括一些事务的处理,例如银行的转账。

  事务要满足ACID原则:

  Atomicity,原子性,所有的操作要么都成功,要么都失败。

  Consistency,一致性,数据在事务之前和之后保持数据的一致性。  

  Isolation,隔离性,在事务操作的过程中,其他操作不能访问和查看数据。

  Durability,一旦事务成功,在系统中产生的变化将是永久的。

  详细介绍参看:http://www.360doc.com/content/08/0426/18/61497_1217187.shtml

  

ExpandedBlockStart.gif 代码
<!--<br/ /> <br/ /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ /> http://www.CodeHighlighter.com/<br/ /> <br/ /> --> using  (DbConnection conn  =  db.CreateConnection())
{
conn.Open();
DbTransaction trans 
=  conn.BeginTransaction();
try
{
//  execute commands, passing in the current transaction to each one
db.ExecuteNonQuery(cmdA, trans);
db.ExecuteNonQuery(cmdB, trans);
trans.Commit(); 
//  commit the transaction
}
catch
{
trans.Rollback(); 
//  rollback the transaction
}
}
  

 

  分布式的事务

  如果你的事务包含了访问不同的数据库,或者是包括了消息队列的访问,你必须使用分布式的事务。例如windows的Distributed transaction coordinator(DTC)服务。

  使用TransactionScope类

  

<!--<br/ /> <br/ /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ /> http://www.CodeHighlighter.com/<br/ /> <br/ /> --> using  (TransactionScope scope
=   new  TransactionScope(TransactionScopeOption.RequiresNew))
{
//  perform data access here
}

 

  扩展模块使用其他类型的数据库

  企业库默认支持SQL Server、Oracle和SQL CE。但是你可以扩展来支持更多的数据库。自定义一个provider或者是引入第三方的provider。

  如果是自定义一个provider,你可以继承Database类,然后重写里面的一些方法。在方法中处理一些细节,例如返回值,参数的前缀(@),数据类型转换,和其他的一些相关因素。

 

  未完待续。。。。。。。。。。。。。。。。。。。。。。  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值