none
c#事务问题 RRS feed

  • 问题

  • 最近在学事务,发现一般更新删除的都没问题,但涉及select的就有些问题。

    比如有这样一个场景,A需要用信用卡购买商品,购买之前需要先判断是否有足够的余额去购买。

    我的代码是

        using (SqlConnection conn = new SqlConnection(”连接字符串))
                {
                    conn.Open();
                    using (SqlTransaction tran = conn.BeginTransaction())
                    {
                        try
                        {
                            string strsql = "select balance from table where userid=1234"
                            decimal p1 = Execute(strsql,tran)  //取出余额    
                            decimal  p2=1.2 ; //需要付的款
                          //判断余额,足够购买,更新
                           if(p1>p2){
                           strsql = "update table set balance="+(p1--p2).ToString() +" where userid=1234";
                            ExecuteNonQuery(tran, strsql, null);
                            tran.Commit();
                           }
                        }
                        catch(Exception ex)
                        {
                            tran.Rollback();
                            Response.Write(ex.ToString());
                        }
                    }
                }

     

    但会出现错误,System.InvalidOperationException: 事务不是与当前连接无关联,就是已完成。

    请问如何解决?

    2011年5月2日 14:55

答案

全部回复

  • 你要把你的Execute()这个方法的源代码贴出来。。。

    • 已标记为答案 ogra 2011年5月3日 0:20
    2011年5月2日 16:28
  • 不好意思,相关代码如下   

     public static object Execute(SqlTransaction trans, string cmdText, params SqlParameter[] commandParameters)
            {
                SqlCommand cmd = new SqlCommand();
                PrepareCommand(cmd, trans.Connection,trans, cmdText, commandParameters);
                object val = cmd.ExecuteScalar();
                cmd.Parameters.Clear();
                return val;
            }

    public static int ExecuteNonQuery(SqlTransaction trans, string cmdText, params SqlParameter[] commandParameters)
            {
                SqlCommand cmd = new SqlCommand();
                PrepareCommand(cmd, trans.Connection, trans, cmdText, commandParameters);
                int val = cmd.ExecuteNonQuery();
                cmd.Parameters.Clear();
                return val;
            }

      private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, string cmdText, SqlParameter[] cmdParms)
            {

                //判断数据库连接状态
                if (conn.State != ConnectionState.Open)
                    conn.Open();

                cmd.Connection = conn;
                cmd.CommandText = cmdText;

                //判断是否需要事物处理
                if (trans != null)
                    cmd.Transaction = trans;

                cmd.CommandType = CommandType.Text;

                if (cmdParms != null)
                {
                    foreach (SqlParameter parm in cmdParms)
                        cmd.Parameters.Add(parm);
                }
            }

    2011年5月3日 0:09
  • 呵呵,贴下代码,发现问题了,原来一个地方使用了另外的SqlConnnection
    2011年5月3日 0:21