Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Адаптеры данных и связанные таблицы

Структура компонента доступа к данным ADO.NET | Работа в отрыве от источника данных | Взаимодействие с базой данных через команды | Пул соединений |


Читайте также:
  1. А стоит ли читать модную «молитву задержания»? В молитвословах, изданных Патриархией, ее нет, но множество листовок призывает с помощью этой молитвы задержать приход антихриста.
  2. Адаптер данных (объект DataAdapter)
  3. Алгоритмы операций для хеш-таблицы с открытой адресацией
  4. АНАЛИЗ НОМИНАТИВНЫХ ДАННЫХ
  5. Базы данных, информационно-справочные и поисковые системы
  6. Базы станционных данных

Несмотря на то, что в объекте DataSet может быть несколько связанных таблиц, DataAdapter не имеет в SQL-запросах или хранимых процедурах команд (параметров), отражающих эти реляционные связи. Да это и физически невозможно — ведь, как мы уже раньше отмечали, DataAdapter работает только с одной таблицей в базе данных и с одной таблицей в наборе данных DataSet. Для создания и хранения реляционных связей в DataSet используется другой объект — DataRelation. Кроме возможности создавать и хранить реляционные связи данный объект позволяет управлять ограничениями на работу с таблицами набора данных (например, реализовать каскадное обновление или удаление), а также обеспечивает навигацию в дочерней таблице при перемещении по записям в родительской таблице.

Например, представьте, что вам нужно получить данные из двух связанных таблиц базы данных Northwind: Customers и Orders ("Клиенты" и "Заказы") и показать их в одном объекте DataGrid. Раньше для этого понадобилось бы выполнить объединение этих двух таблиц в одну, например, с использованием оператора join в SQL-запросе, чтобы получить единственный набор записей Recordset и затем его связать с DataGrid. Теперь достаточно определить два объекта DataAdapter: один, чтобы заполнить таблицу customers ("Клиенты") в DataSet и второй, чтобы заполнить таблицу Orders ("Заказы"). В DataSet с использованием объекта DataRelation можно указать, что записи таблицы orders связаны с записями таблицы customers полем customeriD, после чего связать DataSet с объектом DataGrid. Теперь, имея заполненный объект DataSet и отключившись от исходной базы данных, вы по своему желанию можете работать как с каждой таблицей отдельно, так и, вызвав необходимые свойства и методы объекта DataRelation, со связанной парой таблиц. Этого в принципе невозможно было сделать с объектом Recordset, так как он заполнялся информацией из уже объединенного набора записей. Такая возможность является неоспоримым преимуществом

объекта DataSet над объектом Recordset.

Объекту DataAdapter для работы нужно иметь открытое соединение с источником данных, чтобы читать и записывать информацию. Поэтому DataAdapter использует объекты OleDbConnection или SqlConnection, чтобы связаться с источником данных. DataAdapter может одновременно поддерживать до четырех открытых соединений, по одному для каждого типа действия, которое он может выполнить: select, update, insert и delete. Объект OleDbConnection обеспечивает соединение с любым источником данных OLE DB-провайдера. Объект SqlConnection обеспечивает соединение с SQL Server 7.0 и выше. В обоих случаях, объект Connection представляет уникальный сеанс соединения с источником данных.

1.4.2. Адаптеры данных и объекты Command

Используя объект DataAdapter, можно читать, добавлять, модифицировать и удалять записи в источнике данных. Чтобы определить, как каждая из

этих операций должна произойти, DataAdapter поддерживает следующие четыре свойства:

□ SelectCommand — описание команды, которая обеспечивает выборку нужной информации из базы данных;

□ InsertCommand — описание команды, которая обеспечивает добавление записей в базу данных;

□ UpdateCommand — описание команды, которая обеспечивает обновление записей в базе данных;

□ DeleteCommand — описание команды, которая обеспечивает удаление записей из базы данных.

Каждая из этих команд реализована в виде SQL-запроса или хранимой процедуры.

Эти свойства являются самостоятельными объектами и относятся к элементам класса oleDbCommand или Sqlcommand. Данные объекты поддерживают свойство CommandText, содержащее описание SQL-запроса или хранимой процедуры.

Разработчик приложения может самостоятельно сформировать текст OleDbCommand или SqlCommand, хотя чаще в этом нет необходимости, поскольку Visual Studio автоматически генерирует необходимые инструкции SQL при создании объекта DataAdapter. Кроме того, DataAdapter может автоматически генерировать SQL-запросы во время выполнения приложения, если объекты UpdateCommand, Insertcommand или DeleteCommand нe определены на этапе проектирования приложения. Например, вы можете создать или изменить содержимое команды выборки данных, связанной объектом SelectCommand, непосредственно перед тем, как она будет запущена на выполнение.

В Visual Studio также имеется возможность выполнять команды независимо от объекта DataAdapter. Например, когда нет необходимости возвращать набор данных (проверка прав доступа пользователя к базе данных) или когда требуется изменить структуру некоторых таблиц. В этом случае обеспечивается возможность прямой работы с таблицами базы данных на уровне SQL-сервера с удаленных компьютеров, как через локальную сеть, так и через Интернет.

