积极答复者
c#事务问题

问题
-
最近在学事务,发现一般更新删除的都没问题,但涉及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: 事务不是与当前连接无关联,就是已完成。
请问如何解决?
全部回复
-
不好意思,相关代码如下
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);
}
}