为什么这个简单的查询中断

时间:2012-06-08 13:53:09

标签: asp.net database

我有一个asp.net应用程序,它使用post form保存一些用户数据。为此我在下面列出了一个简单的查询。

"UPDATE myTable SET LastUpdatedOn='"
+ DateTime.UtcNow + "', Completed='1' 
WHERE ID='" + requestid + "'"

这有些失败了。但我认为它没有问题。所以,请让我知道它为什么会发生。

4 个答案:

答案 0 :(得分:1)

您应该熟悉参数化查询,并开始使用它们来保护您的系统免受SQL Injection attacks的侵害。

using (var cmd = conn.CreateCommand()) {
    cmd.CommandText =
        "UPDATE myTable SET LastUpdatedOn=@Time, Completed='1' WHERE ID=@Id";
    cmd.Parameters.AddWithValue("@Time", DateTime.UtcNow);
    cmd.Parameters.AddWithValue("@Id", requestid);
    var count = cmd.ExecuteNonQuery();
    if (count != 1) {
        Console.Error.WriteLine(
            "Warning: Cannot update myTable for ID {0}", requestid
        );
    }
}

作为一个额外的好处,这种方法消除了所有可能的数据格式问题,并通过让SQL Server缓存查询计划来加快查询速度。但主要好处是阻止世界各地的“鲍比表”试图未经授权访问您的系统。

答案 1 :(得分:0)

DateTime.UtcNow不太可能解析查询的日期时间。尝试:

DateTime.UtcNow.ToString('yyyy-MM-dd hh:mm:ss')

(另外,我可能搞砸了我的“m's”,所以仔细检查一下)

答案 2 :(得分:0)

如果使用DateTime.UtcNow,请考虑使用getdate()如果您正在使用的数据库中使用Sql Server或类似函数

"UPDATE myTable SET LastUpdatedOn= getdate(), Completed='1' WHERE ID='" + requestid + "'"

答案 3 :(得分:0)

我不确定为什么会破坏。我们需要查看表格的模式,以便更好地了解可能出现的问题。另外,我建议您使用参数化查询,而不是简单地连接查询。您的当前查询可能容易受到SQL注入的影响,具体取决于输入的来源。尝试将代码更改为类似的内容,以查看它是否可以缓解错误(这也可以减轻SQL注入风险):

SqlCommand cmd = new SqlCommand("UPDATE myTable SET LastUpdatedOn = @LastUpdatedOn, Completed = @Completed WHERE ID = @RequestId", sqlConnectionObject);
cmd.Parameters.AddWithValue("@LastUpdatedOn", DateTime.UtcNow);
cmd.Parameters.AddWithValue("@Completed", 1);
cmd.Parameters.AddWithValue("@RequestId", requestid);
cmd.ExecuteNonQuery();