zoukankan      html  css  js  c++  java
  • 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/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,请微信联系冬天里的一把火

  • 相关阅读:
    简单明了的带你理解springboot原理和三大核心注解
    Spring Boot(一):入门篇
    【Mysql优化】聚簇索引与非聚簇索引概念
    Mysql索引原理与优化
    Mysql全文索引的使用
    索引的优缺点,如何创建索引
    184 01 Android 零基础入门 03 Java常用工具类03 Java字符串 02 String类 04 例:字符串与byte(即:字节)数组间的相互转换
    183 01 Android 零基础入门 03 Java常用工具类03 Java字符串 02 String类 03 String常用方法(下)
    182 01 Android 零基础入门 03 Java常用工具类03 Java字符串 02 String类 02 String常用方法(上)
    181 01 Android 零基础入门 03 Java常用工具类03 Java字符串 02 String类 01 String常用方法简介
  • 原文地址:https://www.cnblogs.com/tylerdonet/p/3002920.html
Copyright © 2011-2022 走看看