【问题标题】:jqGrid Row updatingjqGrid 行更新
【发布时间】:2013-03-10 16:29:11
【问题描述】:

我有一个关于 Jqgrid 行更新的问题。我们有一个如下所示的数据库表。

id :1 field1: john field2:black

假设用户想要更新具有名为 id=1 的字段的第一行。用户双击该行并打开该行的详细信息。如您所见,第一行 field1 是 john,而 field2 是黑色。 例如,如果另一个用户在第一个用户之后双击同一行并将 field2 更新为红色,会发生什么情况?第一个用户仍在更新屏幕上。在他的屏幕上,field2 仍然是黑色的。之后,第一个用户仅将 field1 更新为 jack 并保存该行。结果将是 field1:jack,field2:black。因为第一个用户不知道 field2 的变化。而第二个用户的 field2 变化已经消失了.. 在此示例中如何防止数据丢失?

当用户双击并保存行中的任何更改时,我会更新所有字段。 提前致谢

【问题讨论】:

    标签: asp.net jqgrid jqgrid-asp.net


    【解决方案1】:

    您描述的是标准的concurrency control 问题。在 Web 开发的情况下,通常使用optimistic concurrency control 来解决问题。作为 ASP.NET 开发人员,您可能使用 Microsoft SQL Server 来保存数据。 SQL Server 支持非常有用的数据类型rowversion(也称为timestamp 数据类型)。不可为空的 rowversion 列在语义上等同于 binary(8) 列。使用rowversion 的主要优点是使用简单。 SQL Server 支持与数据库关联的内部计数器。计数器可通过@@DBTS 变量访问。每次修改数据库表中的一行时,rowversion 列将自动更改为@@DBTS 的值,@@DBTS 将递增。可以使用额外的rowversion 列轻松确定该行中的任何值自上次读取以来是否发生了变化。

    因此,如果您有一个现有的数据库表,您只需添加一列来保存行更新计数器的行版本(时间戳)。例如语句

    ALTER TABLE dbo.Users ADD RowUpdateTimeStamp rowversion NOT NULL
    

    会将rowversion 类型的RowUpdateTimeStamp 列添加到表dbo.Users。如果您创建新的用户表,您可以执行以下操作

    CREATE TABLE dbo.Users (
        Id int NOT NULL IDENTITY,
        FirstName nvarchar(64) NOT NULL,
        LastName nvarchar(64) NOT NULL,
        RowUpdateTimeStamp rowversion NOT NULL,
        CONSTRAINT PK_Users PRIMARY KEY CLUSTERED (Id ASC),
        CONSTRAINT UC_Users_LastName_FirstName UNIQUE NONCLUSTERED (LastName ASC, FirstName ASC)
    )
    

    它会创建您描述的表,但该表将具有 rowversion 类型的附加 RowUpdateTimeStamp 列。再次强调,不需要手动在列中保存任何值,这一点很重要。 SQL Server 将自动保存/修改列的值。

    如果您使用表中的数据填充网格,例如,您可以将隐藏的RowVersion 列包含在数据库表的RowUpdateTimeStamp 列中的值。 colModel中对应列的定义是这样的

    name: "RowVersion", sortable: false, hidden: true, hidedlg: true,
    editable: true, editrules: { edithidden: false }
    

    这意味着来自隐藏RowVersion的值将与另一个可编辑列的值一起发送。

    修改网格行的服务器方法返回 RowUpdateTimeStamp 的修改版本。我使用inline editingaftersavefunc 回调或form editingafterSubmit 使用从服务器返回的值修改网格的RowVersion 列。

    如果服务器收到来自客户端的修改请求,它总是拥有修改行的RowVersion。服务端代码验证数据库中对应数据的值是否小于或等于 RowUpdateTimeStamp 专栏。如果数据库具有更高的价值,那么 另一个 用户已经修改了数据。如果服务器返回带有一些错误 HTTP 代码 (>=300) 的 HTTP 响应。 jqGrid 将响应解释为错误并显示相应的错误消息。可以使用errorTextFormaterrorfunc 自定义错误信息。

    我在所有生产性实现中都使用上述方法。您可以在the old answer 中阅读有关该主题的更多信息。

    【讨论】:

    • 非常感谢。下面只是另一个小问题。如果你能回答,我将不胜感激。
    • @Altan Alansu:如果您还有其他问题,请发布新问题或编辑现有问题。
    猜你喜欢
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 2013-04-07
    相关资源
    最近更新 更多