见过几种事物:SQL事务(SqlTransaction)和TransactionScope事务都是只能对多条语句或者多个数据库中的数据操作进行整体提交或者回滚的,有没有同时更改数据和文件的事物?比如在数据库中存了多个图片的路径,先在数据库中修改文件的名称,再在文件夹中修改文件的实际名称,全部成功才提交,其中一个失败就回滚?

解决方案 »

  1.   


        /// <summary>
        /// 带事务的批量操作数据。
        /// </summary>
        /// <returns>操作是否成功</returns>
        public static bool OperateDatasWithTransaction(List<string> sqlList,string flag)
        {
           if(flag=="SQL")
           {
            SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["SQLCONNECTIONSTRING"].ConnectionString);
            myConnection.Open();
            SqlCommand myCommand = myConnection.CreateCommand();
            SqlTransaction myTrans;
            // Start a local transaction
            myTrans = myConnection.BeginTransaction(IsolationLevel.ReadCommitted);
            // Assign transaction object for a pending local transaction
            myCommand.Connection = myConnection;
            myCommand.Transaction = myTrans;
            try
            {
                foreach (string item in sqlList)
                {
                    myCommand.CommandText = item;
                    myCommand.ExecuteNonQuery();
                }
                myTrans.Commit();
                return true;
            }
            catch (Exception)
            {
                myTrans.Rollback();
                return false;
            }
            finally
            {
                myConnection.Close();
            }
          }
            else
           {
               OracleConnection myConnection = new OracleConnection(System.Configuration.ConfigurationManager.AppSettings["ConnStrOrcl"]);
               myConnection.Open();
               OracleCommand myCommand = myConnection.CreateCommand();
               OracleTransaction myTrans;
               // Start a local transaction
               myTrans = myConnection.BeginTransaction(IsolationLevel.ReadCommitted);
               // Assign transaction object for a pending local transaction
               myCommand.Connection = myConnection;
               myCommand.Transaction = myTrans;
               try
               {
                   foreach (string item in sqlList)
                   {
                       myCommand.CommandText = item;
                       myCommand.ExecuteNonQuery();
                   }
                   myTrans.Commit();
                   return true;
               }
               catch (Exception)
               {
                   myTrans.Rollback();
                   return false;
               }
               finally
               {
                   myConnection.Close();
               }
           }    }哈哈。。不知道这样行不行哪