• Microsoft .NET
  • ASP.NET
  • Инструкция по файлам куки (Сookie) в ASP.NET для новичков

Доступ к информации базы данных в ASP.NET 2.0 - Определение нарушения параллелизма

ОГЛАВЛЕНИЕ


Определение нарушения параллелизма

По умолчанию, при наличии элемента управления оптимистичным параллелизмом нарушения проходят незаметно. В указанном выше примере, когда менеджер A нажмет на кнопку обновления Update, табличная сетка будет возвращена в состояние до момента редактирования (как и ожидалось), но изменения не появятся в ней. Это происходит потому, что изменения не были применены из-за нестыковки между сохраненными значениями и значениями базы данных, но пользователь не был оповещен.

Если произошло нарушение, и пользовательские изменения не были сохранены, мы должны оповестить о данном факте, указав на то, что их изменения не были записаны, потому что другой пользователь сохранил изменения одновременно с ними. Мы можем определить количество строк, измененных во время обновления, создав обработчик для события RowUpdated, принадлежащего GridView. Данному обработчику события передается объект, который включает в себя свойство AffectedRows. Также существует свойство KeepInEditMode, которое мы можем установить в True для того, чтобы редактируемая строка была в режиме редактирования (тем самым пользователю будет легче повторно применить изменения).

Приложение, доступное в конце данной статьи, включает в себя веб-сайт с двумя рабочими примерами: один из них демонстрирует использование оптимистичного параллелизма с редактированием, а другой демонстрирует его использование при удалении. (Для того, чтобы использовать данные примеры, вам необходимо открыть два окна обозревателя, чтобы воспроизвести сценарий, когда два пользователя осуществляют изменения (либо удаляют) информацию таким образом, что нарушается параллелизм.) В данных примерах я создал обработчик для события RowUpdated элемента GridView со следующим кодом:

Protected Sub Products_RowUpdated(ByVal sender As Object, ByVal e As         System.Web.UI.WebControls.GridViewUpdatedEventArgs) Handles         Products.RowUpdated
   If e.AffectedRows = 0 Then
      'Не было совершено никаких изменений!
      CurrencyConflictMsg.Visible = True

      'Держите конфликтующую строку в режиме редактирования
      e.KeepInEditMode = True

      'Повторная привязка данных, тем самым загружается текущая информация
      Products.DataBind()
   End If
End Sub 

CurrencyConflictMsg является элементом управления Label, который отображает сообщение, оповещающее пользователя о произошедшем нарушении параллелизма. После отображения и указания GridView о том, что он должен оставить строку в режиме редактирования, я повторно привязал информацию к Products, тем самым загрузив изменения, ранее внесенные пользователем. Если вы откроете два окошка обозревателя и воспроизведете случай с менеджерами A и B, то после нажатия кнопки обновления (Update) со стороны менеджера A, в окне вы должны увидеть следующее:


На данном этапе стоит отметить две вещи: информативное сообщение и информацию в редактируемой строке. Во-первых, обратите внимание на большие красные буквы, указывающие на то, что был нарушен параллелизм. Далее, обратите внимание на то, что информация, отображенная в редактируемой строке, не является той, которая была введена менеджером A (который изменил цену на $15.00), а вместо этого была отображена текущая информация базы данных, информация, введенная менеджером B, - а именно оригинальная цена товара ($5.00), отмеченного как"недоступный" (discontinued). Благодаря элементу управления оптимистичным параллелизмом, встроенным в SqlDataSource, а также нескольким строкам кода, мы можем уловить факт попытки переписать изменения, внесеные менеджером В, изменениями, внесенными менеджером А, и в качестве ответа, остановить обновление, обновить табличную сетку текущими значениями из базы данных, а также оставить изменяемую строку в режиме редактирования. Менеджер A может теперь пересмотреть текущие значения,выполнитьнеобходимыеизмененияизатемсохранитьизменения.