我有一个asp.net应用程序,它使用post form保存一些用户数据。为此我在下面列出了一个简单的查询。
"UPDATE myTable SET LastUpdatedOn='"
+ DateTime.UtcNow + "', Completed='1'
WHERE ID='" + requestid + "'"
这有些失败了。但我认为它没有问题。所以,请让我知道它为什么会发生。
答案 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();