【发布时间】:2021-09-03 18:17:26
【问题描述】:
我遇到了 .NET(框架,带 WinForm 和 WebForms)/MS SQL 项目,其中数据库中的重要表包含一个 TIMESTAMP(又名 ROWVERSION)列(称为 tsModified)以防止并发问题。此外,该项目不允许应用层直接与表交互(而是所有 CRUD 和业务逻辑都必须通过存储过程完成)。
让我发疯的一件事是如何在 UPDATE 期间使用可以解释 TIMESTAMP 列的 SqlDataSource。
CRUD procs 的基本形式如下:
CREATE PROC Customer_List
@pk_Customer INT = null
SELECT id, name, tsModified
FROM Customer
WHERE @pk_Customer IS NULL OR @pk_Customer = id;
CREATE PROC Customer_Update
@id INT,
@name varchar,
@tsMod TIMESTAMP
IF NOT EXISTS (SELECT TOP 1 1 FROM Customer where id=@id and tsModified=@tsModified)
Return; --actually RAISEERROR w/ a concurrency alert telling the user to refresh & try again
UPDATE Customer SET [param/value pairs] WHERE id = @id;
当然,您可以手动定义部分类和方法来解释 tsModified,然后使用 asp:ObjectDataSource,但这是额外的工作。我只想方便地在表单上放置一个 asp:SqlDataSource,然后继续我的一天。
但是... SqlDataSource 不喜欢将 TIMESTAMP 作为参数。事实上,我确实花了几天时间研究如何使这项工作发挥作用,并且遇到了很多其他人遇到同样的问题。
我终于明白了。请参阅下面的答案。
【问题讨论】:
标签: asp.net sqldatasource sql-timestamp database-concurrency rowversion