Команды в DataAdapter могут иметь параметры. Например, команда выборки информации (SelectCommand), обычно имеет параметры в предложении where, для того, чтобы получить из базы данных содержимое не всей таблицы, а только записей, соответствующих определенным критериям. Другие команды (например, UpdateCommand) используют параметры для выделения только тех записей в базе данных, которые необходимо модифицировать.

1.4.3. Чтение и обновление данных с использованием объекта DataAdapter

Основная задача, которую должен решать объект DataAdapter — это перемещение информации между основным хранилищем данных на сервере и набором данных DataSet в памяти компьютера пользователя. Объект DataAdapter имеет методы, позволяющие переместить данные между этими двумя компонентами в прямом и обратном направлениях.

Вы можете использовать DataAdapter для выполнения следующих операций.

□ Перемещение записей из таблицы базы данных в соответствующую таблицу объекта DataSet;

Для этих целей используется метод Fill объектов SqlDataAdapter или OleDbDataAdapter. Когда вызывается этот метод, происходит обращение к базе данных с использованием SQL-запроса на основе инструкции select;

□ Передача изменений, сделанных пользователем в таблице объекта DataSet, исходной таблице базы данных.

Для этих целей используется метод Update объектов SqlDataAdapter или OleDbDataAdapter. Когда вызывается такой метод, происходит обращение к базе данных с использованием SQL-запроса на основе инструкций insert, update или delete, в зависимости оттого, что сделал пользователь — добавил, изменил или удалил некоторые записи.

Если в приложении необходимо только получить данные для последовательного просмотра (в режиме read-only), то можно использовать объект DataReader Вместо объекта DataSet. Объект DataReader выбирает информацию из источника (базы) данных и передает ее непосредственно вашему приложению. Как правило, объекты DataReader используются для быстрого просмотра данных в режиме read-only, forward-only, когда не требуется корректирование информации. Например, имеется страница Web-формы, которая просто отображает информацию, полученную из базы данных. Поскольку на Web-форме страница будет обновляться при каждом обращении к источнику данных, то нет необходимости помещать информацию в объект DataSet. Следует отметить, что объект DataAdapter тоже обращается к объекту DataReader для заполнения набора данных DataSet. В Visual Studio

имеется два объекта чтения данных — OleDbDataReader И SqlDataReader, используемых соответственно для OLE DB-источников данных и для SQL Server версии 7.0 и выше.

В Visual Studio при создании набора данных имя результирующей таблицы в объекте DataSet (как и имена колонок) формируется на основе соответствующих имен исходной таблицы источника (базы) данных. Это может быть не совсем удобно как для разработчика, так и для конечного пользователя, поскольку названия колонок может быть слишком длинным или наоборот коротким и малоинформативным. В таком случае естественно возникает желание сменить соответствующие имена и сделать их более понятными и удобными в работе. В Visual Studio разработчики имеют возможность задать новое имя таблицы, создаваемой в DataSet, и новые имена колонок в команде формирования набора данных, а также привести их в соответствие с теми именами, которые используются в базе данных. В объекте DataAdapter имеется коллекция свойств TableMappings, которые обеспечивают поддержку соответствия между названиями элементов (таблиц и колонок) в DataSet и именами соответствующих элементов основного хранилища данных.

1.4.4. Параметры команд объекта DataAdapter

Команды адаптера данных DataAdapter определены в свойстве CommandText объектов SelectCommand, InsertCommand, UpdateCommand и DeleteCommand. Обычно в этих командах содержится такие элементы, как параметры. Ведь заранее неизвестно, например, какие записи будет удалять или обновлять пользователь, это станет ясно только в процессе работы приложения. Причем в каждом сеансе набор этих записей будет различным.

Можно выделить два типа параметров.

Параметры выборки. В реальных приложениях обычно требуется выбрать только некоторое подмножество записей из базы данных. Чтобы осуществить это, используется SQL-запрос или хранимая процедура, которые включают предложение where с параметрами — критериями выборки. Кроме того, когда пользователь модифицирует или удаляет запись, используется предложение where, в котором параметры определяют, какие записи необходимо модифицировать или удалить. Значения параметров становятся известными только во время выполнения приложения, поэтому разработчик не может их заранее однозначно задать в программе.

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

Параметры выборки

Когда требуется выбрать ограниченное подмножество записей, чтобы заполнить таблицу в объекте DataSet, в предложение where SQL-запроса включается один или более параметров, значения которых определяются только во время выполнения приложения. Например, пользователь хочет найти в базе данных книгу, название которой он ввел в текстовом поле Web-формы. Для этого вы должны в свойстве CommandText объекта SelectCommand написать SQL-запрос. Параметры запроса можно определить следующими способами: вопросительным знаком (?) или переменной с именем параметра (перед именем параметра должен стоять знак @). Для обозначения параметров в запросах на основе объектов OleDbCommand используются вопросительные знаки; в запросах на основе объектов SqlCommand использует переменные с именем параметра.

Текст запроса для объекта OleDbCommand может выглядеть следующим образом:

SELECT BookId, Title, Author, Price FROM BOOKS WHERE (Title LIKE?)

Соответственно текст запроса для объекта SqlCommand:

