我有两个SQL查询字符串,其中一个有效,另一个没有。
工作人员:
string updateLoginTime = "UPDATE DeviceUsers SET lastLogin = '" + dateTime + "' WHERE ID = '" + userID + "'";
这个没有:
string updateText = "UPDATE DocumentsRead SET timeRead = '" + dateTime + "' WHERE userID = '" + userID + "' AND fileName = '" + fileOnly +"'";
它会抛出错误:
将varchar数据类型转换为日期时间数据类型会导致超出范围的值。
在两个查询中,dateTime
参数作为字符串传递给Web方法。
任何想法为什么第一个工作但第二个不工作?
- 编辑 -
第二个查询现在格式如下:
dateTime = DateTime.Now.ToString("dd-MM-yy HH-mm-ss");
using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["EndUsersConnectionString"].ConnectionString))
using (var cmd = conn.CreateCommand())
{
conn.Open();
cmd.CommandText = "UPDATE DocumentsRead SET timeRead = @timeRead WHERE userID = @userID AND fileName = @fileName";
cmd.Parameters.AddWithValue("@timeRead", dateTime);
cmd.Parameters.AddWithValue("@userId", userID);
cmd.Parameters.AddWithValue("@fileName", fileName);
cmd.ExecuteNonQuery();
}
仍然遇到同样的错误。
答案 0 :(得分:10)
永远不要那样做。 从不使用字符串连接来构建SQL查询。如果您不想见Bobby Tables
,总是使用参数化查询:
using (var conn = new SqlConnection(someConnectionString))
using (var cmd = conn.CreateCommand())
{
conn.Open();
cmd.CommandText = "UPDATE DocumentsRead SET timeRead = @timeRead WHERE userID = @userID AND fileName = @fileName";
cmd.Parameters.AddWithValue("@timeRead", someDateTimeInstance);
cmd.Parameters.AddWithValue("@userId", userId);
cmd.Parameters.AddWithValue("@fileName", fileName);
cmd.ExecuteNonQuery();
}
这样,您不仅不会遇到Bobby Tables,而且您的查询也能正常运行。
进行SQL开发时应该遵守的黄金法则绝不会使用+
运算符。
答案 1 :(得分:2)
仔细检查表属性上的数据类型。
Device Users.last登录类型似乎已正确设置为Date,但可能没有正确配置Documents Read.timeRead。
答案 2 :(得分:2)
连接sql查询是一种常见的错误做法,因此最好使用参数化查询,但在您的情况下,您可能在具有不同语言环境的环境中工作,因此应用程序服务器和dbms使用不同的日期格式(dd / mm) / yyyy和mm / dd / yyyy例如)