public static void PrepareCommand(SqlConnection con, SqlCommand cmd, SqlTransaction trans, CommandType nType, string nText, SqlParameter[] paras)
{
   
    if (con.State != ConnectionState.Open) {
        con.Open();
    }
    cmd.Connection = con;
    cmd.CommandText = nText;
    if (trans != null) {
       
        cmd.Transaction = trans;
    }
    cmd.CommandType = nType;
    if (paras != null) {
       
        foreach (SqlParameter para in paras) {
           
            cmd.Parameters.Add(para);
           
        }
    }
}
public static int ExcuteNonQurey(string nText, CommandType nType, SqlParameter[] paras)
{
   
    SqlCommand cmd = new SqlCommand();
    using (SqlConnection conn = new SqlConnection(strConn)) {
       
        PrepareCommand(conn, cmd, null, nType, nText, paras);
        int rows = cmd.ExecuteNonQuery();
        cmd.Parameters.Clear();
       
        return rows;
    }
   
}这样直接调用 SqlHelper.ExcuteNonQurey(sql, CommandType.Text, paras)这样还用使用事务吗? SqlHelper.ExcuteNonQurey方法是否包含了事务回滚?

解决方案 »

  1.   

    我看见人家是这样使用事务的
    CS.Open();
      DBTransaction = CS.BeginTransaction();
    SqlHelper.ExcuteNonQurey(sql, CommandType.Text, paras) 
     if()
        {
         DBTransaction.Rollback();        //--回退事务
        } ExcuteNonQurey中不是包含了open吗?
    为什么还要open一次
      

  2.   

    using (SqlConnection conn = new SqlConnection(ConnectionString)) {
        conn.open();
        SqlTransaction tran = conn.BeginTransaction();    try {
            SqlHelper.ExecuteNoneQuery(tran, sql1, ...);
            SqlHelper.ExecuteNoneQuery(tran, sql2, ...);
            SqlHelper.ExecuteNoneQuery(tran, sql3, ...);
            SqlHelper.ExecuteNoneQuery(tran, sql4, ...);        tran.Commit();
        } catch(SqlException) {
            tran.Rollback();
            throw;
        }
    }
      

  3.   

    public static int ExcuteNonQurey(string nText, CommandType nType, SqlParameter[] paras)
    {没有tran参数啊
      

  4.   

    你那个没有包含.    /// <summary>
            /// 执行多条SQL语句,实现数据库事务。
            /// </summary>
            /// <param name="SQLStringList">SQL语句的哈希表(key为sql语句,value是该语句的SqlParameter[])</param>
            public static void ExecuteSqlTranWithIndentity(Hashtable SQLStringList)
            {
                using (SqlConnection conn = new SqlConnection(connectionString))
                {
                    conn.Open();
                    using (SqlTransaction trans = conn.BeginTransaction())
                    {
                        SqlCommand cmd = new SqlCommand();
                        try
                        {
                            int indentity = 0;
                            //循环
                            foreach (DictionaryEntry myDE in SQLStringList)
                            {
                                string cmdText = myDE.Key.ToString();
                                SqlParameter[] cmdParms = (SqlParameter[])myDE.Value;
                                foreach (SqlParameter q in cmdParms)
                                {
                                    if (q.Direction == ParameterDirection.InputOutput)
                                    {
                                        q.Value = indentity;
                                    }
                                }
                                PrepareCommand(cmd, conn, trans, cmdText, cmdParms);
                                int val = cmd.ExecuteNonQuery();
                                foreach (SqlParameter q in cmdParms)
                                {
                                    if (q.Direction == ParameterDirection.Output)
                                    {
                                        indentity = Convert.ToInt32(q.Value);
                                    }
                                }
                                cmd.Parameters.Clear();
                            }
                            trans.Commit();
                        }
                        catch
                        {
                            trans.Rollback();
                            throw;
                        }
                    }
                }
            }
      

  5.   

    ExcuteNonQurey 无回滚效果
    using (SqlConnection conn = new SqlConnection(ConnectionString)) {
        conn.open();
        SqlTransaction tran = conn.BeginTransaction();    try {
            SqlHelper.ExecuteNoneQuery(tran, sql1, ...);
            SqlHelper.ExecuteNoneQuery(tran, sql2, ...);
            SqlHelper.ExecuteNoneQuery(tran, sql3, ...);
            SqlHelper.ExecuteNoneQuery(tran, sql4, ...);        tran.Commit();
        } catch(SqlException) {
            tran.Rollback();
            throw;
        }
    }
    正解