黑马程序员之ADO.NET学习笔记: SqlTransaction(事务)

这篇博客详细介绍了在ADO.NET中如何使用SqlTransaction进行事务处理,包括代码中的事务控制、命名存储点的使用以及SQL语句中的事务操作。通过示例代码展示了如何在发生异常时回滚事务,确保数据一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

------------------------------------------------2345王牌技术员联盟2345王牌技术员联盟、期待与您交流!----------------------------------------------------

1.代码中的事务  

  现在代码中基本使用存储过程来控制事务的处理,通过代码进行控制事务也是我们学习ADO.NET的任务之一!

  事务是在连接对象之后创建,并把它跟命令对象进行关联,使用try.....Catch捕获异常,然后调用RollBack方法回滚事务!

      Commit:提交

      RollBack:回滚

 ///<summary>

 

         ///使用事务

 

         ///</summary>

 

         publicvoid TransactionConn()

 

        {

 

            try

 

           {

 

                SqlConnectionStringBuilderconnBuilder =newSqlConnectionStringBuilder();

 

                connBuilder.DataSource =@"PC2011052108IXK\SQLEXPRESS";

 

                connBuilder.InitialCatalog ="Northwind";

 

                connBuilder.IntegratedSecurity=true;

 

                using (SqlConnection conn =newSqlConnection(connBuilder.ConnectionString))

 

               {

 

                   conn.Open();

 

                   Console.WriteLine("打开成功");

 

                    SqlCommand cmd = conn.CreateCommand();

 

                    //定义事务

 

                   SqlTransaction trans;

 

                    //开始事务,创建事务对象,不可以实例化事务对象

 

                trans = conn.BeginTransaction("MyTransaction"); //通过连接对象创建事务对象

 

                   //把事务对象给执行命令对象

 

                    cmd.Transaction =trans; //把事务跟命令对象进行关联

 

                   //通过异常来发现错误,以至让事务回滚

 

                    try

 

                    {

 

                        //这个是正确

 

                        cmd.CommandText ="INSERT INTO dbo.CustomerDemographics VALUES('B','这是一个不错的东西')";

 

                       cmd.ExecuteNonQuery();

 

                        //由于主键约束,这是错的

 

                        cmd.CommandText ="INSERT INTO dbo.CustomerDemographics VALUES('A','这是一个不错的东西')";

 

                       cmd.ExecuteNonQuery();

 

                        Console.WriteLine("插入成功");

 

                       //提交事务

 

                        trans.Commit(); //这一步很重要

 

                   }

 

                    catch (SqlException ex)

 

                   {

 

                        //失败了就进行回滚

 

                        Console.WriteLine("Error: {0}", ex.Message);

 

                        //回滚

 

                        trans.Rollback();       //事务的重要特性    

 

                        Console.WriteLine("回滚成功");

                   }

 

               }

 

           }

 

            catch (SqlException ex)

 

           {

 

               Console.WriteLine(ex.Message);

 

           }

 

            finally

 

          {


           }


       }

2.事务中的命名存储点 

    一旦你定义了命名存储点,只能回滚命名存储点之后的操作,这是要是情况而使用!

    这种情况是当你调用RollBack方法并重载一个命名存储点的参数,如下代码所示:

     using (SqlConnection conn =new SqlConnection(str))

    {

        conn.Open();

          SqlTransaction transaction = conn.BeginTransaction();

          SqlCommand cmd = conn.CreateCommand();

          cmd.CommandText ="";

          cmd.Transaction = transaction;

          //使用命名存储点

          transaction.Save("this is point"); //定义命名存储点,使用Save方法先保存存储点,定义回滚数据的开始位置

                

         //这边是你要回滚的操作代码,TO DO...


         //把从命名存储点到这里的操作进行回滚

        transaction.Rollback("this ispoint"); //回滚命名存储点             

     }

3.SQL语句中的事务(SQL Server中的事务其实很复杂的)

BEGINTRANSACTION


    --你需要执行的更新,删除,插入的语句

    

IF(@@ERROR>0) //这是系统变量,存储你在执行更新,删除,插入操作时发生错误的记录编号

    ROLLBACK

ELSE

    COMMIT


4.说说“TransactionScope”,让事务更加的简单 

  using(TransactionScope transactionScope= new TransactionScope())

 {

    try

    {

         using (SqlConnection connection= newSqlConnection())

        {

             //TO DO

            //提交事务,如果有异常,他会自动回滚的

            transactionScope.Complete();

       }

   }

   catch (Exception)

   {

        //捕获异常

        throw;

   }

  }


--------------------------------------------------- 2345王牌技术员联盟2345王牌技术员联盟、期待与您交流!---------------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值