我正在C#和SQL Server上的房地产Windows窗体应用程序上工作,这也是一个多用户应用程序。我没有在其中使用Entity Framework或LINQ!
我正在努力如何正确地处理乐观并发冲突。假设DB中有两个表,Properties
和Addresses
。
属性包含一般财产的细节,例如type of property
,no of rooms
,price
等
地址具有属性地址。
加载表单时,它将所有属性信息加载到datagridview
。在这种情况下,它会将Properties
和Addresses
表中的所有信息加载到datagridview
。
用户单击该行上的一行时datagridview
,会将该行上的数据加载到编辑表单中。然后,用户更新并更新数据库。在这种情况下,可能会发生乐观并发冲突(OCV)。
但是,如何存储rowversion
从属性和地址中获取的数据的值,从而有助于处理这种OCV冲突?
最初,我在考虑用户双击该行时,Properties和Addresses表中rowversions
该记录的可以存储在transaction表中。但是,在加载记录后,其他用户可以更改其值,因此显示的内容可能已过时。因此,当用户单击一行时,我需要将“网格”(不在DB中)的确切数据连同其原始值一起发送到编辑表单。正确的方法是什么?rowversion
datagridview
rowversion
PS:有人告诉我处理OCV的正确方法是在SQL服务器而不是ADO .NET中处理它,因为OCV是数据库操作。因此,我希望在数据库中处理它的指导!
谢谢
乐观并发应该由数据库处理。例如
CREATE TABLE Customer (
Id int IDENTITY (1, 1) NOT NULL,
FirstName nvarchar (256) NULL,
LastName nvarchar (256) NULL,
_rowVersion rowversion NOT NULL -- Value generated by SQL Server each time the row is updated
)
加载行时,需要获取SQL Server生成的行版本
SELECT Id, FirstName, LastName, _rowVersion
FROM Customer
保存行时,必须添加测试以确保从加载行到现在之间RowVersion不变
UPDATE Customer SET
FirstName = @FirstName,
LastName] = @LastName,
WHERE Id = @Id AND _rowVersion] = @_rowVersion -- Update using the row version
-- This part can be done in the .NET application if you prefer
SELECT @rowcount = @@ROWCOUNT
IF(@rowcount = 0) -- No row updated => Concurrency Error
BEGIN
RAISERROR ('Concurrency error in procedure %s', 16, 1, 'Customer_Save')
RETURN
END
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句