Чтение онлайн

на главную - закладки

Жанры

Обработка баз данных на Visual Basic®.NET

Прайс Кевин Т.

Шрифт:

Me.SqlUpdateCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Original_FirstName", System.Data.SqlDbType.VarChar, 50, System.Data.ParameterDirection.Input, False, Byte), CType(0, Byte), "FirstName", System.Data.DataRowVersion.Original, Nothing))

Me.SqlUpdateCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Original_LastName", System.Data.SqlDbType.VarChar, 70, System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "LastName", System.Data.DataRowVersion.Original, Nothing))

Me.SqlUpdateCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter(System.Data.SqlDbType.Money, 8, System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "Salary", System.Data.DataRowVersion.Original, Nothing))

Me.SqlUpdateCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@ID", System.Data.SqlDbType.Int, 4, "ID"))

Для

данного объекта-команды заданы десять параметров. Первые четыре параметра являются текущими (возможно, измененными) значениями полей, которые следует обновить в базе данных. Как сообщается в главе 5, "ADO.NET: объект DataSet", каждая запись может иметь одну из четырех версий значения в каждой записи. По умолчанию используется текущее значение из считываемого поля.

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

System.Data.DataRowVersion.Original

НА ЗАМЕТКУ

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

Последний параметр — текущее значение поля ID — применяется в качестве параметра команды SELECT, используемой для возвращения обновленных значений записи.

После каждой операции вставки, обновления или удаления объект DataAdapter проверяет количество строк, охваченных операцией. Если количество строк равно нулю, то генерируется исключительная ситуация DBConcurrencyException, поскольку обычно предполагается, что это результат конфликта при параллельном доступе к данным. Для ее перехвата и обработки следует включить блок Try-Catch в подпрограмму btnUpdate_Click, которая показана в листинге 7.3.

Листинг 7.3. Блок Try-Catch для обработки исключительной ситуации DBConcurrencyException

Private Sub btnUpdate_Click(ByVal sender As System.Object, _

 ByVal e As System.EventArgs) Handles btnUpdate.Click

 Try

daEmployees.Update(dsEmployeeInfo, "Employees")

 Catch ec As DBConcurrencyException

' Выполнить какие-то действия.

 Catch es As DBConcurrencyException

MessageBox.Show(es.Message)

 End Try

End Sub

Отображения

таблиц и полей

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

В данном примере в методе Fill объекта DataAdapter указывается объект DataSet и имя таблицы в этом наборе данных.

daEmployees.Fill(dsEmployeelnfo, "Employees")

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

Это значит, что можно, например, добавить отображение MappingName и отобразить его на таблицу empDataSetTable с помощью кода

daEmployees.TableMappings.Add("MappingName", "empDataSetTable")

А затем можно вызвать метод Fill следующим образом:

daEmployees.Fill(dsEmployeeInfo, "MappingName")

При этом считанные данные вставляются в таблицу empDataSetTable объекта dsEmployeeInfo.

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

Например, тестовая баз данных pubs, которая входит в состав SQL Server, была создана много лет назад, когда существовали очень строгие ограничения для имен полей, поэтому сейчас они имеют вид малопонятных аббревиатур. Отображения полей позволяют загружать данные из базы данных pubs в объект – набор данных с более понятными именами полей. Благодаря отображению удается удовлетворить все самые строгие требования и соглашения об именах, которые могут предъявляться со стороны администратора базы данных и архитектора приложения.

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

Листинг 7.4. Отображение таблицы и полей

daEmployees.TableMappings.Add("MappingName", "empDataSetTable")

With daEmployees.TableMappings("MappingName").ColumnMappings

Поделиться:
Популярные книги

Возрождение Феникса. Том 2

Володин Григорий Григорьевич
2. Возрождение Феникса
Фантастика:
фэнтези
попаданцы
альтернативная история
6.92
рейтинг книги
Возрождение Феникса. Том 2

Вперед в прошлое 3

Ратманов Денис
3. Вперёд в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 3

Сумеречный Стрелок 4

Карелин Сергей Витальевич
4. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный Стрелок 4

Аномалия

Юнина Наталья
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Аномалия

Весь цикл «Десантник на престоле». Шесть книг

Ланцов Михаил Алексеевич
Десантник на престоле
Фантастика:
альтернативная история
8.38
рейтинг книги
Весь цикл «Десантник на престоле». Шесть книг

Диверсант

Вайс Александр
2. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Диверсант

Кодекс Охотника. Книга XVI

Винокуров Юрий
16. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XVI

Дело Чести

Щукин Иван
5. Жизни Архимага
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Дело Чести

Граф

Ланцов Михаил Алексеевич
6. Помещик
Фантастика:
альтернативная история
5.00
рейтинг книги
Граф

Я Гордый часть 2

Машуков Тимур
2. Стальные яйца
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я Гордый часть 2

Начальник милиции 2

Дамиров Рафаэль
2. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Начальник милиции 2

Авиатор: назад в СССР 10

Дорин Михаил
10. Покоряя небо
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Авиатор: назад в СССР 10

Курсант: Назад в СССР 11

Дамиров Рафаэль
11. Курсант
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Курсант: Назад в СССР 11

Адепт. Том 1. Обучение

Бубела Олег Николаевич
6. Совсем не герой
Фантастика:
фэнтези
9.27
рейтинг книги
Адепт. Том 1. Обучение