ADO.NET 的DataReader 和事务处理

      在做数据库课程设计的时候遇到两个问题,第一个是如何在打开一个数据库连接的情况下如何执行两个select语句,第二个是借书的过程中要涉及多个表,如何在借书失败时,将已经修改的表恢复呢?
       解决方法原来是这样的:
       对于第一个问题:我们可以使用DataReader的NextResult()方法.只需要复给SqlCommand对象两个SQL SELECT语句,调用DataReader的俄ExecuteReader方法时将返回两个结果集,再使用SqlDataReader的Nextresult方法,就可以使数据读取器前进到下一个结果集,这样就实现了一次执行了多条SQL语句.最后关闭SQL连接就OK了.
       看看例子:
SqlConnection sqlconn  =   new  SqlConnection();
        sqlconn.ConnectionString 
=   " 数据库连接字符串 " ;

        SqlCommand cmd 
=   new  SqlCommand();
        cmd.CommandText 
=   " SELECT CustomerCode,CustomerName FORM Customer; "   +   " SELECT EmployeeCode,EmployeeName FORM Employee " ;
        cmd.Connection 
=  sqlconn;
        sqlconn.Open();
        SqlDataReader rd 
=  cmd.ExecuteReader();
        
try
        
{
            
do
            
{
                
while (rd.Read())
                
{
                    Console.WriteLine(
"{0}-{1}", rd.GetString(0), rd.GetString(1));
                }

                rd.Close();

            }

            
while (rd.NextResult());
            rd.Close();
        }

        
catch
        
{
            
throw;
        }

        
finally
        
{
            sqlconn.Close();
        }

      第二个问题:借书过程中,我们要修改图书信息,读者借阅列表,如果中途出错,可数据库已经修改了部分,这显然是不行的.用一个更简单的例子比喻,就像是银行转帐,A先在A账户上划走100元,B再在B帐户上添加100元,可是B银行由于某种原因添加失败,这样转账没有成功,那就需要回滚,将A的操作也注销掉.这样就需要用到事务(Transaction).
      1.使用Connection对象的BeginTransaction方法创建事务;
      2.通过设置Command对象的Transaction属性来把需要在事务中执行的数据库操作命令登记到事务中;
      3.执行Command对象;
      4.Commit事务或者Rollback事务;
代码:
 1         SqlConnection sqlconn  =   new  SqlConnection( " 数据库连接字符串 " );
 2         sqlconn.Open();
 3
 4          string  insertStr = " Inser into Customers(CustomerID,CompanyName) VALUES ('CITIC','农业银行') " ;
 5         SqlCommand insertCmd  =   new  SqlCommand(insertStr, sqlconn);
 6
 7          string  updateStr  =   " UPDATE Customers SET CompanyName='中国银行' WHERE CustomerID='CITIC' " ;
 8         SqlCommand updateCmd  =   new  SqlCommand(updateStr, sqlconn);
 9
10          // 创建事务
11         SqlTransaction myTrans  =  sqlconn.BeginTransaction();
12          // 将Cmd对象登记到事务中
13         insertCmd.Transaction  =  myTrans;
14         updateCmd.Transaction  =  myTrans;
15
16          try
17          {
18            insertCmd.ExecuteNonQuery();
19            updateCmd.ExecuteNonQuery();
20            myTrans.Commit();
21
22        }

23          catch  (Exception ex)
24          {
25            myTrans.Rollback();
26        }

27          finally
28          {
29            sqlconn.Close();
30        }

转载于:https://www.cnblogs.com/zhangyue/archive/2008/03/24/1120074.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值