• C#实现的事务


    1、创建事务的结构

    SqlConnection   sqlConnection   =   new   SqlConnection();  
      ...初始化连接  
      //   开启事务  
      SqlTransaction   sqlTransaction   =   sqlConnection.BeginTransaction();  
      //   将事务应用于Command  
      SqlCommand   sqlCommand   =   new   SqlCommand();  
      sqlCommand.Connection   =   sqlConnection;   
      sqlCommand.Transaction   =   sqlTransaction;     
      try  
      {  
      //   利用sqlcommand进行数据操作  
      ...  
      //   成功提交  
      sqlTransaction.Commit();  
      }  
      catch(Exception   ex)  
      {  
      //   出错回滚  
      sqlTransaction.Rollback();  
      }   

    2、简单例子

                      {   
                              DataTable   dt   =   new   DataTable();   
                              System.Data.SqlClient.SqlConnection   cnn   =   new   System.Data.SqlClient.SqlConnection("连接字符串");  
                              System.Data.SqlClient.SqlCommand   cm   =   new   System.Data.SqlClient.SqlCommand();  
                              cm.Connection   =   cnn;  
                              cnn.Open();  
                              System.Data.SqlClient.SqlTransaction   trans   =   cnn.BeginTransaction();  
                              try  
                              {  
                                      foreach(DataRow   dr   in   dt.Rows)  
                                      {  
                                              cm.CommandText   =   "update   [表]   set   [数量]   =   @amount   where   productID   =   @productID";  
                                              cm.Parameters.Add("@amount",SqlDbType.Int);  
                                              cm.Parameters["@amount"].Value   =   Convert.ToInt32(dr["amount"]);  
                                              cm.Parameters.Add("@productID",SqlDbType.VarChar);  
                                              cm.Parameters["@productID"].Value   =   dr["productID"].ToString();  
                                              cm.ExecuteNonQuery();  
                                      }  
                                      trans.Commit();  
                              }  
                              catch  
                              {  
                                      trans.Rollback();  
                              }  
                              finally  
                              {  
                                      cnn.Close();  
                                      trans.Dispose();  
                                      cnn.Dispose();  
                              }  
                      }

     另外一个例子,稍微复杂一点,注意每次执行的时候要清除上一次的参数

            /// <summary>
            /// 添加,编辑问卷
            /// </summary>
            /// <param name="questionnaire"></param>
            /// <returns></returns>
            public int AddQuestionnaire(Entity.Questionnaire.Questionnaire questionnaire)
            {
                int identity = 0;
                SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlConnectionStringTrainingOA"].ConnectionString);
                SqlCommand command = connection.CreateCommand();
                SqlTransaction transaction;
                connection.Open();
                transaction = connection.BeginTransaction();
                command.Transaction = transaction;
                command.CommandType = CommandType.StoredProcedure;
    
                try
                {
                    //1写入问卷
                    command.CommandText = "Questionnaire_ADD";
                    SqlParameter[] parms = new SqlParameter[] { 
                    new SqlParameter("@ID",SqlDbType.Int),
                    new SqlParameter("@QuestionnaireTitle",SqlDbType.NVarChar)
                    };
                    parms[0].Value = questionnaire.ID;
                    parms[1].Value = questionnaire.QuestionnaireTitle;
                    command.Parameters.AddRange(parms);
    
                    int questionnaireID = Convert.ToInt32(command.ExecuteScalar());
                    identity = questionnaireID;
    
                    //2写入题目
                    for(int i = 0; i < questionnaire.Questions.Count; i++)
                    {
                        command.CommandText = "Question_ADD";
                        command.Parameters.Clear();
                        parms = new SqlParameter[] { 
                        new SqlParameter("@ID",questionnaire.ID),
                        new SqlParameter("@QuestionTitle",questionnaire.Questions[i].QuestionTitle),
                        new SqlParameter("@Sequence",questionnaire.Questions[i].Sequence),
                        new SqlParameter("@QuestionTypeID",questionnaire.Questions[i].QuestionTypeID),
                        new SqlParameter("@QuestionnaireID",questionnaireID)};
                        command.Parameters.AddRange(parms);
    
                        int questionID = Convert.ToInt32(command.ExecuteScalar());
                        identity = questionID;
    
                        if((questionnaire.Questions[i].QuestionType == QuestionType.singlechoice) || (questionnaire.Questions[i].QuestionType == QuestionType.multiplechoice))
                        {
                            for(int j = 0; j < questionnaire.Questions[i].ChoiceItems.Count; j++)
                            {
                                command.CommandText = "ChoiceItem_ADD";
                                command.Parameters.Clear();
                                parms = new SqlParameter[]{
                                new SqlParameter("@ID",questionnaire.Questions[i].ChoiceItems[j].ID),
                                new SqlParameter("@ItemContent",questionnaire.Questions[i].ChoiceItems[j].ItemContent),
                                new SqlParameter("@Options",questionnaire.Questions[i].ChoiceItems[j].Option),
                                new SqlParameter("@QuestionID",questionID)};
                                command.Parameters.AddRange(parms);
    
                                identity = Convert.ToInt32(command.ExecuteScalar());
                            }
    
                        }
    
                    }
    
                    transaction.Commit();
                }
                catch(Exception ex)
                {
                    transaction.Rollback();
                    throw;
                }
                finally
                {
                    connection.Close();
                    transaction.Dispose();
                    connection.Dispose();
                }
    
                return identity;
            }

    3、SQl server中的事务例子

    begin transaction
    save transaction A
    
    insert into demo values('BB','B term')
    rollback TRANSACTION A
    
    create table demo2(name varchar(10),age int)
    insert into demo2(name,age) values('lis',1)
    rollback transaction
    
      insert into demo values('BB','B term')
    
     commit TRANSACTION A
    
     commit TRANSACTION  

    4、注意

      1。事务必须在连接打开后BeginTransaction();

      2.事务添加到SqlCommand(sqlCommand.Transaction   =   sqlTransaction;   )

      3、其他数据库对应做相应调整

      4、可以用微软提供的一个dll,很方便.

    作者:Tyler Ning
    出处:http://www.cnblogs.com/tylerdonet/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,请微信联系冬天里的一把火

  • 相关阅读:
    $(this)的意思
    Springmvc框架文件上传单文件上传
    保险业务知识价税分离
    SpringMVC框架,json
    使用springmvc框架实现多文件上传
    oracle数据库中的绑定变量
    使用Springmvc框架实现多文件上传(二)
    Springmvc框架json对象的处理
    Springmvc框架json数据传递处理,解决方案2
    [算法] 6 种排序的重写,很熟练!
  • 原文地址:https://www.cnblogs.com/tylerdonet/p/3002920.html
Copyright © 2020-2023  润新知