【问题标题】:SQL Server receives and runs a query with wrong resultSQL Server 接收并运行结果错误的查询
【发布时间】:2012-06-13 14:23:50
【问题描述】:

我有一个连接到数据库的 ASP.NET 项目。网页向数据库发送查询。不止一个,事实上,它成功地从数据库中读取。 单击提交按钮后,我会向 SQL Server (2008) 发送 UPDATE 查询。

我使用 C#,将 UPDATE 查询发送到服务器,并使用 SqlCommand 对象初始化:

编辑:为查询添加了变量。

string strQuery = "UPDATE [tbl] SET [f1]='" + stringValue + "', [f2]='" + (boolValue?"1":"0") + "' WHERE [id]=" + intId.ToString() + ";";
SqlCommand cmd = new SqlCommand(strQuery, connectionObject);
int QueryResult = cmd.ExecuteNonQuery();

QueryResult 以 0 结尾,当然,没有进行任何更改。复制粘贴到 SSMS - 我得到 1 row(s) affected 并且数据发生变化。

连接工作正常 - 当我使用 this 检查数据库上的工作时 - 查询已执行。 (看起来像(@1 varchar(8000), @2 varchar(8000), @3 tinyInt) UPDATE [tbl] SET [f1]=@1, [f2]=@2 WHERE [id]=@3;)。

知道发生了什么 - 感激不尽。 谢谢!

【问题讨论】:

  • 也许你可以展示更多的代码。可能是您有未提交的事务
  • @tunmisefasipe,做了一个小修改,但本质上就是代码。
  • connectionObject 来自哪里?另外(看过编辑)请去阅读参数,然后改用这些参数。字符串连接几乎总是错误的做法。
  • 为了它的价值,建议您更改代码以使用 SQL 参数 - 有助于保护您免受 SQL 注入。像这样编译字符串是被它抓住的经典方法。
  • 我的猜测是,在构造查询时intId 没有您认为的值。

标签: asp.net sql sql-server sql-server-2008


【解决方案1】:

最有可能的是WHERE [id]=" + intId.ToString() 没有找到要更新的行。

要么这是因为:

  • ID 正确且该行尚不存在(如果您是在手前插入它)
  • ID 错误
  • stringValue 包含破坏您的 SQL 的内容,使其执行但不匹配任何内容(不太可能但可能)。
  • 您没有针对正确的数据库执行 SQL(我之前在有多个数据库的开发环境中这样做过!)

如果您在 strQuery 赋值后的行上放置断点,请查看它包含的内容,并可能将其内容发布回您的问题中。

【讨论】:

  • 做对了(在上面 cmets 中的 DTU 之后一点)。也感谢您的参数建议 - 会的。 (虽然,这是针对管理员的私有系统,但这是一种很好的安全做法)
【解决方案2】:

这里是一个如何使用参数的例子

using (SqlCommand cmd = new SqlCommand())
        {
            cmd.Connection = connectionObject;
            cmd.Parameters.AddWithValue("@f1", stringValue);
            cmd.Parameters.AddWithValue("@f2", boolValue);
            cmd.Parameters.AddWithValue("@id", intId);
            cmd.CommandText = "update [tbl] set f1 = @f1 , f2 = @f2 where id = @id";
            int QueryResult = cmd.ExecuteNonQuery();

        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    • 2014-12-20
    • 1970-01-01
    相关资源
    最近更新 更多