2013-03-10 2 views
2

У меня вопрос о обновлении строки Jqgrid. У нас есть таблица базы данных, как показано ниже.Обновление jqGrid Row

ID: 1 field1: джон field2: черный

Представьте, что пользователь хочет обновить первую строку, которая имеет поле с именем ID = 1. Пользователь дважды щелкает по строке и открывает детали строки. Как вы видите, первые строки field1 являются john, а field2 - черным. Что произойдет, если другой пользователь дважды щелкнет одну строку после первого пользователя и обновит поле2 как красное, например? Первый пользователь все еще находится на экране обновления. На его экране поле2 все еще черное. После этого первый пользователь только обновляет поле1 как гнездо и сохраняет строку. Результатом будет поле1: jack, field2: черный. Поскольку первый пользователь не знал об изменении поля2. И изменение второго поля field2 исчезло. Как я могу предотвратить потерю данных в этом примере?

Я обновить все поля, когда пользователь дважды щелкает и сохраняет любые изменения в ряд .. Заранее спасибо

ответ

2

То, что вы описали это стандартная concurrency control проблема. В случае веб-разработки для решения проблемы используйте обычно optimistic concurrency control. В качестве разработчика ASP.NET вы, вероятно, используете Microsoft SQL Server для хранения данных. SQL Server поддерживает очень полезный тип данных rowversion (также известный как timestamp). Столбец с нулевым значением rowversion семантически эквивалентен столбцу binary(8). Основным преимуществом использования rowversion является простота использования. SQL Server поддерживает внутренний счетчик, связанный с базой данных. Счетчик доступен для переменной @@DBTS. Каждый раз, когда строка из таблицы базы данных будет изменена, будет изменен столбец rowversionавтоматически на значение @@DBTS и @@DBTS будет увеличиваться. Можно использовать дополнительный столбец rowversion, чтобы легко определить, изменилось ли какое-либо значение в строке с момента последнего чтения.

Итак, если у вас есть существующая таблица базы данных, вы можете просто добавить один столбец, который будет содержать rowversion (временную метку) счетчика обновления строки. Например, оператор

ALTER TABLE dbo.Users ADD RowUpdateTimeStamp rowversion NOT NULL 

добавит RowUpdateTimeStamp столбец типа rowversion к столу 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) 
) 

Он создает таблицу, в которой вы описали, но таблица будет иметь дополнительный RowUpdateTimeStamp столбец типа rowversion. Важно еще раз подчеркнуть, что не нужно сохранять значение в столбце вручную. SQL Server автоматически сохранит/изменит значения столбца.

Если вы заполнили сетку данными из таблицы, вы можете, например, включить скрытый RowVersion столбец whit значение от RowUpdateTimeStamp столбец таблицы базы данных. Определение соответствующего столбца в colModel выглядит

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

Это означает, что значение из скрытого RowVersion будет посылать вместе со значениями других изменяемых столбцов.

Методы сервера, которые изменяют строки сетки, возвращают модифицированную версию RowUpdateTimeStamp.Я использую aftersavefunc обратный вызов inline editing или afterSubmit из form editing для изменения RowVersion столбец сетки со значением, возвращаемым с сервера.

Если сервер получает запрос на изменение от клиента, он всегда имеет RowVersion модифицирующей строки. Код сервера проверяет, имеет ли соответствующие данные в базе данных меньшее или равное значение в столбце RowUpdateTimeStamp. Это база данных имеет более высокое значение, то еще пользователь уже изменил данные. В случае, если сервер возвращает HTTP-ответ с некоторым кодом HTTP-ошибки (> = 300). jqGrid интерпретирует ответ как ошибку и отображает соответствующее сообщение об ошибке. Для настройки сообщения об ошибке можно использовать errorTextFormat или errorfunc.

Я использую описанный выше подход во всех продуктивных реализациях. Вы можете прочитать дополнительную информацию о предмете в the old answer.

+0

спасибо. Еще один маленький вопрос ниже. Я буду признателен, если вы ответите. –

+0

@Altan Alansu: Если у вас есть другой вопрос, разместите новый вопрос или отредактируйте существующий. – BoltClock

Смежные вопросы