Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по C#_Часть1.doc
Скачиваний:
92
Добавлен:
19.08.2019
Размер:
2.54 Mб
Скачать
      1. Получение измененных записей

Не все записи в наборе данных обновляются. Например, пользователь может работать с элементом управления Windows Forms DataGridView, отображающим множество записей. Однако пользователь может обновить только несколько записей, удалить одну и вставить одну. Для возвращения измененных строк в наборах данных можно применять метод (GetChanges). С помощью этого метода можно создавать подмножества измененных записей набора данных. GetChanges без дополнительных параметров возвратит все измененные записи. В противоположность этому, пересылкой параметра DataRowState в метод GetChanges можно указывать, какое подмножество измененных записей требуется: добавленные записи, помеченные для удаления записи или измененные записи.

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

Чтобы получить все измененные записи из таблицы данных вызовите метод GetChanges объекта DataTable:

DataTable changedRecordsTable =Таблица.GetChanges();

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

DataTable changedRecordsTable =Таблица.GetChanges();

TableBindingSource.DataSource = changedRecordsTable;

DataGridView.DataSource = TableBindingSource;

Для получения всех записей, имеющих определенное состояние строки вызовите метод GetChanges набора данных или таблицы данных и передайте значение перечисления DataRowState в качестве аргумента, например:

DataTable GetNewRecords=Таблица.GetChanges(DataRowState.Added);

  1. Дополнительные сведения по работе с базами данных в Visual Studio

    1. Наборы данных в Visual Studio

Наборы данных представляют собой объекты, содержащие таблицы данных, в которых можно временно хранить данные для их использования в приложении. Если приложение требует работы с данными, можно загрузить их в набор данных. Данные для работы приложения в этом случае будут храниться в локальной памяти. Можно работать с данными в наборе данных, даже если приложение отключается от базы данных. Набор данных хранит информацию об изменениях своих данных. Так что обновления можно отслеживать и отправлять обратно в базу данных, когда приложение вновь подключится к ней.

Наборы данных могут быть типизированными или нетипизированными. Типизированные наборы данных получают свою схему (таблицу и структуру столбцов) из файлов XSD и проще программируются. Для поддержки типизированных наборов данных в Visual Studio предусмотрено больше инструментов, которые упрощают процесс программирования наборов данных и уменьшают вероятность возникновения ошибки.

Создать типизированный набор данных можно, запустив мастер мастер Настройка источника данных, или путем добавления элемента DataSet с помощью команды «Добавить новый элемент» в меню Проект.

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

Наборы данных находятся в пространстве имен System.Data

Объекты набора данных доступны разработчику посредством стандартных программных конструкций, таких как свойства и коллекции.

Заполнение набора данных

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

Код для заполнения набора данных автоматически добавляется в обработчик событий загрузки формы при перетаскивании элементов из окна Источники данных на форму в приложении Windows:

this.Адаптер.Fill(this. БД.Таблица);

например:

this.personTableAdapter.Fill(this.sotrudnicDataSet1.person);

Заполнять наборы данных можно различными способами:

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

  • Вручную таблицы набора данных можно заполнить, создавая объекты DataRow и добавляя их в коллекцию таблицы DataRowCollection. Это можно делать только во время выполнения программы; во время разработки задавать элементы коллекции DataRowCollection нельзя.

  • Считывание XML-документа или потока в набор данных.

  • Копирование содержимого одной таблицы DataTable в другую.

Ограничения

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

  • Уникальное ограничение: новые значения в столбце должны быть уникальными в пределах таблицы.

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

В Visual Studio ограничения создаются неявно при определении набора данных. При добавлении к набору данных первичного ключа неявно создается ограничение уникальности для столбца первичного ключа. Можно указать уникальное ограничение для других столбцов, установив их свойство Unique в true.

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

Зависимость от регистра в наборе данных

По умолчанию имена таблиц и столбцов в наборе данных не зависят от регистра. Это означает, что к таблице person в наборе данных можно также обратиться и по имени Person. Такой подход соответствует соглашениям о присвоении имен, принятым во многих СУБД, включая SQL Server, где имена элементов данных не должны отличаться друг от друга только регистром букв.

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

Чувствительность к регистру может быть также фактором, определяющим способ интерпретации данных в наборе. Например, при фильтрации данных в таблице набора данных критерий поиска может возвращать различные результаты в зависимости от того, учитывается при сравнении регистр или нет. Можно управлять чувствительностью к регистру при фильтрации, поиске и сортировке, устанавливая свойство CaseSensitive набора данных.

Сохранение данных из набора данных обратно в базу данных

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

Например:

Адаптер.Update(БД.Таблица);

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

Метод обновления Update адаптера таблиц проверяет значение свойства RowState, чтобы определить, какие записи необходимо записать в базу данных и какие конкретно команды указанной базы данных (InsertCommand, UpdateCommand или DeleteCommand) должны вызываться.

Навигация по записям в наборах данных

Так как наборы данных представляют собой полностью отсоединенные от базы данных контейнеры данных, то они не поддерживают понятие текущей записи.

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

Например, можно получить четвертую строку таблицы person с помощью следующего кода:

textBox1.Text = sotrudnicDataSet1.Person[3].fio;