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'
然后当你存储它时,我猜它被隐式转换回一个数值?我觉得奇怪的是,你在任何时候都没有收到错误消息

在任何情况下,您都会看到两个修复:

  • 现在,去掉那些单引号,将数值视为数值而不是字符串值
  • 不要通过连接字符串来生成查询。您现在面临的问题是这样做会遇到的较小问题之一。让自己暴露于SQL注入攻击是另一个更重要的问题。使用查询参数而不是字符串连接

  • 这是一个教科书上的案例。您需要一个事务来封装这两个命令。 您还需要使用参数化查询,而不是字符串连接

    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 + "';";