Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更新DATETIME列,其中所述DATETIME<;当前日期时间_C#_Asp.net_Sql Server - Fatal编程技术网

C# 更新DATETIME列,其中所述DATETIME<;当前日期时间

C# 更新DATETIME列,其中所述DATETIME<;当前日期时间,c#,asp.net,sql-server,C#,Asp.net,Sql Server,我有一个ASP.NET 4.0 C#web应用程序,允许多个用户同时更新SQL Server数据库中的行。我正在尝试设计一个快速的系统来阻止USER1更新自USER1上次页面刷新后USER2更新的行 我遇到的问题是,我的web应用程序总是更新行,即使我认为它不应该更新。但是当我手动运行查询时,它只会在我认为应该的时候更新 这是我在C#中的SQL查询: SQLString=“更新状态集stat=”+UpdaterDD.SelectedValue+ “,tester=”+会话[“用户名”]。ToSt

我有一个ASP.NET 4.0 C#web应用程序,允许多个用户同时更新SQL Server数据库中的行。我正在尝试设计一个快速的系统来阻止USER1更新自USER1上次页面刷新后USER2更新的行

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

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

SQLString=“更新状态集stat=”+UpdaterDD.SelectedValue+
“,tester=”+会话[“用户名”]。ToString()+
“',timestamp_m=”+DateTime.Now.ToString(“yyyy-MM-dd-HH:MM:ss.fff”)+
“'其中id位于(“+IDs+”)和时间戳<'”+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';"
SQLString=“更新状态集stat='PASS',tester='tester007',
时间戳_m='2013-01-23 14:20:07.221',其中id位于(122645)和
时间戳_m<'2013-01-23 14:20:06.164'
我的想法是,只有在用户上次加载页面后没有其他用户更改此行时,才会更新该行。我已经将
PageLoadTime
格式化为与我的SQL Server DB相同的格式,您可以通过
DateTime.Now.ToString(“yyyy-MM-dd HH:MM:ss.fff”)
看到这一点,但有些地方仍然不正确


有人知道为什么我会得到两个不同的结果吗?我想做的是可能的吗?

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

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

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

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;
string sql=“更新状态集stat=@stat,tester=@tester”+
,timestamp_m=getdate()+
“其中id为(“+IDs+”)和时间戳_m<@pageLoadTime”;
SQLConnection conn=getMeASqlConnection();
SQLCommand cmd=新的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();
//这里,pageLoadTime是一个DateTime对象,而不是字符串
cmd.Parameters.Add(“@pageLoadTime”,System.Data.SqlDbType.DateTime).Value=pageLoadTime;

为什么不设置两个日期时间列,一个用于原始插入的记录,另一个用于更新的捕获,谁插入了原始记录并添加了另一个userUpdatedBy列?这样,您就不必从审核的角度更改一个日期加号,您的方法是不正确的……为什么允许多个用户要更新同一记录。。您能否在当前设计中实现一些记录/行锁定。。?此外,您可能会发现,为update语句创建参数化查询更为有益。这样做更为简洁,也更为容易
PageLoadTime
设置在哪里?您是否调试并检查了该值?通常,人们使用
ROWVERSION
列来控制并发更新,这样就不依赖于web服务器认为的页面加载时间与上次修改行的时间之间的一致性。这种方法似乎不太可扩展或安全…@JohnSaunders:我很抱歉在发布之前没有阅读这些内容,谢谢@DJKRAZE:我肯定会研究参数化查询。我当前的设计不会像您建议的那样支持记录/行锁定,尽管这只是意味着我可能需要放弃该设计@DaveZych:
PageLoadTime
设置在
Page\u Load
上,类似这样:
PageLoadTime=DateTime.Now.ToString(“yyyy-MM-dd HH:MM:ss.fff”)。切换到参数化查询本身并没有解决我的问题。我在页面上添加了一个标签,以显示
PageLoadTime
的值。我在上午10:40加载页面(通过标签验证),然后在数据库中手动设置10:44的
timestamp_m
,并尝试更新。它直到上午10:44才让我更新,所以很明显这部分工作正在进行。但当USER1在上午10:40加载页面,USER2在上午10:44更新时,它仍然不起作用,USER1(无需重新加载,因此他的
PageLoadTime
仍然是10:40)可以立即更新,即使10:44<10:40不是真的。你确定USER1提交更新时PageLoadTime没有更新吗?你检查过了吗!在更新PageLoadTime之前是否返回?您完全正确。我已经将
PageLoadTime
移动到了
if(!IsPostBack)
块中,但是如果在此之前我还初始化了dang,那就没什么用了。我删除了
PageLoadTime
,并将其替换为一个会话变量,该变量仅在
IsPostBack
为false时才会更新。问题解决了。
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;