C# 更新sql查询中的计算错误
C# 更新sql查询中的计算错误,c#,web-services,sql-update,asp.net-4.5,C#,Web Services,Sql Update,Asp.net 4.5,user1和user2拥有$100 user1将$5转账至user2 用户1现在拥有$95&user2现在拥有$1005 不知怎的,它没有正确计算。我怀疑上面的代码,因为我做了一个查询字符串3,它是负数而不是正数,并且它可以工作。但是querystring4有点问题。您在此处添加了一个字符串: string queryString4 = "UPDATE Table1 SET currentMoney =currentMoney + '" + money + "'WHERE accountNo='
user1和user2
拥有$100
user1
将$5
转账至user2
用户1现在拥有$95
&user2
现在拥有$1005
不知怎的,它没有正确计算。我怀疑上面的代码,因为我做了一个查询字符串3,它是负数而不是正数,并且它可以工作。但是querystring4有点问题。您在此处添加了一个字符串:
string queryString4 = "UPDATE Table1 SET currentMoney =currentMoney + '" + money + "'WHERE accountNo='" + recipientNo + "';";
假设money
为5,则为:
currentMoney =currentMoney + '" + money + "'
在许多语言中,这将导致数值隐式转换为字符串值,因此:
currentMoney =currentMoney + '5'
然后当你存储它时,我猜它被隐式转换回一个数值?我觉得奇怪的是,你在任何时候都没有收到错误消息
在任何情况下,您都会看到两个修复:
这是一个教科书上的案例。您需要一个事务来封装这两个命令。 您还需要使用参数化查询,而不是字符串连接
100 + '5' = '1005'
在这里,交易的使用是强制性的,因为你不想以任何理由将一部分资金贷记到一个账户,也不想以任何理由错过另一个账户的借记。
(在实际情况下,您需要的远不止这些。例如,此代码缺少对借记帐户中可用金额的任何检查)
当然,您最初的错误是因为您将金额视为字符串,但这显然是错误的。处理货币值时,不应依赖任何类型的隐式转换。以这种方式编写sql字符串是一种非常糟糕的做法。您应该改用Sql参数 无论如何,请尝试以下方法:
decimal sumOfTransaction = 5m;
string creditAccount = "123456ABC";
string debitAccount = "ABC9876543";
using(TransactionScope scope = new TransactionScope())
using(SqlConnection cn = new SqlConnection(connectionString))
{
string upd1 = @"UPDATE Table1 SET currentMoney = currentMoney + @amount
WHERE accountNo=@account";
string upd2 = @"UPDATE Table1 SET currentMoney = currentMoney - @amount
WHERE accountNo=@account";
cn.Open();
using(SqlCommand cmd = new SqlCommand(upd1, cn);
{
cmd.Parameters.AddWithValue("@amount", sumOfTransaction);
cmd.Parameters.AddWithValue("@account", creditAccount);
cmd.ExecuteNonQuery();
cmd.CommandText = upd2;
cmd.Parameters["@account"].Value = debitAccount);
cmd.ExecuteNonQuery();
}
scope.Complete();
}
但我强烈建议您使用参数。您的计算代码在哪里?以及
currentMoney
和accountNo
列的类型是什么?检查您是否没有添加字符串而不是数字(假设类型正确,因为user1
具有正确的值,我猜您生成了错误的SQL命令,请检查计算中使用的“
)。
string queryString4 = "UPDATE Table1 SET currentMoney =currentMoney + (" + money + ") WHERE accountNo='" + recipientNo + "';";