更新DATETIME列,其中所述DATETIME<目前的DATETIME

时间:2013-01-23 21:21:03

标签: c# asp.net sql-server

我有一个ASP.NET 4.0 C#Web应用程序,允许多个用户同时更新SQL Server数据库中的行。我正试图想出一个快速系统,它将阻止USER1更新自USER1最后一页刷新后USER2更新的行。

我遇到的问题是我的网络应用程序总是更新行,即使我认为它不应该。但是当我手动运行查询时,它只会在我认为应该更新时更新。

这是我在C#中的SQL查询:

SQLString = "update statuses set stat = '" + UpdaterDD.SelectedValue +
            "', tester = '" + Session["Username"].ToString() +
            "', timestamp_m = '" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") +
            "' where id IN (" + IDs + ") and timestamp_m < '" + PageLoadTime + "';";

这是一个'真实世界'的例子:

SQLString = "update statuses set stat = 'PASS', tester = 'tester007',
             timestamp_m = '2013-01-23 14:20:07.221' where id IN (122645) and
             timestamp_m < '2013-01-23 14:20:06.164';"

我的想法是,只有在用户上次加载页面后没有其他用户更改此行时,才会更新。我已将PageLoadTime格式化为与我的SQL Server数据库相同的格式,正如您在DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")中看到的那样,但仍然有些不对。

有谁知道为什么我得到两个不同的结果?我想做什么甚至可能?

1 个答案:

答案 0 :(得分:0)

我真的认为问题在于页面加载时间没有正确设置,或者是在DB调用之前立即设置的。对于调试,您可以尝试将值硬编码到您知道允许或禁止插入的值中。

这是您拥有的参数化版本。我也让DB服务器将时间戳设置为当前时间而不是传递值。如果您的数据库服务器和Web服务器可能没有时间同步,请自行设置。

使用参数化,您不必担心日期/时间格式是否正确。我不知道stat类型,测试器和timestamp_m的数据库类型是什么,因此添加参数DB类型可能需要调整。

string sql = "update statuses set stat = @stat, tester = @tester" +
        ", timestamp_m = getdate()" +
        " where id IN (" + IDs + ") and timestamp_m < @pageLoadTime";

SQLConnection conn = getMeASqlConnection();

SQLCommand cmd = new SQLCommand(sql, conn);

cmd.Parameters.Add("@stat", System.Data.SqlDbType.NVarChar).Value = UpdaterDD.SelectedValue;
cmd.Parameters.Add("@tester", System.Data.SqlDbType.NVarChar).Value = Session["Username"].ToString();
// Here, pageLoadTime is a DateTime object, not a string
cmd.Parameters.Add("@pageLoadTime", System.Data.SqlDbType.DateTime).Value = pageLoadTime;