Опубликован: 04.07.2006 | Уровень: для всех | Доступ: свободно
Лекция 4:

Базы данных

Объекты доступа к данным DAO - Data Access Object

Объекты доступа к данным - это объекты, представляющие структуру базы данных и её содержимое. Программист может использовать DAO для создания и изменения таблиц и запросов, для защиты баз данных или для доступа к данным внешнего источника. DAO позволяет обрабатывать из проекта Visual Basic данные, находящиеся в базе данных.

Для работы с источниками данных используется иерархия объектов Microsoft Jet, табл. 4.4:

Таблица 4.4. Иерархия объектов, фрагмент
DBEngine
Workspaces Properties
Users... Groups... Databases
TableDef... QueryDef ...Recordset ...Relation
Field... Index Field ...Field
  • DBEngine - объект самого верхнего уровня в иерархии объектов Microsoft Jet обеспечивает связь приложения с СУБД Microsoft DBMS. Система управления базами данных - это множество процедур; происходит взаимодействие с набором процедур-трансляторов и запросы пользователя переводятся на язык, воспринимаемый базой данных. Процедуры-трансляторы есть для баз данных формата Microsoft Access, FoxPro и т.д.; имеются трансляторы для источников данных ODBC (Open Databasе Connectivity - открытое взаимодействие с базами данных). С помощью машины Microsoft Jet можно обращаться к файлам данных любого формата (если есть соответствующие процедуры-трансляторы). Объект DBEngine имеет свойства и методы и содержит коллекции - объекты одного типа,
  • коллекция Properties содержит свойства объекта DBEngine,
  • коллекция Workspaces. Объект Workspace - это рабочее пространство, которое определяет именованный сеанс работы пользователя. Коллекция Workspaces содержит все определeнные рабочие пространства. Workspaсe имеет свойства (Name - имя рабочего пространства, UserName - имя пользователя, IsolateODBCTrans используется для контроля за числом соединений ODBC, установленных с базой данных во время сеанса) и 2 метода - CreateDatabase и OpenDatabase,
  • Users - учетные записи пользователей,
  • Groups - учетные записи группы пользователей,
  • коллекция Databases содержит все объекты Database - базы данных, открытые для данного объекта Workspace. Объект Database создается каждый раз, когда пользователь открывает базу данных с помощью метода OpenDatabase. Содержит несколько свойств и методов (Name, Connect, : Connection ), например, метод OpenRecordset служит для доступа к таблицам баз данных,
  • TableDef - определение таблицы,
  • QueryDef - определение запроса,
  • Recordset - объект, содержащий наборы записей; имеется большое количество свойств и методов, доступность которых зависит от того, в каком рабочем пространстве был создан объект Recordset - Microsoft Jet или ODBCDirect. Технология ODBCDirect - модель доступа к данным ODBC. Частью этой модели доступа является объект Connection. Эта модель даeт возможность программисту обращаться к источникам данных ODBC напрямую, не используя объекты данных Microsoft Jet.
  • Relation - содержит информацию об установленных между таблицами отношениях (указание полей и типа связей),
  • Field - содержит информацию о поле таблицы, содержит коллекцию Properties, имеет несколько свойств и методов,
  • Index - определение индекса (Index - это совокупность перекрестных ссылок между полями таблицы, они создаются для ускорения поиска записей).

Объекты DAO используются в определeнном порядке. Сначала с помощью ключевого слова Set формируется Workspace, затем Database, Recordset и другие объекты. Для открытия базы данных используется метод OpenDatabase объекта Workspace, а для открытия таблицы - метод OpenRecordset объекта Database. Для получения доступа к определенному количеству строк таблицы используется метод GetRows(numrows) объекта Recordset, numrows - это число строк. Строки/столбцы нумеруются, начиная с 0.

Практическая работа 22. Базы данных; DAO

  • Создать фрагмент базы данных Access: внутренний валовой продукт США (в американской статистике внутренний валовой продукт подразделяется на категории: сельскохозяйственные товары, услуги и промышленные сооружения) с полями, указанными в табл. 4.5:,
  • вывести в поле ListBox записи поля structures (см. процедуру Form_Load()),
  • вычислить средние значения за каждые 2 года (как пример - 4-го поля - объем промышленных сооружений) и результат занести в файл (см. процедуру Form_Load()),
  • вывести записанный результат из файла в поле списка, см. процедуру Command1_Click().

Следует сделать ссылку на библиотеку объектов доступа к данным: Проект \to Информация \to Microsoft DAO 3,51 Object Library.

