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


Изменение данных в наборах данных с помощью .NET Framework

Замечание

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

В этой статье описывается, как запрашивать и изменять данные в таблицах в наборах данных .NET Framework. Вы можете изменять данные в таблицах данных так же, как и в любой базе данных. В таблицу можно вставить, обновить и удалить записи. В форме, связанной с данными, можно указать, какие поля можно изменять пользователем.

В таких случаях инфраструктура привязки данных обрабатывает все отслеживание изменений, чтобы изменения могли быть отправлены обратно в базу данных. При программном изменении данных и необходимости отправки изменений обратно в базу данных необходимо использовать объекты и методы, которые выполняют отслеживание изменений.

Помимо изменения фактических данных, можно также выполнить запрос с помощью DataTable, чтобы получить определенные строки данных. Например, можно запросить отдельные строки, исходные или предлагаемые версии строк, измененных строк или строк, содержащих ошибки.

Предпосылки

Чтобы использовать Visual Studio для запроса и редактирования данных в наборах данных .NET Framework, вам потребуется:

Изменение строк в наборе данных

Чтобы изменить существующую строку в DataTable, необходимо найти DataRow, которые вы хотите изменить, а затем назначить обновленные значения нужным столбцам.

Если вы не знаете индекс строки, которую вы хотите изменить, используйте FindBy метод для поиска по первичному ключу.

NorthwindDataSet.CustomersRow customersRow = 
    northwindDataSet1.Customers.FindByCustomerID("ALFKI");

customersRow.CompanyName = "Updated Company Name";
customersRow.City = "Seattle";

После того как вы знаете индекс строки, вы можете использовать его для доступа и изменения строки.

northwindDataSet1.Customers[4].CompanyName = "Updated Company Name";
northwindDataSet1.Customers[4].City = "Seattle";

Вставка новых строк в набор данных

Приложения, использующие элементы управления с привязкой к данным, обычно добавляют новые записи с помощью кнопки "Добавить новое " в элементе управления BindingNavigator.

Вы также можете добавить новую запись в набор данных, вызвав NewRow метод в объекте DataTable. Затем добавьте строку в коллекцию DataRow (Rows).

NorthwindDataSet.CustomersRow newCustomersRow = 
    northwindDataSet1.Customers.NewCustomersRow();

newCustomersRow.CustomerID = "ALFKI";
newCustomersRow.CompanyName = "Alfreds Futterkiste";

northwindDataSet1.Customers.Rows.Add(newCustomersRow);

Удаление записей из таблицы данных

Можно удалить DataRow , вызвав Remove метод DataRowCollectionобъекта или вызвав Delete метод DataRow объекта.

Метод Remove удаляет строку из коллекции. Если приложению не нужно отправлять обновления обратно в источник данных, вы можете удалить записи, напрямую используя коллекцию Removeстрок данных.

И наоборот, метод Delete фактически не удаляет DataRow, но помечает его для удаления. Фактическое удаление происходит при вызове AcceptChanges метода. Вы можете программно проверить, какие строки помечены для удаления перед их удалением.

Чтобы сохранить сведения, необходимые набору данных для отправки обновлений в источник данных, используйте Delete метод для удаления DataRow из таблицы данных. Если ваше приложение использует TableAdapter или DataAdapter, метод Update удаляет строки, которые имеют значение RowState для Deleted.

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

northwindDataSet1.Customers.Rows[0].Delete();

Замечание

Если вы запрашиваете свойство количества объекта DataRowCollection, итоговое количество включает записи, помеченные для удаления. Чтобы получить точное количество записей, не помеченных для удаления, выполните цикл по коллекции и проверьте свойство RowState каждой записи. Записи, помеченные для удаления, имеют значение RowStateDeleted. Кроме того, можно создать представление данных набора данных, который фильтрует по состоянию строки и получить из него свойство count.

Определение наличия измененных строк

При внесении изменений в записи в наборе данных информация об этих изменениях сохраняется, пока они не будут подтверждены. Изменения фиксируются при вызове метода AcceptChanges набора данных или таблицы данных, либо метода Update адаптера данных TableAdapter.

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

  • Каждая строка данных содержит сведения, связанные с его RowState, напримерAdded, Modifiedили DeletedUnchanged.

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

Чтобы проверить измененные строки, вызовите HasChanges метод набора данных. Метод возвращается true , если изменения были внесены в набор данных. После определения того, что изменения существуют, можно вызвать метод у GetChanges, DataSet или DataTable чтобы вернуть набор измененных строк.

Следующий пример демонстрирует проверку возвращаемого значения метода HasChanges, чтобы определить, есть ли измененные строки в NorthwindDataset1.

if (northwindDataSet1.HasChanges()) 
{
    // Changed rows were detected, add appropriate code.
}
else
{
    // No changed rows were detected, add appropriate code.
}

Определение типа изменений

Вы можете проверить, какой тип изменений были внесены в набор данных, передав значение из DataRowState перечисления в HasChanges метод.

В следующем примере показано, как проверить NorthwindDataset1 набор данных, чтобы определить, были ли добавлены новые строки.

if (northwindDataSet1.HasChanges(DataRowState.Added)) 
{
    // New rows have been added to the dataset, add appropriate code.
}
else
{
    // No new rows have been added to the dataset, add appropriate code.
}

Поиск строк с ошибками

При работе с отдельными столбцами и строками данных могут возникнуть ошибки. Вы можете проверить HasErrors свойство, чтобы определить, существуют ли ошибки в объекте DataSet, DataTableили DataRow.

HasErrors Если свойство набора данных имеет значениеtrue, выполните итерацию по коллекциям таблиц, а затем по строкам, чтобы найти строки с ошибками.

private void FindErrors() 
{
    if (dataSet1.HasErrors)
    {
        foreach (DataTable table in dataSet1.Tables)
        {
            if (table.HasErrors)
            {
                foreach (DataRow row in table.Rows)
                {
                    if (row.HasErrors)
                    {
                        // Process error here.
                    }
                }
            }
        }
    }
}
  • инструменты работы с наборами данных в Visual Studio