0

我有一个 ASP.NET 4.0 C# Web 应用程序,它允许多个用户同时更新 SQL Server DB 中的行。我正在尝试提出一个快速系统,该系统将阻止 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 DB 相同的格式DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"),但仍有问题。

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

4

1 回答 1

0

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

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

使用参数化,您不必担心日期/时间格式是否正确。我不知道 stat、tester 和 timestamp_m 的 DB 类型是什么,因此添加参数 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;
于 2013-01-24T00:51:16.710 回答