SELECT BookId, Title, Author, Price FROM BOOKS WHERE (Title LIKE @title)

В приложении вы даете возможность пользователю ввести значение параметра запроса (наименование книги — title), например, в текстовом поле, затем присваиваете полученное значение параметру:

OleDbDataAdapterl.Selectcommand.Parameters("title").Value=txtTitle.Text

После этого запускаете команду на выполнение.

В Visual Studio можно формировать SQL-запросы с параметрами, используя встроенное средство Query Builder (построитель запросов).

Параметры обновления

Если объект SelectCommand адаптера данных может иметь или не иметь параметры, то объекты UpdateCommand, InsertCommand и DeleteCommand всегда имеют параметры.

Такие команды как UpdateCommand и InsertCommand всегда требуют наличия параметра для каждого столбца, который будет модифицирован. Кроме того, UpdateCommand И DeleteCommand требуют наличия параметра и в предложения where, который будет идентифицировать те записи, в которые будут вноситься изменения.

Представим приложение, с помощью которого пользователи могут заказывать и покупать книги. Как и обычные покупатели в магазине, они имеют тележку для выбранных книг, которая в приложении реализована в виде таблицы данных — ShoppingCart. В таблице ShoppingCart пользователи заводят новые записи под каждую книгу, которую они хотят купить, с атрибутами: идентификатором книги (BookId) и идентификатором клиента (CustId), которые совместно выступают в роли ключа, однозначно идентифицирующего Каждую запись в таблице ShoppingCart.

Когда пользователь кладет новую книгу в тележку для покупок, он фактически добавляет запись в таблицу ShoppingCart. В приложении эту процедуру можно реализовать с помощью SQL-запроса с инструкцией insert. В этом случае SQL-запрос выглядит следующим образом:

INSERT INTO ShoppingCart (BookId, CustId, Quantity) Values (?,?,?)

Три вопросительных знака в тексте запроса представляют собой параметры, значения которым будут присвоены во время выполнения приложения, соответственно после отработки запроса значения параметров будут переданы в колонки Bookid, Custid, Quantity новой записи таблицы ShoppingCart. Если использовать переменные с именами параметров, тот же самый запрос будет иметь вид:

INSERT INTO ShoppingCart (BookId, CustId, Quantity) Values (@BookId, @CustId, @Quantity)

Если пользователь решает что-нибудь изменить в уже сделанной покупке, например, количество книг, то эту процедуру можно реализовать в приложении с помощью SQL-запроса на обновление, содержащего инструкцию update. Такой запрос может иметь следующий вид:

UPDATE ShoppingCart

SET (BookId=?, CustId=?, Quantity=?)

WHERE (Bookld=? AND Custld=?)

Или, при использовании переменных с именем параметра:

UPDATE ShoppingCart

SET{BookId=@BookId, CustId=@CustId, Quantity=@Quantity)

WHERE (BookId=@BookId AND CustId=@CustId)

В этом SQL-запросе параметры в предложении set используются для заполнения новыми данными соответствующих колонок в таблице ShoppingCart. Параметры в предложении where выделяют тот набор записей, в которых произойдет обновление данных.

Пользователь может также удалить книгу из тележки для покупок. В том случае приложение могло бы вызвать SQL-запрос на удаление с предложением delete следующего типа:

DELETE FROM ShoppingCart WHERE (BookId=? AND CustId=?)

Или для переменных с именем параметра:

DELETE FROM ShoppingCart WHERE (BookId=@BookId AND CustId =@CustId)

Коллекция параметров

Для обеспечения возможности передачи значений параметров из приложения в запрос во время выполнения программы, каждый из четырех объектов (SelectCommand, InsertCommand, UpdateCommand и DeleteCommand) объекта DataAdapter поддерживает свойство Parameters, которое содержит коллекцию параметров, соответствующих параметрам SQL-запроса. В командах для объекта OleDbDataAdapter индивидуальные параметры обозначаются, как OleDbParameter в коллекции параметров OleDbParameterCollection.

По аналогии команды в объекте SQLDataAdapter имеют обозначение параметров SqlParameter в коллекции SqlParameterCollection.

Если вы используете мастера конфигурации адаптера данных (Data Adapter Configuration Wizard), чтобы сконфигурировать объект DataAdapter, то коллекция параметров создается автоматически для всех четырех команд (SelectCommand, InsertCommand, UpdateCommand и DeleteCommand). Если вы перетаскиваете элементы из Server Explorer на форму или компонент, то Visual Studio может выполнить следующие действия:

□ Если вы перетаскиваете таблицу или некоторые колонки таблицы в окно дизайнера формы, то Visual Studio генерирует объект SelectCommand(SQL-запрос с инструкцией select) без параметров и параметризованные объекты UpdateCommand, InsertCommand и DeleteCommand. если вы хотите, чтобы SQL-запрос объекта SelectCommand имел параметры, вы должны конфигурировать их вручную.

□ Если вы перемещаете хранимую процедуру в окно дизайнера формы, тоVisual Studio генерирует объект SelectCommand с параметрами, как и требуется для хранимой процедуры. Однако если вы нуждаетесь в других объектах (UpdateCommand, InsertCommand И DeleteCommand), вы должны сконфигурировать их самостоятельно, вручную задав их параметры.