Таблица 4.5. Внутренний валовой продукт США
# year population incomepercapital structures goods services CDP
1 1997 245 16634 479 1942 2460 4836
2 1998 248 17709 511 20928 2634 4884
3 1999 249 18725 512 2167 2834 4848
4 2000 252 18523 466 21193 3012 6020

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

(General) (Declarations)
Dim DB As Database, Table As Recordset
' описание переменной, характеризующей ячейки таблицы
Dim R As Variant 
' описание переменной для работы с полями таблицы 
Dim K As Integer 
Dim S(4) As Single ' описание массива средних значений
Dim a1 As Single, a2 As Single, I As Integer, J As Integer

Private Sub Form_Load() ' реализация доступа к данным
Set DB = Workspaces(0).OpenDatabase("A:\Dao1.mdb")
Set Table = DB.OpenRecordset("dao4")
R = Table.GetRows(4)
For I = 0 To 3 ' вывод на экран 4-ого поля таблицы 
' базы данных
List1(0).List(I) = R(4, I)
Next I
' открыть файл для записи
Open "A:\DATA.TXT" For Output As #1 
K = 4 ' работа с 4-м полем таблицы
For I = 0 To 1 ' рассматриваются I блоков (2) 
' по J элементов (2)
S(K) = 0
For J = 0 To 1
S(K) = S(K) + R(K, I * 2 + J)
Next J
Write #1, S(K) / 2 ' среднее значение за каждые 2 года
Next I
Close #1 ' закрыть файл
End Sub

Private Sub Command1_Click()
' открыть файл для чтения
Open "A:\DATA.TXT" For Input As #1
Input #1,a1, a2
List1(1).List(0) = a1 ' вывод средних значений в поле списка
List1(1).List(1) = a2
End Sub

Практическая работа 23. Базы данных. Свойства рабочего пространства

В разделе 4.2 перечислены свойства рабочего пространства. Введите код, данный ниже, обеспечивающий вывод на экран этих свойств; результат выполнения проекта дан на рис. 4.3.

Private Sub Command1_Click()
Dim WS As Workspace
Dim property As Object ' описание объектной переменной
' описание переменной для хранения сообщения
Dim str As String
' проход по всем рабочим пространствам
For Each WS In DBEngine.Workspaces 
' проход по всем свойствам текущего Workspace
For Each property In WS.Properties 
str = str & property.Name & "=" & property.Value
Next
MsgBox str, vbInformation 'синтаксис функции MsgBox дан в работе 44
Next
End Sub
Свойства рабочего пространства

Рис. 4.3. Свойства рабочего пространства

Практическая работа 24. Базы данных. Свойства набора записей

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

Private Sub Command1_Click()
Dim WS As Workspace, db As Database
Dim property As Рroperty, recSet As Recordset
Dim strWS As String, strDB As String, strRS As String, str As String
strWS = "WS" ' задать значения переменным 
strDB = "A:\dar.mdb"
' использование SQL-запроса
strRS = "Select * FROM tr" 
' установить соединение
Set WS = DBEngine.CreateWorkspace(strWS, "admin", "")
Set db = WS.OpenDatabase(strDB)
Set recSet = db.OpenRecordset(strRS, dbOpenDynaset)
For Each property In recSet.Properties ' вывод результатов
str = str & property.Name & vbCrLf
Next
MsgBox str, vbInformation, " RecordSet"
recSet.Close ' закрыть объекты
db.Close: WS.Close
Set property = Nothing: Set recSet = Nothing
Set db = Nothing: Set WS = Nothing
End Sub

Использование инструкций SQL

При работе с базами данных проекте Visual Basic часто возникает необходимость создать инструкцию SQL. Простейший способ создания инструкции SQL заключается в создании запроса на бланке запроса, последующем использовании меню Вид \to режим SQL ; копировании создаваемой автоматически в выводимом окне инструкции SQL и вставке еe в процедуру.

Практическая работа 25. Базы данных. Использование инструкций SQL

При работе с объектом QueryDef (запрос) должна быть использована допустимая строка SQL.

25a. Создать объект QueryDef

В данном примере создаваемый запрос возвращает данные таблицы Products базы данных Nwind.mdb (Microsoft Visual Studio).

Последовательность действий: создать требуемые элементы управления, ввести код, данный ниже, выполнить запрос, прочитать результат, он находится в запросе nin.

