以下内容来自生成的数据适配器:
this._adapter.UpdateCommand.CommandText = @"
UPDATE [dbo].[Currency2] SET [cid1] = @cid1, [cid2] = @cid2, [m] = @m
WHERE (([id] = @Original_id)
AND ([cid1] = @Original_cid1)
AND ([cid2] = @Original_cid2)
AND ([m] = @Original_m));
SELECT id, cid1, cid2, m
FROM Currency2
WHERE (cid1 = @cid1) AND (cid2 = @cid2) AND (id = @id)";
where子句是否按照其正式定义实现乐观并发?
我最好的猜测是SELECT的目的是返回更新行的数量,但为什么不使用COUNT(*)?
更新:这是生成的UPDATE代码,它给了我关于(2)中SELECT的想法。
public virtual int Update(int cid1, int cid2, decimal m, int Original_id, int Original_cid1, int Original_cid2, decimal Original_m, int id) {
this.Adapter.UpdateCommand.Parameters[0].Value = ((int)(cid1));
this.Adapter.UpdateCommand.Parameters[1].Value = ((int)(cid2));
this.Adapter.UpdateCommand.Parameters[2].Value = ((decimal)(m));
this.Adapter.UpdateCommand.Parameters[3].Value = ((int)(Original_id));
this.Adapter.UpdateCommand.Parameters[4].Value = ((int)(Original_cid1));
this.Adapter.UpdateCommand.Parameters[5].Value = ((int)(Original_cid2));
this.Adapter.UpdateCommand.Parameters[6].Value = ((decimal)(Original_m));
this.Adapter.UpdateCommand.Parameters[7].Value = ((int)(id));
global::System.Data.ConnectionState previousConnectionState = this.Adapter.UpdateCommand.Connection.State;
if (((this.Adapter.UpdateCommand.Connection.State & global::System.Data.ConnectionState.Open)
!= global::System.Data.ConnectionState.Open)) {
this.Adapter.UpdateCommand.Connection.Open();
}
try {
int returnValue = this.Adapter.UpdateCommand.ExecuteNonQuery();
return returnValue;
}
finally {
if ((previousConnectionState == global::System.Data.ConnectionState.Closed)) {
this.Adapter.UpdateCommand.Connection.Close();
}
}
}
答案 0 :(得分:2)
该查询的作用是,将更新的记录返回给应用程序以供将来使用,以便在内存中更新对象,而不是更新前的状态。它在一次往返中基本上是UPDATE xxx WHERE ID=@ID
和SELECT xxx FROM xxx WHERE ID=@ID
命令。
答案 1 :(得分:1)
是否实施了where子句 正式的乐观并发 定义
排序。它会检查每一列,看看是否有人更改过任何一列。如果记录已更改,则不会更新。
但是,一个定义(来自维基百科)表示,如果记录发生变化,事务将被回滚。这不会发生在这里。