Наиболее рациональный путь создания параметризированных запросов для объекта DataAdapter — использование мастера Data Adapter Configuration Wizard. После работы мастера, если необходимо, можно изменить конфигурацию параметров вручную в окне Properties.

Структура коллекции Parameters

Каждый элемент коллекции параметров в объектах Command (SelectCommand, UpdateCommand, InsertCommand и DeleteCommand) соответствуют параметру SQL-запроса, записанного в свойство CommandText. Если объект Command представляет собой SQL-запрос с параметрами в виде знаков вопроса, то каждый элемент в коллекции параметров будет соответствовать одному вопросительному знаку в SQL-запросе. Например, следующая инструкция запроса на обновление update требует коллекции из пяти параметров:

UPDATE ShoppingCart

SET (BookId=?, CustId=?, Quantity=?)

WHERE (BookId=? AND CustId=?)

Аналогично для именованных параметров:

UPDATE ShoppingCart

SET (BookId=@BookId, CustId=@CustId, Quantity=@Quantity)

WHERE (BookId=@BookId AND CustId=@CustId)

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

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

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

Поэтому для доступа к индивидуальному параметру коллекции можно сослаться на его индекс (номер) в коллекции. Однако если в объекте поддерживается свойство имя параметра (ParameterName), то возможен доступ к параметру по его имени. В листинге 1.1 приведен пример SQL-запроса на Visual Basic и С#. Вторая и третья строка запроса эквивалентны при условии, что второй параметр в коллекции имеет имя Title_Keyword.

Листинг 1.1

' Visual Basic

titleKeyword="%" & txtTitleKeyword.Text & "%"

OleDbDataAdapterl.SelectCommand.Parameters(1).Value=titleKeyword

OleDbDataAdapterl.SelectCommand.Parameters("Title_Keyword").Value =titleKeyword

 

// C#

string titleKeyword="%"+txtTitleKeyword.Text+"%";

this.OleDbDataAdapterl.SelectCommand.Parameters[1].Value=titleKeyword;

this.OleDbDataAdapterl.SelectCommand.Parameters["Title_Keyword"].Value=titleKeyword;

Здесь в первом случае программа присваивает значение параметру, ссылаясь на его номер в коллекции — 1, во втором случае — на его имя. Использование имени параметра в практике программирования более предпочтительно, чем индекса. При использовании имени уменьшается потребность в переписывании кода, если в ходе работы над проектом вдруг меняется количество параметров, а также отпадает необходимость помнить, возвращает ли хранимая процедура значение.


Для того чтобы получить доступ к имеющейся коллекции параметров, нужно в окне Properties найти свойство Parameters для интересующей вас команды. Например, на рис. 1.10 представлена строка доступа к параметрам команды адаптера данных InsertCommand для таблицы Customers базы данных Northwind.

 

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

 

Установление значений параметров

Есть два способа, с помощью которых можно задать значения параметров:

□ явным заданием значений параметрам через свойство Value;

□ располагая (добавляя) параметры в колонки таблицы объекта DataSet.

Вы устанавливаете значения параметров явно, когда заполняете набор данных или вызываете команду (для параметров выбора). Например, в примере поиска книг, приведенного выше, в приложении есть текстовое поле, в которое пользователь вводит ключевое слово (название книги). В этом случае можно явно установить значение параметра, привязав его к свойству Text тетового поля перед вызовом метода Fill объекта DataAdapter. Пример программного кода такого способа приведен в листинге 1.2.

Листинг 1.2

' Visual Basic

titleKeyword="%" & txtTitleKeyword.Text & "%"

OleDbDataAdapterl.SelectCommand.Parameters("Title_Keyword").Value =titleKeyword

OleDbDataAdapterl.Fill(dsAuthorsl)

 

// C#

titleKeyword="%"+txtTitleKeyword.Text+"%";

this.OleDbDataAdapterl.SelectCommand.Parameters["Title_Keyword"].Value=titleKeyword;

this.OleDbDataAdapterl.Fill(dsAuthorsl);

Параметры должны получить значения и в случаях обновления данных. Когда вызывается метода Update объекта DataAdapter, то осуществляется просмотр всех записей таблицы набора данных DataSet, и модификация записей базовой таблицы (Update, Insert, Delete) происходит на основе значений, полученных из соответствующих колонок каждой записи. То есть параметры получают свои значения из колонок записи набора данных DataSet. Например, если в таблице объекта DataSet была добавлена новая запись и активизирована команда InsertCommand на вставку строки в основную таблицу базы данных, то значения параметров для предложения INSERT этой команды будут считаны из колонок той записи, которая была добавлена в таблицу объекта DataSet. Таков типичный сценарий работы команд обновления данных, но не единственный. Хранимые процедуры тоже могут возвращать данные через коллекцию параметров или через возвращаемое значение. В этом случае возвращенные значения должны быть "привязаны" к соответствующим колонкам таблицы набора данных DataSet.

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

1.4.5. Свойство TableMappings объекта DataAdapter

