Поделиться через


Проверка данных в наборах данных в приложениях платформа .NET Framework

Примечание.

Наборы данных и связанные классы являются устаревшими технологиями платформа .NET Framework с начала 2000-х годов, которые позволяют приложениям работать с данными в памяти во время отключения приложений от базы данных. Они особенно полезны для приложений, которые позволяют пользователям изменять данные и сохранять изменения обратно в базу данных. Хотя наборы данных оказались очень успешными, мы рекомендуем новым приложениям .NET использовать Entity Framework Core. Entity Framework предоставляет более естественный способ работы с табличными данными в виде объектных моделей, и он имеет более простой интерфейс программирования.

Проверка данных — это процесс подтверждения того, что значения, введенные в объекты данных, соответствуют ограничениям в схеме набора данных. Процесс проверки также подтверждает, что эти значения следуют правилам, установленным для приложения. Рекомендуется проверить данные перед отправкой обновлений в базовую базу данных. Это уменьшает количество ошибок, а также потенциальное количество круговых путей между приложением и базой данных.

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

Лучшее место для добавления проверки в приложение — в файле частичного класса набора данных. В Visual Basic или Visual C# откройте конструктор наборов данных и дважды щелкните столбец или таблицу, для которой требуется создать проверку. Это действие открывает файл кода, где можно создать обработчик событий или RowChanging создать ColumnChanging его.

private static void OnColumnChanging(object sender, DataColumnChangeEventArgs e)
{

}

Проверка данных

Проверка в наборе данных выполняется следующим образом:

При изменении в записи вызывается DataTable несколько событий объекта:

  • ColumnChanged События ColumnChanging создаются во время и после каждого изменения в отдельный столбец. Это ColumnChanging событие полезно при проверке изменений в определенных столбцах. Сведения о предлагаемом изменении передаются в качестве аргумента с событием.
  • RowChanged События RowChanging создаются во время и после любых изменений в строке. Событие RowChanging является более общим. Это означает, что изменение происходит где-то в строке, но вы не знаете, какой столбец изменился.

По умолчанию каждое изменение столбца вызывает четыре события. Первое — это ColumnChanging события ColumnChanged для определенного столбца, который изменяется. Далее приведены RowChanging события и RowChanged события. Если в строку вносятся несколько изменений, события будут вызваны для каждого изменения.

Примечание.

Метод строки BeginEdit данных отключает RowChanging и RowChanged события после каждого изменения отдельного столбца. В этом случае событие не вызывается, пока EndEdit метод не будет вызван, когда RowChanging возникают события и RowChanged события только один раз. Дополнительные сведения см. в разделе "Отключение ограничений при заполнении набора данных".

Выбранное событие зависит от того, насколько детализирована проверка. Если важно немедленно поймать ошибку при изменении столбца, выполните проверку сборки с помощью ColumnChanging события. В противном случае используйте RowChanging событие, которое может привести к перехвату нескольких ошибок одновременно. Кроме того, если данные структурированы таким образом, чтобы значение одного столбца проверялось на основе содержимого другого столбца, выполните проверку во время RowChanging события.

При обновлении DataTable записей объект вызывает события, которые можно реагировать на изменения и после внесения изменений.

Если приложение использует типизированный набор данных, можно создать строго типизированные обработчики событий. При этом добавляются четыре дополнительных типизированных события, для которых можно создавать обработчики: dataTableNameRowChanging, , dataTableNameRowChangeddataTableNameRowDeletingи dataTableNameRowDeleted. Эти типизированные обработчики событий передают аргумент, включающий имена столбцов таблицы, которые упрощают запись и чтение кода.

События обновления данных

Мероприятие Description
ColumnChanging Значение в столбце изменяется. Событие передает вам строку и столбец вместе с предлагаемым новым значением.
ColumnChanged Значение в столбце было изменено. Событие передает вам строку и столбец вместе с предлагаемым значением.
RowChanging Изменения, внесенные в DataRow объект, будут зафиксированы обратно в набор данных. Если метод не вызван BeginEdit , RowChanging событие вызывается для каждого изменения столбца сразу после ColumnChanging вызова события. При вызове BeginEdit перед внесением изменений RowChanging событие вызывается только при вызове EndEdit метода.

Событие передает строку вам вместе со значением, указывающим, какой тип действия (изменение, вставка и т. д.) выполняется.
RowChanged Строка была изменена. Событие передает строку вам вместе со значением, указывающим, какой тип действия (изменение, вставка и т. д.) выполняется.
RowDeleting Строка удаляется. Событие передает строку вам вместе со значением, указывающим, какой тип действия (delete) выполняется.
RowDeleted Строка удалена. Событие передает строку вам вместе со значением, указывающим, какой тип действия (delete) выполняется.

RowChangingСобытия ColumnChangingи RowDeleting события создаются во время процесса обновления. Эти события можно использовать для проверки данных или выполнения других типов обработки. Так как обновление выполняется во время этих событий, его можно отменить, создав исключение, которое предотвращает завершение обновления.

RowChanged События ColumnChangedи RowDeleted события — это события уведомлений, которые возникают после успешного завершения обновления. Эти события полезны, если вы хотите предпринять дальнейшие действия на основе успешного обновления.

Проверка данных во время изменений столбца

Примечание.

Конструктор наборов данных создает частичный класс, в котором можно добавить логику проверки в набор данных. Созданный конструктором набор данных не удаляет или не изменяет код в частичном классе.

