DateTime运算符给出了奇怪的结果

时间:2013-03-18 12:40:58

标签: c# sql-server asp.net-mvc datetime

我有两个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();
}

仍然遇到同样的错误。

3 个答案:

答案 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例如)