Когда DataAdapter считывает записи из источника данных, должно быть определено, как разместить полученную информацию в соответствующей таблице объекта DataSet. Это определяется схемой таблицы (table mapping). В такой схеме связываются между собой имена колонок таблицы источника данных с именами колонок таблицы набора данных DataSet. Например, информация из колонки с именем au_id в таблице источника данных может принадлежать колонке с именем author_id_number в таблице объекта DataSet.

По умолчанию, когда Visual Studio генерирует объект DataSet, элементы набора данных (таблицы и колонки) имеют те же самые имена, что и в источнике данных. Однако в некоторых ситуациях имена в источнике данных и наборе данных DataSet могут не совпадать.

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

□ Разработчик изменил имена элементов набора данных для удобочитаемости, для перевода наименований с одного языка на другой или подругой причине.

Сформировать или модифицировать структуру таблицы можно, используя свойство TableMappings адаптера данных, которое включает в себя коллекцию элементов DataTableMapping. Есть только один объект DataTableMapping для каждой отображаемой таблицы, потому что DataAdapter связывает только единственную исходную таблицу и единственную таблицу набора данных. Доступ к этому свойству можно получить из окна Properties объекта DataAdapter (рис. 1.12).

 

При нажатии на кнопку в поле (Collection) свойства TableMappings появляется диалоговое окно, позволяющее редактировать элементы коллекции DataTableMapping (рис. 1.13). Здесь содержатся свойства для идентификации таблицы источника данных и таблицы набора данных, а так же свойство ColumnMappings, содержащее элементы, которые представляют колонки соответствующих таблиц.

Когда происходит вызов метода Fill объекта DataAdapter, то выполняются следующие действия, в результате которых таблица объекта DataSet заполняется данными.

1. Адаптер данных ищет название каждого столбца исходной таблицы в объекте TableMappings.

2. Когда адаптер данных находит название столбца исходной таблицы, то получает название соответствующего ему столбца таблицы набора данных.

3. Получив имена этих двух столбцов, DataAdapter переносит данные от исходного столбца базовой таблицы в соответствующий столбец таблицы набора данных DataSet.

Есть две причины, которые могут воспрепятствовать данному процессу.

□ Не найдена информация об исходном столбце. Это может произойти потому, что он не описан в схеме таблицы (например, разработчик изменил структуру исходной таблицы базы данных после того, как был сформирован объект DataAdapter).

□ Столбец, в который нужно переместить данные, не определен в схеме набора данных.

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

Свойство MissingMappingAction позволяет определить, какое действие адаптер должен выполнить, если в схеме данных отсутствуют некоторые параметры. Данное свойство имеет следующие значения:

□ Passthrough — адаптер пытается загрузить данные исходного столбца в столбец с тем же именем набора данных. Если в наборе данных нет столбца с аналогичным именем, поведение программы в дальнейшем будет зависеть от параметров свойства MissingSchemaAction (см. ниже);

□ Ignore — столбцы, которые должным образом не описаны в схеме, не загружаются данными и остаются пустыми;

□ Error - генерируется ошибка.

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

□ Add — таблица или столбец добавляются к схеме и к набору данных;

□ AddWithKey — таблица или столбец добавляются к набору данных и к схеме, причем добавленный столбец делается ключевым;

□ Ignore — таблица или столбец, не представленные в схеме набора данных не добавляются к набору данных;

□ Error — генерируется ошибка.

Необходимо установить оба этих свойства, чтобы обеспечить устойчивость работы приложения. Например присвоение свойству MissingMappingAction значения Passthrough и свойству MissingSchemaAction значения Add обеспечит эффект автоматического дублирования таблицы источника в наборе данных DataSet.

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

Если задается режим игнорирования ошибки, то обеспечивается гарантированная загрузка тех данных, которые явно определены в схеме или отображены в свойстве TableMappings. Это полезно использовать тогда, когда адаптер данных обращается к хранимой процедуре или SQL-запросу, которые возвращают больше столбцов, чем определено в наборе данных DataSet.

1.4.6. Создание объекта DataAdapter

Объект DataAdapter может быть создан следующими способами:

□ с использованием Server Explorer;

□ с использованием мастера;

□ вручную.

Рассмотрим все эти возможности.

Создание объекта DataAdapter с использованием Server Explorer

Для создания объекта DataAdapter с использованием Server Explorer постройте Windows или Web-приложение, а затем выполните следующие действия.

1. Создайте или откройте форму в соответствующем приложении, активизируйте окно дизайнера формы и перейдите в окно Server Explorer.

2. Если нужный вам объект Connection отсутствует, то создайте его.

3. Откройте объект Connection и войдите в нужный вам элемент этого объекта (Tables, Stored Procedures, Views или Functions). Если, например, вам нужна не вся таблица, а только некоторые колонки, то раскройте следующий уровень и получите доступ к набору колонок таблицы.

4. Выберите одну или более колонок таблицы или хранимой процедуры и перетащите их мышью в окно дизайнера формы (рис. 1.14).

После этого Visual Studio автоматически создаст два объекта Connection и DataAdapter (рис. 1.15).

 

 

Если в качестве источника информации использовалась таблица базы данных, то в объекте DataAdapter будут сформированы команды для чтения и обновления данных. Если в качестве источника была взята хранимая процедура, то будут сформированы команды только для чтения данных.

