zoukankan      html  css  js  c++  java
  • 拼接SQL造成的意想不到的后果

           执行数据操作时,由于拼接SQL存在种种弊端,早就应该抛弃了,但在现实开发时,又由于种种原因,公司一直采用这种方式(UI层和逻辑层都有严格的过滤,倒也没出现过什么问题),但昨天开发时却出现了意想不到的问题,一个简单的语句会造成严重后果。简单的语句示例如下:

    更新主键为2的记录的总钱数的方法
        /// <summary>
        
    /// 更新主键为2的记录的总钱数
        
    /// </summary>
        
    /// <param name="totalMoney">修改后的总钱数</param>
        public void UpdateTotalMoney(int totalMoney)
        {
            
    int id = 2//数据库表主键
            int oldTotalMoney = 5000;       //主键为2的记录原来的总钱数
            int newTotalMoney = totalMoney; //主键为2的记录更改后的钱数
            int totalMoneyChange = oldTotalMoney - newTotalMoney; //总钱数的变化量
            string sql = string.Format("update Test1220 set totalMoney = {0},remainMoney = remainMoney-{1} where id = {2}", newTotalMoney, totalMoneyChange, id);   //总钱数变化,剩余可支配钱数也跟着编号
            SqlConnection con = new SqlConnection(sqlConnectString);
            con.Open();
            SqlCommand cmd 
    = new SqlCommand(sql, con);
            cmd.ExecuteNonQuery();
            con.Close();
        }
    创建表并插入测试数据
        CREATE TABLE Test1220(
            id 
    int IDENTITY(1,1NOT NULL PRIMARY KEY,
            totalMoney 
    int NULL,
            remainMoney 
    int NULL
        )

        
    insert into Test1220(totalMoney,remainMoney) values(3000,2000)
        
    insert into Test1220(totalMoney,remainMoney) values(5000,5000)
        
    insert into Test1220(totalMoney,remainMoney) values(1000,1000)
        
    insert into Test1220(totalMoney,remainMoney) values(3000,3000)
        
    insert into Test1220(totalMoney,remainMoney) values(3000,3000)
        
    insert into Test1220(totalMoney,remainMoney) values(3000,3000)

     
          接下来调用方法UpdateTotalMoney()更新主键为2的记录的总钱数和剩余钱数,UpdateTotalMoney(4000)和UpdateTotalMoney(8000)更新id=2的记录,会发生什么情况呢?执行UpdateTotalMoney(4000)时正常,表中只有id=2的记录跟着更新;但执行完UpdateTotalMoney(8000)之后,却出现了意想不到的问题,所有记录的totalMoney都变成8000了,而remainMoney却一个也没有修改。是什么原因造成的呢?明明已经加了where条件id=2,怎么会更新到所有记录?

          这可把我这个菜鸟级的给难住了,简单的语句,传递不同的参数会有时正常有时异常,反复跟踪调试,才发现问题出现在SQL语句上,当参数为8000时,得到的SQL语句为“update Test1220 set totalMoney = 8000,remainMoney = remainMoney--3000 where id = 2”,原来是减运算符和负号连在一起成了SQL的注释符号,把更新时的where条件给注释掉了,真是一个危险的操作!这个错误很隐蔽,查找错误花了很长时间,如果执行数据库操作时参数化,就不会有这种情况了。

  • 相关阅读:
    417 Pacific Atlantic Water Flow 太平洋大西洋水流
    416 Partition Equal Subset Sum 分割相同子集和
    415 Add Strings 字符串相加
    414 Third Maximum Number 第三大的数
    413 Arithmetic Slices 等差数列划分
    412 Fizz Buzz
    410 Split Array Largest Sum 分割数组的最大值
    409 Longest Palindrome 最长回文串
    day22 collection 模块 (顺便对比queue也学习了一下队列)
    day21 计算器作业
  • 原文地址:https://www.cnblogs.com/freshman0216/p/1628162.html
Copyright © 2011-2022 走看看