- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Обработка баз данных на Visual Basic®.NET - Джеффри Мак-Манус
Шрифт:
Интервал:
Закладка:
Как и следовало ожидать, для каждого типа провайдера данных .NET используется специализированный объект: SqlDataAdapter, OledbDataAdapter или OdbcDataAdapter.
Для автоматической генерации команд нужно указать объект SelectCommand адаптера данных DataAdapter. Объект CommandBuilder использует схему таблицы, полученную с помощью метода Select объекта SelectCommand для генерации соответствующей команды вставки, обновления или удаления. Учтите, что поля, возвращаемые объектом SelectCommand, должны содержать первичный ключ или поле с уникальными значениями.
Изменение текста команды SELECT после автоматической генерации команд обновления может привести к возникновению исключительных ситуаций при одновременном выполнении этой команды обновления. Если в исходной команде SELECT, на основании которой автоматически генерируются команды обновления данных, содержались поля, которых уже нет в генерированной команде, то при выполнении одной из команд обновления с помощью метода Update объекта DataAdapter может произойти попытка обращения к уже несуществующим полям и возникновение исключительной ситуации. Для исключения этой проблемы следует вызвать метод RefreshSchema объекта CommandBuilder после изменения свойства SelectCommand объекта DataAdapter или после изменения текста (объект CommandText) данной команды.
НА ЗАМЕТКУДаже после того как объект CommandBuilder автоматически сгенерировал команды вставки, обновления или удаления, соответствующие им свойства объекта DataAdapter не изменяются. Объект CommandBuilder скрывает сгенерированные команды, и доступ к ним можно получить с помощью методов GetInsertCommand, GetUpdateCommand и GetDeleteCommand.
Хотя конструктор команд CommandBuilder прост в применении, нужно учитывать его ограничения. Основное ограничение связано с тем, что нельзя проконтролировать выполняемые им действия, т.е. задать его конфигурацию. Он просто генерирует команды обновления на основе заданной команды SELECT без каких-либо параметров. Кроме того, он предназначен для выполнения команд по отношению к одной таблице базы данных. Иначе говоря, объект DataTable с результатами объединения таблиц не может использоваться объектом CommandBuilder. Более того, команды генерируются для одной таблицы без учета ее возможных связей с другими таблицами базы данных, что может привести к нарушению целостности данных при наличии между таблицами родительско-дочерних отношений.
Еще одно ограничение объекта CommandBuilder связано с тем, что он не способен генерировать команды обновления, если имя таблицы или поля содержит специальные символы, например пробел, точку или другие не буквенно-цифровые символы, даже если это имя заключено в кавычки. Однако он может работать с полностью квалифицированными именами таблиц в формате база_данных.владелец.таблица.
Чтобы извлекать и сохранять данные в базе данных с помощью объекта DataAdapter, создадим в проекте DataSetCode еще одну форму. Для этого выполните перечисленные ниже действия.
1. Создайте новую кнопку непосредственно под кнопкой DataAdapter Fill, перетаскивая ее из панели элементов управления. В окне свойств Properties укажите значение btnDataAdapterUpdate для свойства (Name) и значение DataAdapter Updates для свойства Text.
2. Создайте в проекте DataSetCode новую форму.
3. В окне свойств Properties укажите значение frmUpdates для свойства (Name) и значение DataAdapter Updates для свойства Text.
4. Увеличьте размер формы frmUpdates.
5. Создайте в правой части формы сетку данных DataGrid, перетаскивая ее из панели элементов управления.
6. В окне Properties укажите значение grdDataGrid для свойства (Name) сетки данных.
7. Увеличьте размер сетки данных, чтобы она занимала до 80% всей площади формы.
8. В верхнем левом углу формы создайте кнопку, перетаскивая ее из панели элементов управления.
9. В окне Properties укажите значение btnLoad для свойства (Name) и значение Load для свойства Text этой кнопки.
10. Создайте новую кнопку непосредственно под кнопкой btnLoad, перетаскивая ее из панели элементов управления.
11. В окне Properties укажите значение btnLoad для свойства (Name), значение Load для свойства Text и значение False для свойства Enabled этой кнопки.
12. В верхней части файла с кодом формы frmUpdates введите следующий код:
Imports System
Imports System.Data
Imports System.Data.SqlClient
13. Затем в код формы frmUpdates введите код из листинга 6.3.
Листинг 6.3. Применение объекта SqlCommandBuilder для автоматической генерации команд обновленияPrivate dsEmployeeInfo As DataSet
Private daEmployees As SqlDataAdapter
Private conn As New SqlConnection( _
"server=localhost;uid=sa;pwd=;database=novelty")
' Применение объекта SqlCommandBuilder
' для автоматической генерации команд обновления.
Private cbEmployees As SqlCommandBuilder
Private Sub btnLoad_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnLoad.Click
dsEmployeeInfo = New DataSet()
LoadCommandBuilder()
' Конфигурирование объекта-сетки DataGrid.
Me.grdDataGrid.PreferredColumnWidth = 110
Me.grdDataGrid.AllowSorting = True
' Вставка данных в объект DataSet.
daEmployees.Fill(dsEmployeeInfo, "Employees")
' Присвоение объекта DataSet объекту DataGrid.
Me.grdDataGrid.DataSource = _
dsEmployeeInfo.Tables("Employees")
Me.btnUpdate.Enabled = True
End Sub
Private Sub btnUpdate_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnUpdate.Click
daEmployees.Update(dsEmployeeInfo, "Employees")
End Sub
Private Sub LoadCommandBuilder()
Dim param As SqlParameter
If conn.State = ConnectionState.Closed Then
conn.Open()
End If
' Создание нового объекта DataAdapter.
Dim SQL As String SQL = "Select FirstName, LastName, Department ID, Salary, _
ID from tblEmployee"
daEmployees = New SqlDataAdapter(SQL, conn)
' Создание команды с помощью SqlCommandBuilder.
cbEmployees = New SqlCommandBuilder(daEmployees)
End Sub
Основная подпрограмма LoadCommandBuilder() вызывается после щелчка на кнопке Load. Она демонстрирует способ явного открытия подключения, возможность избежать возникновения исключительных ситуаций при нескольких последовательных щелчках на кнопке Load и конфигурирование адаптера данных SqlDataAdapter (объект daEmployees) и конструктора команд SqlCommandBuilder (объект cbEmployees). Эти два объекта создаются и инициализируются с помощью их конструкторов, которые принимают значения своих свойств в качестве параметров. Конструктор объекта daEmployees получает строку с командой SELECT и объект подключения, а объект cbEmployees — адаптер данных daEmployees.
НА ЗАМЕТКУТолько один объект SqlDataAdapter может быть связан только с одним объектом SqlCommandBuilder.
Далее конфигурируется объект-сетка, вызывается метод Fill для загрузки таблицы Employees в объект daEmployees, задается таблица Employees для свойства DataSource объекта daEmployees и автоматически отображаются данные в сетке.
Обработчик события щелчка на кнопке Update содержит только одну строку кода, которая просто вызывает метод Update для объекта daEmployees.
Скомпонуйте проект DataSetCode и щелкните на кнопке DataAdapter Updates в форме frmDataSets. После отображения на экране формы frmUpdates щелкните на кнопке Load. Это приведет к считыванию данных из таблицы Employees, загрузке данных в объект tblEmployees объекта dsEmployeeInfo и отображению их в сетке, как показано на рис. 6.2.
Теперь можно протестировать работу этой формы, внося в данные произвольные изменения. Например, добавьте в сетку новые записи, прокручивая ее вниз и вводя новые данные в последней пустой строке сетки. Удалите несколько строк, выделяя их и нажимая клавишу <Delete>. Измените значения некоторых данных в уже имеющихся записях. Учтите, что все эти изменения не будут отражены в базе данных до тех пор, пока пользователь не щелкнет на кнопке Update. Внесенные в базу данных изменения можно проверить, используя любые инструменты просмотра таблиц базы данных или щелкая на кнопке Load для повторной загрузки данных из таблиц базы данных в объект grdDataGrid формы frmUpdates.
РИС. 6.2. Отображение данных из таблицы tblEmployees в сетке grdDataGrid
НА ЗАМЕТКУХотя использование объекта CommandBuilder для генерации команд обновления требует минимального количества кода, оно связано со значительными накладными расходами. Дело в том, что объект CommandBuilder должен выполнить дополнительное обращение к серверу базы данных для извлечения метаданных, которые необходимы для автоматической генерации команд обновления. Эта возможность очень полезна и позволяет создавать запросы "на лету". Однако, если запросы уже известны во время создания приложения, явное указание команд и их параметров в коде и использование явных команд обновления или программы-мастера DataAdapter Configuration Wizard приведет к повышению производительности.
Явное указание команд обновления
В отличие от довольно простого способа генерации нужных команд обновления с помощью объекта CommandBuilder, явное указание команд обновления в коде представляет собой хотя и более гибкий, но весьма трудоемкий способ. При его использовании каждая из четырех команд управления данными (Select, Insert, Update и Delete) должна быть создана отдельно. Чаще всего они кодируются в виде хранимой процедуры для каждой команды SQL.