Private Sub Command1_Click()
Dim dbs As Database, qdf As QueryDef
Dim strSQL As String, Table As Recordset
Set dbs = Workspaces(0).OpenDatabase("D:\Program_ Files\Microsoft Visual Studio\VB98\Nwind.mdb")
Set Table = dbs.OpenRecordset("Products")
strSQL = "SELECT [Product List].ProductID, [Product_ List].ProductName FROM Products 
 AS [Product List] WHERE_ ((([Product List].Discontinued) = No)) 
 ORDER BY [Product_ List].ProductName;"
Set qdf = dbs.CreateQueryDef("nin", strSQL)
'замечание: nin - имя запроса
End Sub

25b. Создать аналогичный объект QueryDef

  • Создать объект QueryDef с использованием инструкции SQL. Создаваемый запрос возвращает количество товаров, проданных после 21.01.98, содержимое таблицы базы данных dar1.mdb приведено в табл. 4.6,
  • ввести код, сделать щелчок на командной кнопке, результат находится в запросе nin1.
Private Sub Command2_Click()
Dim dbs1 As Database, qdf1 As QueryDef
Dim strSQL1 As String 
Dim Table1 As Recordset

Set dbs1 = Workspaces(0).OpenDatabase("A:\dar1.mdb")
Set Table1 = dbs1.OpenRecordset("Verkauf")
strSQL1 = "SELECT menge FROM verkauf WHERE datum_ >#21/01/98#;"
Set qdf1 = dbs1.CreateQueryDef("nin1", strSQL1)
' замечание: nin1 - имя запроса
End Sub
Таблица 4.6. Таблица базы данных Verkauf
name kunde menge prеis datum
vernseheapparat a 45 879 23.09.99
buecher b 89 56 21.01.98
rechner c 345 56 04.05.97
telefon d 678 567 14.11.99

Практическая работа 26. SQL- инструкция. Использование переменной в запросе

Часто при выполнении запросов нужно использовать данные, вводимые или изменяемые пользователем. В этом случае нужно вводить в запрос переменные или элемент управления (см. Практическая работа 27).

В примере создаeтся объект QueryDef, в котором используется значение, сохраняемое в переменной datumStart (As Date). Запрос возвращает из таблицы Verkauf (см. табл. 4.6) количество товаров, проданных позднее вводимой пользователем (в диалоговом режиме) даты datumStart. Ввести код, сделать щелчок на командной кнопке, ввести дату, результат находится в запросе nin2.

Private Sub Command3_Click()
Dim datumStart As Date, dbs2 As Database, qdf2 As QueryDef
Dim strSQL2 As String, Table2 As Recordset

Set dbs2 = Workspaces(0).OpenDatabase("A:\dar1.mdb")
Set Table2 = dbs2.OpenRecordset("Verkauf")
strSQL2 = "SELECT verkauf.menge, verkauf.datum FROM verkauf_ 
 WHERE verkauf.datum > datumStart;"
Set qdf2 = dbs2.CreateQueryDef("nin2", strSQL2)
' Замечание: дату вводить в формате: 21-01-98; nin2
' - имя запроса
End Sub

Практическая работа 27. SQL- инструкция. Использование в запросе элемента управления

Создать объект QueryDef, в котором используется элемент управления. Обратить внимание на ссылку на элемент управления (strSQL3 = : > Forms!verkauf!datum). Ввести код, сделать щелчок на командной кнопке, ввести дату, результат находится в запросе nin3.

Private Sub Command4_Click()
Dim dbs3 As Database, qdf3 As QueryDef
Dim strSQL3 As String, Table3 As Recordset

Set dbs3 = Workspaces(0).OpenDatabase("A:\dar1.mdb")
Set Table3 = dbs3.OpenRecordset("Verkauf")
strSQL3 = "SELECT verkauf.menge, verkauf.datum _
FROM verkauf_ WHERE verkauf.datum > Forms!verkauf!datum;"
Set qdf3 = dbs3.CreateQueryDef("nin3", strSQL3)
' замечание: дату вводить в формате: 21-01-98; nin3 -
' имя запроса
End Sub
Константин Новков
Константин Новков

Лекция 3: 2

Для создания возможности использования объектов файловой системы нужно подключить библиотеку DLL, содержащую эти объекты: меню Разработать > Ccылки > Microsoft Scriptlet Component (сделать щелчок на соответствующем элементе управления CheckBox).

Не могу найти меню Разработать (Develop)>Links и т.д.

антонина квасова
антонина квасова