Перетаскивание элементов данных из окна Server Explorer на проектируемую форму наиболее легкий путь создания объекта DataAdapter, однако он не дает возможности создать параметризованный запрос или новые хранимые процедуры. Для этого можно использовать мастер Data Adapter Configuration Wizard.

Создание объекта DataAdapterc использованием мастера

Мастер Data Adapter Configuration Wizard обеспечивает достаточно простой и самый гибкий способ создания адаптера данных.

Для создания объекта Data Adapter с помощью мастера постройте Windows или Web-приложение (см. соответствующие разделы глав 2 и 3) и выполните следующие действия.

1. Создайте или откройте форму в соответствующем приложении и активизируйте окно дизайнера формы.

2. Из вкладки Data окна Toolbox перенесите объект OleDbDataAdapter илиSqlDataAdapter в область дизайнера формы (рис. 1.16).

После этого Visual Studio добавит соответствующий объект DataAdapter к форме и запустит мастер Data Adapter Configuration Wizard.

3. В мастере последовательно выполняются следующие шаги:

• На второй странице (рис. 1.17) создайте или выберите существующий объект Connection.

• На третьей странице (рис. 1.18) определите, должен ли адаптер данных использовать SQL-запрос или хранимую процедуру (значения переключателей приведены в табл. 1.1).

 
 

 

Таблица 1.1. Значения положений переключателя способа получения записей из базы данных объектом DataAdapter

 

Переключатель Описание
Use SQL statement Создается SQL-запрос на основе предложения SELECT, который DataAdapter будет использовать для заполнения данными результирующей таблицы объекта DataSet, а также мастер сгенерирует запросы на основе предложений update, insert и delete для обновления данных в исходной таблице базы данных
Use newly created stored procedures Определяется запрос на основе предложения SELECT, и мастер создает хранимую процедуру для чтения и обновления источника данных. Если поставщик данных не поддерживает этот параметр, то он будет недоступен
Use existing stored procedures Определяется существующая хранимая процедура, которую DataAdapter будет использовать для чтения и обновления источника данных

Что появится в следующей странице мастера, будет зависеть от сделанного выбора (в данном случае мы выберем переключатель Use SQL statement).

• На четвертой странице (рис. 1.19) создается запрос на выборку данных с предложением SELECT.

На этой странице можно либо просто набрать текст SQL-запроса, либо использовать мастер построения запросов, для запуска которого необходимо нажать кнопку Query Builder. При вызове мастера построения запросов появится дополнительное окно (рис. 1.20) с предложением выбрать одну из таблиц базы данных.

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

После нажатия кнопки ОК мастер завершит свою работу, а текст построенного запроса будет передан мастеру конфигурирования адаптера данных (рис. 1.22).

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

 

 

предупреждающими значками. В нашем случае против каждого элемента стоит отметка о его успешном создании.

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

Если вы хотите изменить название объектов DataAdapter и connection, выберите мышью нужный объект и задайте удобное для вас имя в окне Properties.

Если вы хотите посмотреть, какие данные DataAdapter перенесет в набор данных Dataset, то можно запустить мастера предварительного просмотра данных. Для этого нужно в меню Data выбрать пункт Preview Data и в открывшемся диалоговом окне Data Adapter Preview нажать кнопку Fill Uataset (рис. 1.24).

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

Создание и конфигурирование объекта DataAdapter вручную

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

Для создания объекта DataAdapter вручную вам необходимо выполнить следующие действия.

1. Убедитесь, что объект Connection создан и расположен на проектируемой форме или компоненте.

2. Из вкладки Data окна Toolbox перенесите объект OleDbDataAdapter или SqlDataAdapter в область дизайнера формы. Visual Studio добавит соответствующий объект DataAdapter к форме и запустит мастер DataAdapter Configuration Wizard.

3. Закройте мастера Data Adapter Configuration Wizard.

Процесс ручного конфигурирования объекта DataAdapter заключается в следующем.

1. Выделите мышью объект DataAdapter и перейдите в окно Properties, где можно сформировать команды, позволяющие читать и обновлять данные. В первую очередь необходимо сформировать объект SelectCommand (рис. 1.25). Если DataAdapter будет использоваться и для модернизации таблицы источника данных, то также необходимо сформировать объекты UpdateCommand, DeleteCommand, InsertCommand.

Для каждого объекта Command необходимо задать следующие свойства (табл. 1.2).

Таблица 1.2. Свойства объекта Command

 

Свойство Описание
ActiveConnection Устанавливает ссылку на объект Connection. Кроме того, мож-  
  но создать новый объект Connection в свойстве  
  ActiveConnection окна Properties.Как правило, все объекты  
  Command используют один и тот же объект connection. Однако  
  вы имеете возможность использования различных объектов  
  Connection для каждого из объектов Command  
CommandText Содержит текст SQL-запроса или имя хранимой процедуры. Для  
  некоторых провайдеров возможно создание мультизапроса или  
  хранимой процедуры с несколькими инструкциями, разделен-  
  ными точкой с запятой (;). Эти инструкции выполняются после-  
  довательно. Это полезно для ситуаций, когда после добавления  
  или удаления записей нужно повторно получить из базы данных  
  обновленную информацию  
