-1

我有两个 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 数据类型导致值超出范围。

在这两个查询中,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();
}

仍然得到同样的错误。

4

3 回答 3

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 开发时应该尊重的黄金法则不是永远不要使用+运算符。

于 2013-03-18T12:44:16.320 回答
2

仔细检查表属性上的数据类型。

DeviceUsers.lastLogin 类型似乎已正确设置为 Date,但 DocumentsRead.timeRead 可能未正确配置。

于 2013-03-18T12:45:01.063 回答
2

连接 sql 查询通常是一种不好的做法,因此最好使用参数化查询,但是在您的情况下,您可能在具有不同语言环境的环境中工作,因此应用程序服务器和 dbms 使用不同的日期格式(dd/mm/yyyy 和例如 mm/dd/yyyy)

于 2013-03-18T12:46:54.817 回答