Лабораторная работа №6 Работа с базами данных
Цель работы: Изучить основы работы с базами данных, ознакомиться с объектами доступа к данным, научиться создавать и открывать базы данных, создавать приложения по работе с базами данных.
Порядок выполнения работы:
Изучить теоретический материал, представленный ниже.
Выполнить индивидуальное задание.
Представить работу преподавателю.
Порядок работы при объектном доступе к данным
При извлечении информации с помощью объектного доступа к данным надо:
создать рабочую область (объект workspace);
открыть базу (источника) данных (объект Database);
создать набор записей (объект Recordset);
непосредственно работать с конкретными записями и полями.
Создание рабочей области
Рабочую область можно создать методом CreateWorkspace Объекта DBEngine.
Синтаксис:
Set workspace = CreateWorkspace(Name, UserName, Password, UseType)
Параметр |
Описание |
Workspace |
Объектная переменная, представляющая создаваемый объектWorkspace. |
Name |
Строковое выражение, содержащее уникальное имя нового объекта Workspace. |
UserName |
Строковое выражение, определяющее владельца нового объектаWorkspace. |
Password |
Строковое выражение, содержащее пароль для нового объект Workspace. |
UseType |
Определяет тип рабочей области. Допустимые значения: dbUseJet (создание рабочей области ядра Microsoft Jet); D dbUseODBC (создание рабочей области ODBCDirect). |
Например, для создания рабочей области Microsoft Jet можно использовать следующие инструкции:
Dim ws As CreateWorkspace
Set ws = DBEngine.CreateWorkspace(Name:=”Myws”, UserName:=”admin”, _
Password:=””, UseType:=dbUseJet)
Рабочую область ODBCDirect можно создать следующим образом (ссылка на объект DBEngine применяется по умолчанию, поэтому во второй инструкции объект DBEngine опущен):
Dim ws As CreateWorkspace
Set ws = DBEngine.CreateWorkspace(Name:=”Myws”, UserName:=”UID”, _
Password:=””, UseType:=dbUseODBC)
Создание базы данных
Если базы данных не существует на диске, то надо создать всю ее структуру, а потом заполнить. Удобнее это сделать, например, при помощи Access, но можно создать базу данных и с помощью VBA непосредственно из Excel. На простом примере покажем, как это делается. Приводимая ниже процедура издает базу данных, которая записывается в файл Example.MDB. База данных состоит из одной таблицы Первый курс, в которой имеется четыре поля Фамилия, Группа, Предмет, Оценка. В коде также устанавливаются размеры их полей и типы вводимых в них значений. На рис. при помощи Access показана структура созданной в Excel базы данных (заполнять эту базу данных мы будем уже в следующем примере). База данных может создаваться только один раз, а потом она уже должна открываться. В противном случае будет генерироваться ошибка. Для избежания этой ситуации в программе предусмотрена простейшая проверка наличия файла с базой данных. Если такой файл имеется, то происходит выход из программы еще до начала создания базы данных.
Sub CreateDB_Click()
' проверка наличия файла на диске
If Dir(ThisWorkbook.Path & "\ira1.MDB") <> Empty Then
MsgBox "База данных уже существует"
Exit Sub
End If
Dim ws As workspace
Dim db As Database
Dim tb As TableDef
Dim fIdName As Field
Dim fIdGroup As Field
Dim fIdSubject As Field
Dim fIdMark As Field
' Создание рабочего пространства
Set ws = DBEngine.Workspaces(0)
' Создание базы данных в каталоге рабочего файла
Set db = ws.CreateDatabase(ThisWorkbook.Path & "\1.MDB", _
dbLangGeneral)
' Создание таблицы
Set tb = db.CreateTableDef("Первый курс")
' Создание полей
With tb
Set fIdName = .CreateField("Фамилия", dbText, 30)
Set fIdGroup = .CreateField("Гpynna", dbText, 50)
Set fIdSubject = .CreateField("Предмет", dbText, 50)
Set fIdMark = .CreateField("Оценка", dbInteger, 10)
End With
' Присоединение каждого поля к таблице
With tb.Fields
.Append fIdName
.Append fIdGroup
.Append fIdSubject
.Append fIdMark
End With
' Присоединение таблицы к базе данных
db.TableDefs.Append tb
' Закрытие базы данных
db.Close
End Sub
Приведем необходимые пояснения к программе.
Метод CreateDatabase создает базу данных.
Синтаксис:
Set database = object.CreateDatabase (Name, Locale, Options)
Параметр |
Описание |
Database |
Объектная переменная, представляющая создаваемый объект Database |
Object |
Объектная переменная, представляющая существующий объект Workspace |
Name |
Полное имя создаваемой базы данных |
Locale |
Задает порядок, в котором сравниваются строки. Для языков с латинскими буквами значение этого параметра равно DblangGeneral, для русского языка – DblangCyrillic |
Options |
Задает версию формата данных |
Метод CreateTableDef создает новую таблицу в базе данных.
Синтаксис:
Set tabledef = object.CreateTableDef (Name, Attributes, Source, Connect)
Параметр |
Описание |
Tabledef |
Объектная переменная, представляющая создаваемый объект Tabledef |
object |
Объектная переменная, представляющая существующий объект Database |
Name |
Имя таблицы |
Attributes |
Задает атрибуты таблицы |
Source |
Задает имя таблицы из внешнего источника данных, на основе которой строится данная таблица |
Connect |
Содержит информацию о базе данных, из которой берется таблица |
Метод CreateField создает новое поле в таблице в базы данных.
Синтаксис:
Set field = object.CreateField (Name, Type, Size)
Параметр |
Описание |
field |
Объектная переменная, представляющая создаваемый объект Field |
object |
Объектная переменная, представляющая объект Relation или Tabledef, для которого создается поле |
Name |
Имя поля |
Type |
Тип данных. Допустимые значения: dbBigint, dbBinary, dbBoolean, dbByte, dbChar, dbCurrency, dbDate, dbDecimal, dbDouble, dbfloat, dbGUID, dblnteger, dbLong, dbLongBinary, dbMemo, dbNumeric, dbSingle, dbText, dbTime, dbTimeStamp, dbVarBinary. |
Size |
Размер в байтах поля |
Открытие базы (источника) данных
Если база данных существует, то ее достаточно открыть. Сделать это можно методом OpenDatabase объекта Workspace.
Синтаксис:
Set database = object.OpenDatabase (Name, Options, Readonly, Connect)
Параметр |
Описание |
Database |
Объектная переменная, представляющая создаваемый объект Database. |
Object |
Объектная переменная, представляющая существующий объект Workspace. Если этот параметр опущен, то метод OpenDatabase использует стандартную рабочую область. |
Name |
Строковое выражение, задающее имя существующего файла базы данных с ядром Microsoft Jet или имя источника данных ODBC. |
Options |
Для рабочей области ядра Microsoft Jet допустимыми являются следующие значения аргумента параметра:True (открытие базы данных для монопольного доступа); False (по умолчанию, открытие базы данных для общего доступа).Для рабочей области ODBCDirect допустимыми являются следующие значения аргумента параметра: dbDriverNoPrompt, dbDriverPrompt, dbDriverComplete, dbDriverCompleteRequired. |
Readonly |
Допустимые значения:True (база данных открывается только для чтения); False (по умолчанию, база данных открывается как для чтения, так и записи). |
Connect |
Дополнительный параметр, содержащий сведения о подключении, в том числе и пароли |
Например, для открытия базы данных с ядром Microsoft Jet можно использовать следующие две инструкции:
Dim db As Database
Set db = ws.OpenDatabase(Name:=ThisWorkbook.Path & "\Пример.mob", Options:=True)
Объект Recordset
После открытия базы данных можно создать объект Recordset. Он представляет собой записи .исходной таблицы базы данных или результирующий набор записей, возвращаемый в результате запроса. Позволяет управлять данными в базе данных на уровне записи. На уровне полей управление данными осуществляется объектом Field.
Имеются следующие типы объекта Recordset:
Тип |
Описание |
Table |
Работает с одной таблицей текущей базы данных. В этом случае данные можно индексировать, что ускоряет поиск записей и их сортировку. При поиске записей допустимо использовать вместо метода Find метод Seek. |
Dynaset |
Позволяет получать, анализировать, удалять и редактировать данные из нескольких динамически связанных таблиц. Этот тип соответствует указателю ключевого набора записей ODBC. |
Snapshot |
В этом режиме в общем случае нельзя редактировать базу данных, но скорость работы в нем больше, чем в двух предыдущих. |
Forward-only |
Статический режим с последовательным доступом. Перемещаться от записи к записи можно только вперед. Этот режим самый скоростной. |
Dynamic |
Позволяет получать, анализировать, удалять и редактировать данные из нескольких динамически связанных таблиц. Этот тип соответствует динамическому указателю ODBC. |
Создание объекта Recordset
Объектная переменная типа Recordset создается при помощи метода OpenRecordset. Как и любую объектную переменную, ее надо сначала объявить, а только потом установить ссылку на объект, возвращаемый методом OpenRecordSet.
Синтаксис для объекта Database:
Set recordset = object.OpenRecordset (Source, Type, Options, Lockedits)
Синтаксис для объектов QueryDef, Recordset и TableDef:
Set recordset = object.OpenRecordset(Type, Options, Lockedits)
Параметр |
Описание |
Recordset |
Объектная переменная, представляющая открываемый объект Recordset. |
Object |
Объектная переменная, представляющая существующий объект пользуемый при создании нового объекта Recordset. |
Source |
Строковое выражение, определяющее источник записей для нового объекта Recordset. В качестве источника записей можно указать имя таблицы или запроса, а также инструкцию SQL, которая возвращает записи. Для табличного объекта Recordset в базе данных Microsoft Jet в качестве источника допускается указание только имени таблицы. |
Type |
Константа, указывающая тип открываемого объекта Recordset. Допустимые значения: dbOpenTable, dbOpenDynaset, dbOpenSnapshot, dbOpenForwardOniy и dbOpenDynamic. |
Options |
Специфицирует работу пользователя с объектом Recordset. Приведем некоторые из допустимых значений: dbAppendOnly (пользователь может добавлять записи, но не редактировать уже существующие); dbReadOnly (запрещено вносить изменения в записи); dbDenyWrite (другим пользователям запрещено вносить изменения). |
Lockedits |
Устанавливает тип блокировки данных. Допустимые значения: dbReadOnly, dbPessimistic, dbOptimistic и dbOptimisticValue. |
Методы и свойства объекта Recordset
Приведем наиболее часто используемые методы и свойства объекта Recordset, позволяющие анализировать, редактировать записи базы данных Способ их применения будет показан на примере простого приложения по работе с базой данных, разработанного в следующем разделе.
Методы объекта Recordset:
Метод |
Описание |
AddNew |
Создает и добавляет новую запись. После внесения изменений в новую запись следует вызвать метод Update для сохранения изменений и добавления записи в объект Recordset. До вызова метода Update изменения в базу данных не заносятся. |
Clone |
Создает копию объекта Recordset. Синтаксис:Set Копия = Оригинал.Clone |
Close |
Закрывает открытый объект доступа к данным. |
Delete |
Удаляет текущую запись в обновляемом объекте Recordset. |
Edit |
Копирует текущую запись из обновляемого объекта Recordset в буфер копирования для последующего изменения. После внесения изменений в новую запись следует вызвать метод Update для сохранения изменений и добавления записи в объект Recordset |
MoveFirst |
Делают текущей первую, последнюю, следующую или предыдущую запись объекта Recordset. |
Findfirst |
Находят первую, последнюю, следующую или предыдущую запись, удовлетворяющую заданным условиям, и делают эту запись текущей. Синтаксис: (FindFirst | FindLast I FindNext I FindPrevious} Criteria, где Criteria — это выражение или переменная типа String, используемая для поиска записи. Приведем несколько примеров критериев: "[Оценка] > 3" "[Фамилия] =- 'Петров' " "[Оценка] =5 AND [Предмет] = 'Информатика' " "[ДатаЭкзамена] = #17/06/99# |
Seek |
Находит в индексированном объекте Recordset типа Table запись, удовлетворяющую заданным условиям для текущего индекса, и делает эту запись текущей. Синтаксис: Seek Comparison, Key1, Key2,... Кеу13 Comparison—допустимые значения: "<", "<=", "=", ">=" или ">"; Key1, Key2, ..., Кеу13 — одно или несколько значений ключевых полей в текущем индексе объекта Recordset. |
GetRows |
Загружает строки объекта Recordset в массив. Синтаксис:Set ИмяМассива = Ha6opЗаписей.GetRows (NumRows) где NumRows — число строк. |
Update |
Сохраняет вставки и изменения, произведенные в объекте Recordset при помощи методов AddNew и Edit |
CancelUpdate |
Отменяет все изменения объекта Recordset, выполненные при помощи методов AddNew и Edit. |
Перечислим наиболее часто используемые свойства объекта Recordset.
Свойство |
Описание |
bof |
Возвращает значение True, если указатель текущей записи расположен перед первой записью набора, и значение False, если расположен на первой записи набора или на любой записи после нее. |
eof |
Возвращает значение True, если указатель текущей записи расположен после последней записи набора, и значение False, если на последней записи набора или на любой записи перед ней. |
Bookmark |
Устанавливает или возвращает закладку, которая однозначно определяет текущую запись в объекте Recordset. Обычно используется для возврата в объекте Recordset на определенное место, без указания конкретного адреса записи. |
NoMatch |
Возвращаемое значение True, если нужная запись не найдена, и False — в противном случае. |
RecordCount |
Возвращает число записей, к которым был осуществлен доступ в объекте Recordset. Свойство RecordCount не показывает, сколько записей содержится в объекте Recordset до обращения ко всем записям. После обращения к последней записи набора значение свойства RecordCount становится равным полному числу неудаленных записей в объекте Recordset. Для принудительного обращения к последней записи следует вызвать для объекта Recordset метод MoveLast. |
Filter |
Задает или возвращает значение, определяющее записи, которые будут включены в открываемый объект Recordset. При указании критерия фильтрации названия полей заключаются в квадратные скобки. Приведем несколько примеров критериев: [Оценка] = 5 [Оценка] >= 3 [Оценка] =5 AND [Предмет] = "Информатика" [Оценка] = 4 AND [Предмет] = "Информатика" (Оценка] >= 4 AND [Предмет] IN ("Информатика", "Право") [Длина]*[Ширина] > 100 В критериях вместо знака равенства допустимо использование ключевого слова like, например [Оценка] LIKE 5 |
Sort |
Задает или возвращает порядок сортировки записей в объекте Recordset (только в рабочей области Microsoft Jet).Для сортировки по возрастанию используется ключевое слово ASC, по убыванию — desc. Например: [Оценка] ASC[Фамилия] DESC и сортировка первоначально по полю Оценка, а потом по полю Фамилия [Оценка] ASC, [Фамилия] DESC |
Пример приложения по работе с базами данных
Рассмотрим работу с базой данных на примере следующего простого приложения, где используются все основные операции с записями. База данных находится в файле Example.MDB, который был нами создан при разработке приложения в разделе "Создание базы данных" этой главы. Его также легко создать в Access. База данных имеет простейшую структуру: состоит из одной таблицы Первый курс, в которой имеется только четыре поля: Фамилия, Группа, Предмет и Оценка. При запуске приложения на экране отображается диалоговое окно Первый курс (рис. 9.3).
Опишем действия программы:
При активизации диалогового окна выводит в поля ввода информацию о первом студенте из таблицы и в надписи Число записей указывает общее число записей в таблице.
При нажатии кнопок ">" и "<" происходит перемещение на одну запись вперед и назад, соответственно, а при нажатии кнопок ">>" и "<<" перемещение в конец и начало таблицы.
При нажатии кнопки Найти происходит поиск первой записи из таблицы с указанной фамилией (если такой записи нет, то при помощи свойства Bookmark указатель возвращается в ту же позицию, откуда начался поц При нажатии кнопки Далее найти ищется последующая запись с той же фамилией.
При нажатии кнопки Удалить удаляется запись.
При нажатии кнопки Новая запись создается новая запись по данным, внесенным в поля ввода.
При нажатии кнопки Редактировать вносятся изменения в запись из базы данных.
При нажатии кнопки Закрыть закрывается база данных и диалоговое окно
При выборе переключателя хорошисты и отличники в диалоговом окне выводятся данные только о хорошистах и отличниках, а при выборе переключателя все — выводится информация обо всех студентах.
Для создания этого приложения сконструируйте форму, на которой разместите пять надписей, четыре поля ввода, десять кнопок, рамку и два переключателя. Установите значения свойства Name полей ввода равными txtName, txtGroup, txtSubject, txtMark, КНОПОК — равными cmdSearch, cmdSearchNext, cmdDelete, cmdAddNew, cmdEdit, cmdClose, cmdMoveFirst. cmdMovePrevious, cmdMoveNext, cmdMoveLast, переключателей — равными optBest, optAll, а надписи Всего записей — lblNumberOfRec. Установите значения свойств Caption формы, рамки, переключателей и надписей в соответствии с рисунком. В модуле формы наберите следующий код:
Option Explicit