CornmandType Тип команды в свойстве CommandText. Может принимать следующее значения: □Text — текст SQL-запроса
  □StoredProcedure — хранимая процедура
  □TableDirect — имя таблицы
Parameters Коллекция объектов Parameter, через которые значения параметров передаются команде. В объекте SelectCommand создается коллекция параметров только в том случае, если команда возвращает не все записи исходной таблицы. Объекты UpdateCommand, InsertCommand И DeleteCommand всегда требуют определения параметров

2. Определите свойство MissingMappingAction. По умолчанию это свойство имеет значение Passthrough, при котором именам таблиц и колонок результирующего набора данных автоматически присваиваются имена соответствующих элементов источника данных. Если вы не хотите иметь одинаковые имена столбцов в таблице источника данных и таблице набора данных нужно задать желаемую схему соответствия данных.

3. В меню Data выберите пункт Generate DataSet.

4. Если вы хотите увидеть, какими данными DataAdapter заполнил набор данных DataSet, вызовите окно предварительного просмотра данных.

1.4.7. Конфигурирование параметров объекта DataAdapter

В большинстве случаев команды адаптера данных (SelectCommand, InsertCommand, UpdateCommand И DeleteCommand) построены на основе SQL- запросов с параметрами. Если для создания объекта DataAdapter использовать мастер Data Adapter Configuration Wizard, то параметры для этих команд будут сконфигурированы автоматически. Однако вы можете сконфигурировать параметры вручную, или сделать необходимые изменения в уже существующей коллекции параметров.

Для конфигурации параметров объекта DataAdapter необходимо.

1. Создать объект DataAdapter.

2. В форме мышью выделить объект DataAdapter и открыть окно свойств Properties (рис. 1.26).

3. Раскройте объект Command, для которого вы хотите сконфигурировать параметры (например, UpdateCommand) и затем в свойстве Parameters нажмите кнопку, чтобы открыть окно SqlParameter Collection Editor (рис. 1.27).

 

4. Для создания нового параметра щелкните на кнопке Add.

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

6. Чтобы установить требуемое свойства параметра, выберите его в списке Members и затем назначьте ему нужное свойство. В табл. 1.3. перечислены типовые свойства, которые вы можете установить.

 

 

Таблица 1.3. Свойства параметров объектов DataCommand адаптера данных

 

Свойство Описание
SourceColumn Имя столбца в таблице набора данных, из которого будет читаться значение параметра. Это свойство используется с параметрами, которые заполняются значениями в запросах update, insert или delete (то же в хранимых процедурах)
SourceVersion Если параметр получает значение из свойства SourceColumn, то SourceVersion определяет, какая версия записи набора данных будет использоваться, как источник значения параметра:
□Original— значение столбца, которое было получено из базы данных. Вы можете использовать данное значение тогда, когда вам необходимо иметь то значение столбца, которое было до его изменения. Например, было изменено значение ключевого поля, но вам необходимо иметь старое значение этого поля, чтобы найти нужную запись в базе данных
□ Current— значение столбца после того, как запись была изменена. Это обычно то значение, которое будет записано в базу данных
□ Default— значение, которое будет присвоено столбцу, если никакое другое значение явно не задано
Value Значение, присвоенное параметру. Это свойство обычно устанавливается динамически (во время выполнения программы), а не статически во время ее разработки
  Свойство Value имеет приоритет по отношению к свойству SourceColumn, если они оба установлены
NamedParameter Поименованный параметр. Булево значение, указывающее, что параметр является переменной с именем (@parametername) или меткой (?). Если вы работаете с объектом SqlConnection и используете поименованные параметры, то установите значение
DBType, Precision, Scale, Size Информация о типе значения параметра (в источнике данных). Значение параметра будет конвертировано в тип данных, который вы определили, или из него
Direction Указание направления: передается ли значение параметра к команде или от команды:  
  • Input — значение передается к команде. Это значение установлено по умолчанию  
  • Output — значение передается к хранимой процедуре (не используется с SQL-запросами)  
  • InputOutput — значение передаются к хранимым процедурам и возвращаются назад, обычно в измененном виде  
  • ReturnValue — явно возвращаемое значение. По умолчанию возвращаемое значение — первый элемент в коллекции параметров (с индексом 0)  
ParameterName Имя, по которому можно обратиться к параметру вместо его номера в коллекции. Для простоты последующего сопровождения приложения рекомендуется использовать имя параметра, а не его номер  

7. Нажмите кнопку ОК для закрытия окна SqlParameter Collection Editor.

8. Повторите шаги с 3-го по 7-й для задания конфигурации параметров других объектов Command.

1.4.8. Связывание колонок таблиц источника данных и объекта DataSet через адаптер данных

В Visual Studio в объекте DataAdapter имеется возможность установить соответствие между колонками таблицы базы данных (источника данных) и колонками таблицы объекта DataSet. Это обеспечивает возможность сменить наименование колонок и сделать их удобочитаемыми как для разработчика, так и для конечного пользователя приложения.