Вы можете проверить данные, когда значение в столбце данных изменяется, отвечая на ColumnChanging событие. При возникновении это событие передает аргумент события (ProposedValue), содержащий значение, предлагаемое для текущего столбца. На основе содержимого e.ProposedValueможно:

  • Примите предлагаемое значение, не делая ничего.

  • Отклоните предлагаемое значение, задав ошибку столбца (SetColumnError) из обработчика событий изменения столбца.

  • При необходимости используйте ErrorProvider элемент управления для отображения сообщения об ошибке пользователю. Дополнительную информацию см. в разделе Компонент ErrorProvider.

Кроме того, во время RowChanging события можно выполнить проверку.

Проверка данных во время изменений строк

Вы можете написать код, чтобы убедиться, что каждый столбец, который требуется проверить, содержит данные, соответствующие требованиям приложения. Для этого задав столбец, чтобы указать, что он содержит ошибку, если предлагаемое значение неприемлемо. В следующих примерах задана ошибка столбца, если Quantity столбец равен 0 или меньше. Обработчики событий изменения строк должны выглядеть примерно в следующих примерах.

Проверка данных при изменении строки (Visual Basic)

  1. Откройте свой набор данных в Конструкторе наборов данных. Дополнительные сведения см. в пошаговом руководстве. Создание набора данных в конструкторе наборов данных.

  2. Дважды щелкните заголовок таблицы, которую требуется проверить. Это действие автоматически создает 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#)

  1. Откройте свой набор данных в Конструкторе наборов данных. Дополнительные сведения см. в пошаговом руководстве. Создание набора данных в конструкторе наборов данных.

  2. Дважды щелкните заголовок таблицы, которую требуется проверить. Это действие создает файл частичного класса для DataTableобъекта .

    Примечание.

    Конструктор наборов данных не создает обработчик событий для RowChanging события автоматически. Необходимо создать метод для обработки RowChanging события и запустить код, чтобы подключить событие к методу инициализации таблицы.

  3. Скопируйте следующий код в частичный класс:

    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 метод или DataSetDataTable. Вы можете убедиться, что изменения существуют перед вызовом GetChangesHasChanges , вызвав метод набора данных.

Примечание.

После фиксации изменений в наборе данных или таблице данных (вызывая AcceptChanges метод), GetChanges метод не возвращает данные. Если приложению необходимо обработать измененные строки, перед вызовом AcceptChanges метода необходимо обработать изменения.

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

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

Получение всех измененных записей из набора данных

  • GetChanges Вызовите метод набора данных.

    В следующем примере создается новый набор данных с именем changedRecords и заполняется всеми измененными записями из другого набора dataSet1данных.

    DataSet changedRecords = dataSet1.GetChanges();
    

Получение всех измененных записей из таблицы данных

  • GetChanges Вызовите метод DataTable.

    В следующем примере создается новая таблица данных с именем changedRecordsTable и заполняется всеми измененными записями из другой таблицы dataTable1данных.

    DataTable changedRecordsTable = dataTable1.GetChanges();
    

Получение всех записей с определенным состоянием строки

  • GetChanges Вызовите метод набора данных или таблицы данных и передайте DataRowState значение перечисления в качестве аргумента.

    В следующем примере показано, как создать новый набор addedRecords данных и заполнить его только записями, добавленными в dataSet1 набор данных.

    DataSet addedRecords = dataSet1.GetChanges(DataRowState.Added);
    

    В следующем примере показано, как вернуть все записи, недавно добавленные в таблицу Customers :

    private NorthwindDataSet.CustomersDataTable GetNewRecords()
    {
        return (NorthwindDataSet.CustomersDataTable)
            northwindDataSet1.Customers.GetChanges(DataRowState.Added);
    }
    

Доступ к исходной версии DataRow

При внесении изменений в строки данных набор данных сохраняет исходные (Original) и новыеCurrent () версии строки. Например, перед вызовом AcceptChanges метода приложение может получить доступ к различным версиям записи (как определено в DataRowVersion перечислении) и обработать изменения соответствующим образом.

Примечание.

Различные версии строки существуют только после изменения и перед вызовом AcceptChanges метода. AcceptChanges После вызова метода текущие и исходные версии совпадают.

DataRowVersion Передача значения вместе с индексом столбца (или именем столбца в виде строки) возвращает значение из конкретной версии строки этого столбца. Измененный столбец определяется во время ColumnChanging и ColumnChanged события. Это хорошее время для проверки различных версий строк. Однако если у вас временно приостановлены ограничения, эти события не будут возникать, и необходимо программно определить, какие столбцы изменились. Это можно сделать, выполнив итерацию Columns по коллекции и сравнивая различные DataRowVersion значения.

Получение исходной версии записи

  • Доступ к значению столбца путем передачи DataRowVersion строки, которую вы хотите вернуть.

    В следующем примере показано, как использовать DataRowVersion значение для получения исходного CompanyName значения поля в:DataRow

    string originalCompanyName;
    originalCompanyName = northwindDataSet1.Customers[0]
        ["CompanyName", DataRowVersion.Original].ToString();
    

Доступ к текущей версии DataRow

Получение текущей версии записи

  • Перейдите к значению столбца, а затем добавьте параметр в индекс, указывающий, какая версия строки требуется вернуть.

    В следующем примере показано, как использовать DataRowVersion значение для получения текущего CompanyName значения поля в :DataRow

    string currentCompanyName;
    currentCompanyName = northwindDataSet1.Customers[0]
        ["CompanyName", DataRowVersion.Current].ToString();