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


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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



Несмотря на то, что в объекте 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 proce dures Определяется существующая хранимая процедура, которую 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-запроса



Поделиться:


Последнее изменение этой страницы: 2020-12-09; просмотров: 292; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.14.253.221 (0.172 с.)