public int ImportData(string SQL, DataSet ds)
        {            Transaction originalTransaction = Transaction.Current;
            CommittableTransaction transaction = new CommittableTransaction();
            int result = 0;
            SqlConnection Conn;
            Conn = new SqlConnection(ConnStr);
            Conn.Open();
            SqlCommand Cmd;
            Cmd = CreateCmd("", Conn);
            try
            {
                Transaction.Current = transaction;
                Cmd.CommandText = SQL;
                Cmd.ExecuteNonQuery();                for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                {
                    string strIn = string.Format("insert into dbo.ashare_test values({0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12},{13},{14})",
                        ds.Tables[0].Rows[i]["gddm"].ToString(),
                        ds.Tables[0].Rows[i]["gdxm"].ToString(),
                        ds.Tables[0].Rows[i]["bcrq"].ToString(),
                        ds.Tables[0].Rows[i]["cjbh"].ToString(),
                        ds.Tables[0].Rows[i]["gsdm"].ToString(),
                        ds.Tables[0].Rows[i]["cjsl"].ToString(),
                        ds.Tables[0].Rows[i]["bcye"].ToString(),
                        ds.Tables[0].Rows[i]["zqdm"].ToString(),
                        ds.Tables[0].Rows[i]["sbsj"].ToString(),
                        ds.Tables[0].Rows[i]["cjsj"].ToString(),
                        ds.Tables[0].Rows[i]["cjjg"].ToString(),
                        ds.Tables[0].Rows[i]["cjje"].ToString(),
                        ds.Tables[0].Rows[i]["sqbh"].ToString(),
                        ds.Tables[0].Rows[i]["bs"].ToString(),
                        ds.Tables[0].Rows[i]["mjbh"].ToString());                    Cmd.CommandText = strIn;                    try
                    {
                        result = Cmd.ExecuteNonQuery();
                    }
                    catch (Exception ex)
                    {
                        transaction.Rollback(ex);
                        throw ex;
                    }
                }
                transaction.Commit();            }
            catch (Exception ex)
            {
                transaction.Rollback(ex);
                throw ex;
            }            finally
            {
                Transaction.Current = originalTransaction;
                transaction.Dispose();
            }            Dispose(Conn);
            return result;        }

解决方案 »

  1.   

    Conn  对象跟 transaction对象没关联。各自独立的。
      

  2.   

     try
                        {
                            result = Cmd.ExecuteNonQuery();  //如果此处出错
                        }
                        catch (Exception ex)
                        {
                            transaction.Rollback(ex);  
                            throw ex;                 
                        }
                    }                transaction.Commit();          //这句会不会执行了?
      

  3.   

     try
                        {
                            result = Cmd.ExecuteNonQuery();  //如果此处出错
                        }
                        catch (Exception ex)
                        {
                            transaction.Rollback(ex);  
                            throw ex;                 
                        }
                    }                transaction.Commit();          //这句会不会执行了?
      

  4.   

    SqlTransaction runTransaction=conn.BeginTransaction(IsolationLevel.ReadCommitted);Cmd.ExecuteNonQuery();
    Cmd.ExecuteNonQuery();Cmd.ExecuteNonQuery();
    Cmd.ExecuteNonQuery();runTransaction.Commit();
      

  5.   

    这样的话,我下边的For循环怎么办?
    事务都提交了,后边的都没法执行了
      

  6.   

    估计要设置一个标识符了,只要有一个出错,马上回滚bool flag = true;try
    {
    result = Cmd.ExecuteNonQuery(); //如果此处出错
    }
    catch (Exception ex)
    {
    transaction.Rollback(ex); 
    flag = false;
    break;
    throw ex; 
    }if(flag)    //如果for循环中没有出错
       transaction.Commit();
      

  7.   

    既然要事务独立,为什么不用System.Transsaction.TransactionScopeusing(System.Transsaction.TransactionScope ts=new System.Transsaction.TransactionScope
    ())
    {操作1if(操作1出错)
       return false;
    操作2if(操作2出错)
       return false;
    .......
    .....
       ts.Complete();
    }
      

  8.   

    using(TransactionScope scope = new TransactionScope())
    {
    //方法1   
    //方法2
    scope.Complete();