Для установления соответствия между колонками таблиц выполните следующие действия.

1- Создайте Объект DataAdapter.

2- Мышью установите фокус на объекте DataAdapter в окне дизайнера формы и откройте окно Properties этого объекта.

3- Далее в строке свойства TabieMappings нажмите кнопку (Collection) (рис. 1.28).

После этого откроется диалоговое окно TabieMappings (рис. 1.29).

4- Если вы хотите использовать имена колонок из таблицы источника данных в колонках таблицы созданного объекта Dataset, установите флажок Use a dataset to suggest table and column names, и затем из списка Dataset выберите интересующий вас набор данных.

Далее вы можете выбрать нужную таблицу из источника данных — Sourse table, и нужную таблицу из результирующего набора данных — Dataset table. Имена колонок этих таблиц будут представлены соответственно в левой и правой части сетки Column mappings.

5. В столбце Source table, выберите таблицу в источнике данных. Если там присутствует только одна таблица, то вместо ее имени будет стоять значение Table.

6. В столбце Dataset table выберите таблицу из набора данных. Если вы уже определили набор данных на шаге 4, то имя таблицы будет уже заполнено (по умолчанию первая таблица набора данных будет отмечена как Table).

7. На основе вашего выбора (или того, что было установлено по умолчанию), имена колонок будут внесены в список разделов Source Columns и Dataset Columns. Иными словами, будет установлено соответствие между колонками: каждому названию колонки в левой части сетки Column mappings будет сопоставлено название соответствующей колонки в правой части.

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

 

• Изменить связи между колонками — к колонке объекта Dataset можно "привязать" любую другую колонку источника данных.

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

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

Для примера изменим наименования колонок в Dataset и введем наименования колонок на русском языке (рис. 1.30).

9. Когда закончен процесс взаимной привязки колонок, нажмите кнопку ОК.

10. Если вы хотите определить, как должно вести себя приложение в случаях возникновения ошибок, в окне Properties выберите нужное значение свойств MissingMappingAction и MissingSchemaAction. В табл. 1.4 описаны возможные варианты и получаемый эффект.

Таблица 1.4. Возможные значения свойств MissingMappingAction и MissingSchemaAction и получаемый эффект

 

MissingMappingAction MissingSchemaAction Эффект
Passthrough Add or AddWithKey Если колонка существует в таблице
  источника данных, но ее нет в табли-
  це приемника данных, то эта колонка
  будет создана динамически во время
  заполнения данными объекта
  DataSet. Эти значения установлены
  по умолчанию, и такое задание по-
  лезно тогда, когда необходимо ко-
  пировать в набор данных все колон-
  ки, доступные в источнике
Ignore Ignore Если колонка не определена в схеме
  набора данных, или нет никакой при-
  вязки ее к источнику данных, то ин-
  формация от источника данных не
  будет перенесена в объект DataSet.
  Эта установка полезна, если адаптер
  возвращает больше колонок, чем
  описано в приемнике данных
  DataSet
Error Error Будет сгенерирована ошибка во
  время выполнения приложения, если
  адаптер не сможет сопоставить ис-
  ходную колонку с колонкой набора
  данных. Эта установка полезна то-
  гда, когда вам необходимо строгое
  соблюдение описанной схемы обме-
  на информацией между источником
  и приемником данных

1.4.9. Предварительный просмотр данных, полученных объектом DataAdapter

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

Для предварительного просмотра результатов работы объекта DataAdapter выполните описанные ниже действия.

1. Создайте Объект DataAdapter.

2. В форме выделите мышью объект DataAdapter и откройте окно свойств Properties.

3. В нижней части окна щелкните мышью на ссылке Preview Data (рис. 1.31).

При этом откроется окно предварительного просмотра данных.

4. Выберите нужный адаптер данных из списка Data Adapter или выберите пункт All DataAdapters.

5. Если команда, на которую ссылается объект SelectCommand, требует параметров, то введите значения параметров в поля в таблице Parameters.

6. Нажмите кнопку Fill Dataset для запуска команды выборки данных на исполнение (рис. 1.32).

Результаты работы команды Selectcommand будут показаны в области Results. Если адаптер получает данные больше чем от одной таблицы источника данных (так может произойти при вызове хранимой процедуры), то в списке таблиц будет несколько имен таблиц. Вы можете выбрать необходимую таблицу, вызвав этим ее содержимое для предварительного просмотра. Обратите внимание, на рис. 1.32 колонки таблицы, полученные от адаптера данных, имеют русские названия, несмотря на то, что мы не изменяли их в исходной таблице базы данных. Это результаты нашей работы, проделанной при конфигурирования свойства TableMappings.

7. Повторите эти действия для других адаптеров данных или с другими значениями параметра. По умолчанию, каждый новый результат выборки добавляется к предыдущему. Чтобы очистить данные в окне предварительного просмотра данных щелкните на кнопку Clear Results.

После общего знакомства с ADO.NET в следующей главе мы приступим к работе с основным объектом — DataSet.


Дата добавления: 2015-11-04; просмотров: 288 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Адаптер данных (объект DataAdapter)| Настройка модема 2640

mybiblioteka.su - 2015-2024 год. (0.077 сек.)