Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Замечание
Классы DataSet и связанные классы являются устаревшими технологиями .NET Framework с начала 2000-х годов, которые позволяют приложениям работать с данными в памяти, пока приложения отключены от базы данных. Технологии особенно полезны для приложений, которые позволяют пользователям изменять данные и сохранять изменения обратно в базу данных. Хотя наборы данных являются проверенными успешными технологиями, рекомендуемый подход для новых приложений .NET заключается в использовании Entity Framework Core. Entity Framework предоставляет более естественный способ работы с табличными данными в виде объектных моделей и имеет более простой интерфейс программирования.
Проверка данных — это процесс подтверждения того, что значения, введенные в объекты данных, соответствуют ограничениям в схеме набора данных. Процесс проверки также подтверждает, что эти значения следуют правилам, установленным для приложения. Рекомендуется проверить данные перед отправкой обновлений в базовую базу данных. Это уменьшает количество ошибок, а также потенциальное количество круговых путей между приложением и базой данных.
Вы можете убедиться, что данные, записываемые в набор данных, действительны, встроив проверки в сам набор данных. Набор данных может проверять данные независимо от того, как выполняется обновление , независимо от того, выполняется ли обновление напрямую с помощью элементов управления в форме, в компоненте или каким-либо другим способом. Так как набор данных является частью приложения (в отличие от серверной части базы данных), это логическое место для создания проверки для конкретного приложения.
Лучшее место для добавления проверки в приложение — в файле частичного класса набора данных. В Visual Basic или Visual C# откройте конструктор наборов данных и дважды щелкните столбец или таблицу, для которой требуется создать проверку. Это действие открывает файл кода, где можно создать обработчик событий ColumnChanging или RowChanging.
Проверка данных
Проверка в наборе данных выполняется следующим образом:
Создав собственную проверку для конкретного приложения, которая может проверять значения в отдельном столбце данных во время изменений. Дополнительные сведения см. в разделе "Практическое руководство. Проверка данных во время изменений столбцов".
Создавая собственную проверку для конкретного приложения, которая может проверять данные на соответствие значениям в процессе изменения всей строки данных. Дополнительные сведения см. в разделе "Практическое руководство. Проверка данных во время изменений строк".
Создавая ключи, уникальные ограничения и т. д. в рамках фактического определения схемы набора данных.
Задав свойства DataColumn объекта, например MaxLength, AllowDBNullи Unique.
Объект DataTable инициирует несколько событий при изменении записи.
- События ColumnChanging и ColumnChanged вызываются во время и после каждого изменения в отдельном столбце. Это ColumnChanging событие полезно при проверке изменений в определенных столбцах. Сведения о предлагаемом изменении передаются с событием в виде аргумента.
- События RowChanging и RowChanged возникают во время и после любых изменений в строке. Событие RowChanging является более общим. Это означает, что изменение происходит где-то в строке, но вы не знаете, какой столбец изменился.
По умолчанию каждое изменение столбца вызывает четыре события. Первое — это события ColumnChanging и ColumnChanged для определенного столбца, который изменяется. Далее следуют события RowChanging и RowChanged. Если в строку вносятся несколько изменений, события будут вызваны для каждого изменения.
Замечание
Метод строки BeginEdit данных отключает RowChanging и RowChanged события после каждого изменения отдельного столбца. В таком случае событие не вызывается до тех пор, пока не будет вызван EndEdit метод, после чего события RowChanging и RowChanged вызываются только один раз. Дополнительные сведения см. в разделе "Отключение ограничений при заполнении набора данных".
Выбор события зависит от того, насколько подробной должна быть проверка. Если важно немедленно обнаружить ошибку при изменении столбца, создайте проверку, используя событие ColumnChanging. В противном случае используйте RowChanging событие, которое может привести к обработке нескольких ошибок одновременно. Кроме того, если данные структурированы таким образом, чтобы значение одного столбца проверялось на основе содержимого другого столбца, выполните проверку во время RowChanging события.
При обновлении записей DataTable объект генерирует события, на которые можно реагировать как во время изменений, так и после их завершения.
Если приложение использует типизированный набор данных, можно создать строго типизированные обработчики событий. При этом добавляются четыре дополнительных типизированных события, для которых можно создавать обработчики: dataTableNameRowChanging, , dataTableNameRowChangeddataTableNameRowDeletingи dataTableNameRowDeleted. Эти типизированные обработчики событий передают аргумент, включающий имена столбцов таблицы, которые упрощают запись и чтение кода.
События обновления данных
| Событие | Описание |
|---|---|
| ColumnChanging | Значение в столбце изменяется. Событие передает вам номер строки и столбца, а также предлагаемое новое значение. |
| ColumnChanged | Значение в столбце было изменено. Событие передает вам строку и столбец, а также предлагаемое значение. |
| RowChanging | Изменения, внесенные в DataRow объект, будут зафиксированы обратно в набор данных. Если метод BeginEdit не был вызван, событие RowChanging инициируется для каждого изменения столбца сразу после инициирования события ColumnChanging. Если вы вызвали BeginEdit перед внесением изменений, событие RowChanging вызывается только при вызове метода EndEdit. Событие передает строку вам вместе со значением, указывающим, какой тип действия (изменение, вставка и т. д.) выполняется. |
| RowChanged | Строка была изменена. Событие передает строку вам вместе со значением, которое указывает, какой тип действия (изменение, вставка и т. д.) выполняется. |
| RowDeleting | Строка удаляется. Событие передает вам строку вместе со значением, указывающим, какой тип действия (удаление) выполняется. |
| RowDeleted | Строка удалена. Событие передает вам строку вместе со значением, указывающим, какой тип действия (удаление) выполняется. |
События ColumnChanging, RowChanging и RowDeleting инициируются в процессе обновления. Эти события можно использовать для проверки данных или выполнения других типов обработки. Так как обновление выполняется во время этих событий, его можно отменить, создав исключение, которое предотвращает завершение обновления.
События ColumnChanged, RowChanged и RowDeleted — это уведомления, которые возникают после успешного завершения обновления. Эти события полезны, если вы хотите предпринять дальнейшие действия на основе успешного обновления.
Проверка данных во время изменений столбца
Замечание
Конструктор наборов данных создает частичный класс, в котором можно добавить логику проверки в набор данных. Созданный конструктором набор данных не удаляет или не изменяет код в частичном классе.
Вы можете проверить данные, когда значение в столбце данных изменяется, отвечая на ColumnChanging событие. При срабатывании этого события передается аргумент события (ProposedValue), содержащий предлагаемое значение для текущего столбца. На основе содержимого e.ProposedValueможно:
Примите предлагаемое значение, не делая ничего.
Отклоните предлагаемое значение, установив ошибку столбца (SetColumnError) при помощи обработчика событий изменения столбца.
При необходимости используйте ErrorProvider элемент управления для отображения сообщения об ошибке пользователю. Дополнительные сведения см. в разделе "Компонент ErrorProvider".
Кроме того, во время RowChanging события можно выполнить проверку.
Проверка данных во время изменений строк
Вы можете написать код, чтобы убедиться, что каждый столбец, который требуется проверить, содержит данные, соответствующие требованиям приложения. Установите столбец так, чтобы показать, что он содержит ошибку, если предлагаемое значение неприемлемо. В следующих примерах формируется ошибка в столбце, если столбец Quantity равен 0 или меньше. Обработчики событий изменения строк должны выглядеть примерно в следующих примерах.
Проверка данных при изменении строки (Visual Basic)
Откройте набор данных в конструкторе наборов данных . Дополнительные сведения см. в пошаговом руководстве. Создание набора данных в конструкторе наборов данных.
Дважды щелкните заголовок таблицы, которую требуется проверить. Это действие автоматически создает RowChanging обработчик DataTable событий в файле частичного класса набора данных.
Подсказка
Дважды щелкните слева от имени таблицы, чтобы создать обработчик событий изменения строки. Если дважды щелкнуть имя таблицы, ее можно изменить.
Private Sub Order_DetailsDataTable_Order_DetailsRowChanging( ByVal sender As System.Object, ByVal e As Order_DetailsRowChangeEvent ) Handles Me.Order_DetailsRowChanging If CType(e.Row.Quantity, Short) <= 0 Then e.Row.SetColumnError("Quantity", "Quantity must be greater than 0") Else e.Row.SetColumnError("Quantity", "") End If End Sub
Проверка данных при изменении строки (C#)
Откройте набор данных в конструкторе наборов данных . Дополнительные сведения см. в пошаговом руководстве. Создание набора данных в конструкторе наборов данных.
Дважды щелкните заголовок таблицы, которую требуется проверить. Это действие создает файл частичного класса для DataTableобъекта .
Замечание
Конструктор наборов данных не создает обработчик событий для RowChanging события автоматически. Необходимо создать метод для обработки RowChanging события и запустить код, чтобы подключить событие к методу инициализации таблицы.
Скопируйте следующий код в частичный класс:
public override void EndInit() { base.EndInit(); Order_DetailsRowChanging += TestRowChangeEvent; } public void TestRowChangeEvent(object sender, Order_DetailsRowChangeEvent e) { if ((short)e.Row.Quantity <= 0) { e.Row.SetColumnError("Quantity", "Quantity must be greater than 0"); } else { e.Row.SetColumnError("Quantity", ""); } }
Чтобы получить изменённые строки
Каждая строка в таблице данных имеет RowState свойство, которое отслеживает текущее состояние этой строки с помощью значений в DataRowState перечислении. Вы можете получать измененные строки из набора данных или таблицы данных, вызвав метод GetChanges у DataSet или DataTable. Вы можете убедиться, что есть изменения, перед вызовом GetChanges, вызвав метод HasChanges набора данных.
Замечание
После фиксации изменений в наборе данных или таблице данных (вызывая AcceptChanges метод), GetChanges метод не возвращает данные. Если приложению необходимо обработать измененные строки, перед вызовом AcceptChanges метода необходимо обработать изменения.
GetChanges Вызов метода набора данных или таблицы данных возвращает новый набор данных или таблицу данных, содержащую только измененные записи. Если требуется получить определенные записи ( например, только новые записи или только измененные записи), можно передать значение из DataRowState перечисления в качестве параметра в GetChanges метод.
Используйте перечисление DataRowVersion для доступа к различным версиям строки (например, исходные значения, которые были в строке перед обработкой).
Получение всех измененных записей из набора данных
GetChanges Вызовите метод набора данных.
В следующем примере создается новый набор данных с именем
changedRecordsи заполняется всеми измененными записями из другого набораdataSet1данных.
Получение всех измененных записей из таблицы данных
Вызовите метод GetChanges таблицы данных.
В следующем примере создается новая таблица данных с именем
changedRecordsTableи заполняется всеми измененными записями из другой таблицыdataTable1данных.
Чтобы получить все записи с определённым состоянием строки
Вызовите метод
GetChangesнабора данных или таблицы данных и используйте значение перечисления DataRowState как аргумент.В следующем примере показано, как создать новый набор
addedRecordsданных и заполнить его только записями, добавленными вdataSet1набор данных.В следующем примере показано, как вернуть все записи, недавно добавленные в таблицу
Customers:
Доступ к исходной версии DataRow
При внесении изменений в строки данных набор данных сохраняет исходные (Original) и новыеCurrent () версии строки. Например, перед вызовом AcceptChanges метода приложение может получить доступ к различным версиям записи (как определено в DataRowVersion перечислении) и обработать изменения соответствующим образом.
Замечание
Различные версии строки существуют только после изменения и перед вызовом AcceptChanges метода.
AcceptChanges После вызова метода текущие и исходные версии совпадают.
DataRowVersion Передача значения вместе с индексом столбца (или именем столбца в виде строки) возвращает значение из конкретной версии строки этого столбца. Измененный столбец определяется во время событий ColumnChanging и ColumnChanged. Это хорошее время для проверки различных версий строк. Однако если у вас временно приостановлены ограничения, эти события не будут возникать, и необходимо программно определить, какие столбцы изменились. Это можно сделать, выполняя итерацию по коллекции Columns и сравнивая различные значения DataRowVersion.
Получение исходной версии записи
Получите доступ к значению столбца, указав DataRowVersion, идентификатор строки, которую вы хотите вернуть.
В следующем примере показано, как использовать значение DataRowVersion для получения исходного значения поля
CompanyNameв DataRow.
Доступ к текущей версии DataRow
Получение текущей версии записи
Перейдите к значению столбца, а затем добавьте параметр в индекс, указывающий, какая версия строки требуется вернуть.
В следующем примере показано, как использовать DataRowVersion значение для получения текущего
CompanyNameзначения поля в :DataRow