Visual Basic

Базы данных

Разбить на страницы
Показывать лекцию целиком

Использование элемента управления Data

Элемент управления Data обеспечивает связь проекта Visual Basic с файлом базы данных. Следующие свойства элемента управления Data используются при реализации связи, табл. 4.1.

Свойства элемента управления Data
Свойство Пример значения свойства
Connect Access
DatabaseName A:\Studium.mdb ' имя базы данных
RecordSource software ' имя таблицы

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

Свойства элемента управления TextBox
Свойство Пример значения свойства
DataSource Data1 ' элемент управления Data с его номером
DataField Hersteller ' имя поля таблицы базы данных. Замечание: для каждого элемента управления TextBox не забудьте установить свое значение этого свойства

Практическая работа 21. Базы данных; элемент управления Data (считать таблицу в двумерный массив и вывести на экран в массив поля списка). Использование стандартного модуля

Задание: создать таблицу базы данных, содержащую данные о 9 программных продуктах с полями: Hersteller - изготовитель, Typ - тип продукта, Preis - цена, Tendenz - тенденция, Anbieter - распространитель, Ort - местность, табл. 4.3:

Software
Коde Hersteler Typ Preis Tendenz Anbieter Ort
1 Ahead Nero Burning 59 A Media Markt Berlin-Tegel
2 Steinberg Maxima Studio 59 В Media Markt Koeln
3 Norton Anti Virus 70 A Schaubandt Flensburg
4 G Data Power Adress-manager 70 A Pro Markt Berlin
5 Top Systems Win Zip 89 B Media Markt Stuttgart
6 Alfons Lernwelt Deutsch 98 A Media Markt Berlin-NeuKoeln
7 Microsoft Encarta 99 A Saturn Duesseldorf
8 Cequadrat Picture it 99 A Schaubandt Isenhagen
9 Corel Corel Draw 379 A US-Electronic Hilden

Следует создать стандартный модуль для обеспечения использования переменных в (данном случае) в 2-х формах. Первую форму использовать для связи проекта с базой данных (использовать элементы управления Data и TextBox) и создания двумерного массива, соответствующего таблице базы данных. Вторую форму использовать для вывода двумерного массива на экран (в массив поля списка) и нахождения максимальной цены программного продукта.

Последовательность действий:

  • Создать
  • модуль
  • на первой форме (рис.4.1): элементы управления Data и массив Text1(7) для вывода 7 полей таблицы на экран, 3 командные кнопки:
  • для процедуры построчного считывания записей таблицы в двумерный массив,
  • для процедуры разового считывания тех же данных в тот же массив,
  • для перехода ко второй форме,
  • на второй форме: массив List1 (9) для вывода данных двумерного массива на экран, элемент управления Label1, 2 командные кнопки для:
  • процедуры вывода двумерного массива на экран в массив поля списка,
  • процедуры нахождения максимальной цены продукта и вывода в поле Label1 результата,
  • присвоить значения свойствам элемента управления Data и свойствам элементов массива текстового поля (примеры даны в табл. 4.1: и табл. 4.2:),
  • описать переменные в области модуля и ввести код, данный ниже (пояснения даны под комментариями), стартовать проект
  • (рис 4.1) Доступ к данным; использование элемента управления Data, вид формы Form 1 (рис 4.2) Доступ к данным - Data, вид формы Form2
    (General) (Declarations)
    ' описание двумерного массива, соответствующего
    ' таблице software базы данных
    Public mass(9, 6) As Variant 
    Public i As Integer, j As Integer, k As Integer
    ' переменная-счетчик для работы с номерами записей
    ' таблицы
    Public n As Integer
    ' переменная для хранения максимальной цены продукта
    Public max As Integer

    Form1

    ' Последовательное считывание данных таблицы software
    ' в массив текстового поля. Щелчком на правой 
    ' кнопке элемента Data и последовательным 
    ' нажатием командной кнопки Command1 (Caption = Lesen1)
    ' присвоить текущему элементу массива 
    ' mass(n, j) текущее значение свойства Text 
    ' элементов массива текстового поля
    
    Private Sub Command1_Click() 
    mass (n, 1) = Text1(1): mass (n, 2) = Text1(2)
    mass (n, 3) = Text1(3): mass (n, 4) = Text1(4)
    mass (n, 5) = Text1(5): mass (n, 6) = Text1(6)
    n = n + 1 ' увеличить значение переменной-счeтчик на 1
    End Sub
    
    ' автоматическое считывание данных в массив
    ' (Caption = Lesen2)
    Private Sub Command2_Click()
    For n = 0 To 8 
    mass (n, 1) = Text1(1): mass (n, 2) = Text1(2)
    mass (n, 3) = Text1(3): mass (n, 4) = Text1(4)
    mass (n, 5) = Text1(5):mass (n, 6) = Text1(6)
    ' MoveNext - метод, обеспечивающий автоматический 
    ' переход к следующей записи
    Data1.Recordset.MoveNext 
    Next n
    End Sub
    
    ' Методы MoveFirst, MoveLast, MoveNext, MovePrevious 
    ' находят в указанном объекте Recordset соответствующую
    ' запись и делают еe текущей
    
    Private Sub Command3_Click()
    Unload Me
    Form2.Show
    End Sub

    Form2

    ' вывод данных двумерного массива на экран в 
    ' массив поля списка
    Private Sub Command1_Click()
    For i = 0 To 8
    For j = 1 To 6
    List1(i).List(j - 1) = mass (i, j)
    Next j, i
    End Sub
    
    ' нахождение максимальной цены продукта и вывод в
    ' поле метки результата
    Private Sub Command2_Click() 
    max = mass(0,3)
    For k = 1 To 8
    If mass (k, 3) > max Then max = mass (k, 3)
    Next k
    Label1.Caption = max
    End Sub

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

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

    Для работы с источниками данных используется иерархия объектов Microsoft Jet, табл. 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.

    Внутренний валовой продукт США
    # 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
    Таблица базы данных 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

    MSНFlexGrid и MSFlexGrid - элементы управления для отображения и оперирования данными в табличном формате

    Элемент управления MSFlexGrid, выводимый на форму при работах с базами данных, представляет собой cетку строк и столбцов. MSFlexGrid поддерживает следующие функции:

  • чтение данных, если элементу MSFlexGrid назначен элемент управления данными; связывание данных для чтения,
  • динамическая перестановка столбцов и строк; автоматическая перегруппировка данных при упорядочении столбцов,
  • адаптация к существующему программному коду для связанного элемента управления DataGrid,
  • управление помещением в ячейку текста/графики; перенос текста в ячейках.
  • Вывод MSFlexGrid на панель элементов управления: меню Проект (Project) $$\to$$ Компоненты (Components) $$\to$$ Microsoft FlexGrid 6.0.

    Свойство Rows таблицы, выводимой на форму при использовании MSFlexGrid, можно использовать для задания количества строк в таблице, а свойство Cols - для задания количества столбцов. На рис. 4.4 представлена сетка MSFlexGrid. В качестве первого индекса ячейки используется номер строки, в качестве второго - номер столбца. Например, ячейка в левом верхнем углу таблицы имеет адрес 0, 0. Чтобы поместить данные в ячейку таблицы MSFlexGrid, нужно использовать свойство TextMatrix и задать координаты ячейки.

    Пример 1: поместить слово "элемент" в ячейку (2, 1): MSFIexGridl.TextMatrix (2,1) = "элемент"

    Пример 2: ввести число 3000 в ячейку (5, 2): MSFIexGridl.TextMatrix (5,2) = 3000

    MSFlexGrid обеспечивает множество стандартных стилей форматирования ячеек. Если при работе нужно добавить новые строки в таблицу, то используется метод Addltem.

    MSHFIexGrid - Microsoft Hierarchical FlexGrid - иерархическая гибкая таблица поддерживает по сравнению с MSFIexGrid множество дополнительных функций:

  • ActiveX Data Binding - привязывание данных ActiveX, когда свойства DataSource и DataMember элемента управления связаны с поставщиком данных,
  • связывание через Data Binding Manager - Диспетчер связывания данных в Visual Basic,
  • привязывание непосредственно к сгруппированным и связанным наборам записей ADO ( ADO RecordSet ) из иерархии Command (Управление),
  • создание отображений сгруппированных и связанных наборов RecordSet.
  • Практическая работа 28. MSFIexGrid

  • Создать базу данных ACCESS с таблицами, например, student (см. табл. 4.7) и др, сохранить в файле stud.mdb; впоследствие это имя выбирается в стандартном диалоговом окне Open,
    Содержимое таблицы student базы данных
    Num Name Geschl Geb_dat Gruppe
    1012 Wolf M 20.08.76 Kp-3
    1013 Hase M 30.09.77 Kp-4
    1021 Weiss W 24.06.77 Kp-3
    1040 Kalb M 23.03.77 Kp-3
  • создать на форме объекты (см. рис. 4.4 и код, данный ниже):
  • MSFlexGrid (см. выше),
  • CommonDialоg: Проект $$\to$$ Компоненты $$\to$$ Управление $$\to$$ Microsoft CommonDialog Control,
  • CommandButton (Name = Command1),
  • Data (Name = Data1, Connect = Accеss),
  • ComboBox (Name = Combo1, Style = 0), см. 10.1,
  • TеxtBox (Name = Text1),
  • ввести код, данный ниже, пояснения даны под комментариями:
    Private Sub Command1_Click()
    Dim i As Integer
    ' очистить свойство объекта CommonDialog, содержащее 
    ' имя базы данных 
    CommonDialog1.FileName = ""
    ' стартовать CommonDialog 
    CommonDialog1.Action = 1
    ' выводится стандартное диалоговое окно Open; 
    ' нужно выбрать требуемую базу данных.
    
    ' связать объект Data1 с файлом базы данных, выбранным с
    ' помощью элемента управления CommonDialog1 
    Data1.DatabaseName = CommonDialog1.FileName 
    ' обновить содержимое элемента управления Data1 
    Data1.Refresh
    
    ' читать в цикле имена таблиц базы данных и занести
    ' их в ComboBox (AddItem)
    For i = 0 To Data1.Database.TableDefs.Count - 1
    ' свойство Count определяет количестко элементов 
    Combo1.AddItem (Data1.Database.TableDefs(i).Name)
    Next i
    ' после добавления имeн таблиц в ComboBox очистить теку-
    ' щее значение свойства Text 
    Combo1.Text = ""
    
    ' введeнный в текстовое поле строку SQL присвоить 
    ' свойству RecordSource элемента Data1 
    Data1.RecordSource = Text1.Text
    ' обновить содержимое Data1. Реализуется запрос, т.к 
    ' свойству RecordSource присвоено значение строки SQL
    Data1.Refresh
    
    ' оставшаяся часть кода может быть заменена
    ' следующим оператором присваивания: 
    ' MSFlexGrid1.DataSource = Data1 в Окне свойств. Эта
    ' часть кода нужна лишь для того чтобы пользователь мог
    ' освоить работу с ячейками MSFlexGrid. 
    ' Свойство MSFlexGrid1.Cols - характеризует количество 
    ' столбцов в сетке; Data1.Recordset.Fields.Count - количество 
    ' столбцов таблицы базы данных, к которой сделан 
    ' SQL-запрос
    MSFlexGrid1.Cols = Data1.Recordset.Fields.Count
    ' MSFlexGrid1.Rows - количество строк в сетке 
    ' установить равным 1
    MSFlexGrid1.Rows = 1
    
    ' в элементе управления MSFlexGrid1 доступ к строкам и 
    ' столбцам проводится начиная с ячейки (0,0),
    ' свойство TextMatrix(X, Y) позволяет получить доступ 
    ' к отдельным ячейкам таблицы 
    
    For i = 0 To Data1.Recordset.Fields.Count - 1
    ' занести название имeн полей таблицы базы данных в 
    ' первую строку MSFlexGrid1
    MSFlexGrid1.TextMatrix(0, i) = Data1.Recordset.Fields(i).Name
    Next i
    
    ' проверить, является ли запись в таблице (строка) по-
    ' следней; организовать цикл прохода по строкам 
    Do While Not Data1.Recordset.EOF
    ' увеличить количество строк в MSFlexGrid на единицу
    MSFlexGrid1.Rows = MSFlexGrid1.Rows + 1
    
    ' цикл переноса данных из Data1 в MSFlexGrid1
    For i = 0 To Data1.Recordset.Fields.Count - 1
    ' перенос данных данной строки (по полям). Если данные в
    ' ячейке Data1 имеются, то перенести их в 
    ' таблицу MSFlexGrid1
    If Not Data1.Recordset.Fields(i) = "" Then
    MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, i) = Data1.Recordset.Fields(i)
    End If
    ' конец цикла переноса данных из элемента управления Data1 
    ' в таблицу MSFlexGrid1 для одной строки
    Next i
    
    ' использовать метод MoveNext - переход к 
    ' следующей строке
    Data1.Recordset.MoveNext
    Loop
    End Sub
  • стартовать проект, ввести в текстовое поле SQL-строку (запрос) SELECT * FROM student, сделать щелчок на командной кнопке, в выведенном стандартном диалоговом окне Open выбрать базу данных stud.mdb. В таблицу MSFlexGrid выводятся результаты запроса. Одновременно в список элемента управления ComboBox выводятся имена всех имеющихся таблиц, рис 4.4(рис 4.4) MSFlexGrid
  • выбрать таблицу в списке ComboBox, изменить запрос - ввести новый запрос для другой таблицы (ввести этот запрос в текстовое поле), сделать щелчок на командной кнопке, наблюдать результат.
  • Репликация и синхронизация баз данных

    Реплицировать означает тиражировать. Если учреждение располагает сетью, тогда целесообразно иметь основную копию базы данных (главная реплика) в главном подразделении фирмы и несколько еe копий (реплик) в других помещениях/на других территориях. Пользователи баз данных на других территориях в процессе работы (например, в результате реализации/приобретения изделий, перечень которых содержит база данных) делают изменения таблиц в своих копиях (репликах). Позднее (периодически) каждый должен внести им сделанные изменения в главную реплику и получить информацию об изменениях, сделанных другими пользователями. Это процесс синхронизации - приведение репликационного набора в состояние, когда реплики одинаковы.

    Пусть имеется база данных sabi.mdb c несколькими таблицами . Превратим sabi.mdb в главную реплику. Создадим на дисковом устройстве С: каталог rep, который будем использовать для проекта. Сначала нужно просмотреть базу данных в приложении Visdata: меню Добавления $$\to$$ Визуальный менеджер данных (Visual Data Manager) $$\to$$ Файл $$\to$$ Открыть базу данных $$\to$$ Microsoft Access $$\to$$ в выведенном списке выбрать файл sabi.mdb. В окно приложения выводится список таблиц базы данных. Существуют также системные таблицы; для их вывода на экран использовать команду: Utility $$\to$$ Preferences $$\to$$ Include System Tables. Представляет особый интерес объект Properties - свойства исходной базы данных: Name = C:\ : sabi.mdb, Connect*,: .

    Практическая работа 29. Репликация и синхронизация баз данных

    Для приобретения навыков репликации и синхронизации нужно выполнить несколько этапов:

  • сделать ссылку на библиотеку Microsoft Jet and Replication Objects 2.1 Library (меню Проект $$\to$$ Ссылки $$\to$$ библиотека $$\to$$ OK) и библиотеку, обеспечивающую работу с DAO: Microsoft DAO 3,54 Objects Library,
  • создать главную реплику ( Command1_Click (), см. ниже):
  • открыть базу данных,
  • создать свойство Replicable и присвоить ему значение "Т",
  • cоздать копию главной реплики ( Command2_Click (), см. ниже):
  • открыть базу данных,
  • использовать метод MakeReplica,
  • внести изменения в главную реплику и еe копию:
  • внести изменение в 1-ой записи главной реплики и копии,
  • зафиксировать изменение значения поля s_Generation (см. ниже) при изменении содержимого таблиц; там появятся нули вместо единиц и соответствующая запись будет позднее скопирована при выполении процедуры синхронизации,
  • выполнение синхронизации - копирование изменений главной реплики в реплику и наоборот ( Command3_Click (), см. ниже):
  • открыть базу данных,
  • использовать метод Cynchronize объекта Database.
  • Последовательность действий:

  • ввести код процедур Command1_Click () и Command2_Click (), см. ниже,
  • стартовать первую процедуру (создание главной реплики),
  • после остановки выполнения проекта открыть базу данных (главную реплику) в приложении Visdata, найти добавленные поля каждой таблицы: в каждую таблицу главной реплики добавлены 3 поля:
  • s_Generation, идентифицирующее записи, которые были изменены Вами/сотрудниками учреждения. После изменения записей, содержимое поля меняется с 1 на 0 (сначала везде была 1) и в процессе синхронизации, т.е. позднее, пересылаются только записи, которым соответствует значение поля 0,
  • s_GUID, содержащее идентификатор каждой записи,
  • s_Lineage, хранящее количество изменений записи.
  • Пояснения: после создания главной реплики в главной реплике появились новые системные таблицы, появились дополнительные свойства главной реплики. Свойство Replicable (установлено в Т) означает, что для базы данных можно создавать реплики. После создания главной реплики появились новые свойства любой таблицы главной реплики.

  • стартовать вторую процедуру (создание реплики),
  • после остановки выполнения проекта просмотреть базу данных в приложении Visdata (в базе данных содержатся те же самые таблицы),
  • открыть таблицу MSysReplicas, содержащую информацию о каждом члене репликационного набора, где появилась вторая запись из-за создания реплики (ранее была только одна запись),
  • поочерeдно открыть базы данных (главную реплику и реплику) в любом приложении, предназначенном для работы с базами данных и сделать изменения в одной записи какой-либо таблицы. Наблюдать изменения поля s_Generation - появление чисел 0 вместо 1 после внесения изменений Вами/сотрудниками учреждения в записи таблиц главной реплики и реплики,
  • создать и стартовать процедуру Command3_Click (), см. код ниже,
  • после остановки выполнения проекта загрузить реплику в приложение Visdata, просмотреть содержимое соответствующей таблицы (в этой таблице появились изменения, сделанные ране в главной реплике) и значения поля s_Generation: в процессе синхронизации значение поля увеличивается на 1 при каждом изменении записи.

    В тех случаях, когда в разных репликах изменяется одна и та же запись несkолько раз, то в итоге в процессе синхронизации копируются данные той реплики, которая изменила запись большее число раз. В случае равенства числа изменений Microsoft Jet выбирает запись из таблицы с наименьшим значением ReplicaID,

  • cделать изменения в реплике 1 раз, в главной реплике - 2 раза. Сделать щелчок на третьей командной кнопке, затем проверить результат синхронизации.
  • Private Sub Command1_Click() ' создание главной реплики
    Dim dbHaupt As Database, replicaProp As Property
    ' открыть базу
    Set dbHaupt = OpenDatabase("C:\rep\sabi.mdb", True) 
    ' создать свойство Replicable
    Set replicaProp = dbHaupt.CreateProperty("Replicable", dbText, "T")
    dbHaupt.Properties.Append replicaProp ' добавить свойство
    ' свойству присвоить значение True
    dbHaupt.Properties("Replicable") = "T" 
    End Sub
    
    Private Sub Command2_Click() ' создание реплики
    Dim dbHaupt As Database
    ' открыть базу
    Set dbHaupt = OpenDatabase("C:\rep\sabi.mdb", True) 
    'создать новый объект репликационного набора
    dbHaupt.MakeReplica "C:\rep\sabicopy.mdb", "Replica of "  "dbHaupt"
    dbHaupt.Close
    End Sub
    
    Private Sub Command3_Click() ' процесс синхронизации
    Dim dbHaupt As Database
    ' открыть базу данных - главную реплику
    Set dbHaup = OpenDatabase("C:\rep\sabi.mdb", True) 
    ' копирование изменений 
    dbHaupt.Synchronize "C:\rep\sabicopy.mdb"
    End Sub

    ADO

    Общие сведения

    Модель ADO - ActiveX Data Objects разработанная корпорацией Microsoft представляет собой семейство объектов, используемых для работы с источниками данных.

    OLE DB - основа универсальной модели доступа к данным представляет собой набор интерфейсов COM, которые обеспечивают доступ программ к данным. Способ использования приложением функциональных возможностей ADO частично определяется наличием поставщика OLE DB для данных. ADO разработан для работы с OLE DB, если поставщик OLE DB недоступен, можно использовать ADO для непосредственного соединения с помощью драйвера ODBC.

    Наиболее простое средство реализации ADO в приложениях - использование элемента управления ADO Data.

    Когда ADO связывается с базой данных, работа происходит через сетевую библиотеку. Выбор сетевой библиотеки определяется поставщиком и конфигурацией системы.

    Объекты

  • Объект Connection - соединение позволяет приложениям установить связь с источником данных. После этого объект Connection можно употреблять для исполнения SQL-запросов, он может также использоваться объектами Command и Recordset. Для установления соединения с источником данных используется метод Open, для закрытия соединения - метод Close.

    Свойства объекта Connection:

  • ConnectionTimeout. Указывает время ожидания выполнения операции установки связи с базой данных в секундах. По истечению заданного интервала генерируется ошибка,
  • ConnectionString. Предоставляет информацию, необходимую для установки связи с базой данных,
  • CursorLocation. Указывает позицию курсора,
  • DefaultDatabase. Указывает базу данных, заданную для данного объекта Connection по умолчанию,
  • Mode. Определяет права доступа на запись и чтение данных. Присвоить значение этому свойству можно только до установки связи с источником данных. В случае с удаленными службами данных его значение должно быть adModeUnknown,
  • State. Возвращает текущее состояние связи - значение adStateClosed, adStateOpen, adStateExecuting, adStateConnecting.
  • Методы объекта Connection:

  • BeginTrans. Используется, чтобы начать транзакцию,
  • Cancel. Прекращает выполнение текущей асинхронной операции,
  • CommitTrans. Фиксирует все изменения в объекте Connection,
  • Execute. Выполняет команду, представленную в виде объекта Command. Формат обращения к этому объекту имеет вид:

    Connection.Еxecute CommandText, RecordsAffected, Options здесь: CommandText - это выражение SQL, имя таблицы, имя хранимой процедуры или иной текст команды. RecordsAffected возвращает количество записей, обработанных командой. В качестве значения параметра Options используют константу adExecuteSync, чтобы стартовать асинхронную операцию, или adFetchAsync, указывающее, что строки, остающиеся после заполнения буфера, должны возвращаться асинхронно,

  • Open. Устанавливает связь с источником данных. При использовании удаленных служб данных связь не устанавливается, пока не открыт набор записей Recordset. Формат обращения к методу Open:

    Сonnection.Open ConnectionString, UserID, Password, Option

    Аргументы UserID и Password задают соответственно учетную запись и пароль пользователя. Значение аргумента Option может быть установлено равным константе adAsyncConnect, чтобы установка связи происходила асинхронно. Все аргументы являются необязательными

    ,
  • OpenSchema. Возвращает информацию о схеме базы данных, например, о структуре таблицы,
  • RollbackTrans. Отменяет все изменения в текущем объекте Connection,
  • Объект Command.Объект Command используется для передачи команд в источник данных. Для источников данных типа SQL Server состоят из динамических команд SQL, подготовленных команд SQL или вызовов хранимых процедур (Хранимая процедура предствляет собой откомпилированное заранее семейство инструкций SQL и необязательных инструкций управления порядком выполнения, хранимое под некоторым именем и обрабатываемое как единое целое). Свойство Текст команды (CommandText) содержит саму команду, а метод Исполнить (Execute) ее стартует.

    Некоторые свойства:

  • ActiveConnection. Ассоциирует объект Command с объектом Connection,
  • CommandText. Является текстовой строкой, содержащей команду, которая должна быть выполнена, например, инструкция языка SQL SELECT: acmd.CommandText = "SELECT * FROM empl"
  • CommandTimeout. Указывает период времени в секундах, предоставленный команде на выполнение. Если значение данного поля равно 0, то время ожидания не ограничено. Значение по умолчанию - 30,
  • CommandType. Описывает тип команды,
  • Prepared. Является значением типа Boolean, указывающим, нужно ли перед выполнением команды ее скомпилировать,
  • State. Указывает текущее состояние объекта.

    Методы объекта Command. У объекта Command есть три метода. Метод Execute используется для старта команд. Если команда возвращает строки таблицы, ее результат должен быть присвоен объекту Recordset: Set ars = acmd.Execute ars - объект типа Recordset, acmd - объект типа Command Метод Cancel используется для остановки выполнения текущей команды. Метод CreateParametеr используется для создания нового объекта Parameter: Set Parameter = command.CreateParameter (Name, Type, Direction, Size, Value)

  • Коллекция. Parameters и объект Parameter Коллекция Parameters представляет все параметры или аргументы запроса или сохраненной процедуры. У каждого объекта Parameter есть коллекция Parameters. Свойства объекта Parameter:
  • Attributes. Описывает объект Parameter при помощи одной из следующих констант: adParamSigned - параметр принимает числовые значения со знаком, adParamNullable - параметр может принимать значение Null, adParamLong - объект может принимать значение двоичных или символьных данных очень большого размера через метод AppendChunk,
  • Direction. Указывает направленность параметра, то есть определяет, является объект Parameter входным или выходным, или изменяемым параметром, или результатом выполнения хранимой процедуры базы данных,
  • NumericScale. Является переменной типа Byte, указывающей количество десятичных знаков для представления значения числового параметра,
  • Size. Указывает максимальный размер параметра в байтах,
  • Type. Указывает тип объекта Parameter,
  • Value. Задает и возвращает значение объекта Parameter. Тип этого свойства - Variant.

    Методы объекта Parameter: имеется один метод AppendChunk. Используемый формат: object.AppendChunk Data, здесь Data - данные, добавляемые к значению свойства Value объекта Parameter. При первом вызове этого метода данные не добавляются, они переписываются вместо старых данных. При последующих вызовах данные добавляются к концу существующих. Этот метод используется для размещения в объекте Parameter большого количества текстовой или двоичной информации.

  • Объект Recordset. Представляет набор записей той или иной базы данных либо набор записей, являющийся результатом выполнения определенной команды. Объект Recordset позволяет преходить от одной записи к другой, редактировать и удалять записи. В модели ADO для объектов Recordset применяются четыре различные типа курсора:
  • динамический курсор. Позволяет произвольно перемещаться по записям объекта,
  • индексный курсор. Аналогичен динамическому, но запрещает доступ к записям, добавленным или удаленным другими пользователями,
  • статический курсор. Создает Объект Recordset, который допускает неограниченное перемещение по объекту, однако изменения, вставки и удаления записей, произведенные другими пользователями невидимы,
  • однонаправленный курсор. Идентичен статическому курсору с той разницей, что по записям объекта можно двигаться только вперед.

    Свойства объекта Recordset:

  • AbsolutePosition. Возвращает или устанавливает абсолютный номер текущей записи. (Число типа Long, нумерация записей ведется с 1). Может также возвращать одну из следующих констант:
  • AdPosBOF указывает, что достигнуто начало файла,
  • AdPosEOF указывает, что достигнут конец файла,
  • adPosUnknown указывает, что позиция текущей записи неизвестна,
  • BOF. Будучи установленным True, указывает, что курсор указывает на начальную запись набора Recordset,
  • Bookmark. Устанавливает или возвращает значение типа Variant, содержащее определенную позицию (положение текущей записи) в базе данных. С помощью закладки можно запомнить текущую позицию и впоследствии вернуться к ней,
  • CacheSize. Устанавливает или возвращает количество локально буферируемых записей. Например, если установить значение этого свойства равным 20, то при открытии объекта Recordset в локальную память будет скопировано 20 записей. Чтобы в уже находящихся в буфере записях отобразились изменения, произведенные другими пользователями, нужно использовать метод Resync,
  • CursorLocation. Устанавливает или возвращает размещение механизма курсора. Значение adUseServer указывает, что должен использоваться курсор, базирующийся на сервере. Значение adUseClient указывает, что курсор должен управляться локально,
  • CursorType. Устанавливает или возвращает тип курсора. Может принимать значения: adOpenForwardOnly (однонаправленный), adOpenKeyset (индексный), adOpenDynamic (динамический), adOpenStatic (статический),
  • EditMode. Возвращает режим обработки текущей записи,
  • EOF. Если значение - True, то курсор находится в конце набора записей Recordset,
  • Filter. Устанавливает или возвращает значение типа Variant, которое может содержать текстовую строку критерия отбора записей (например, "emp_Gender = "ж" OR emp_Salary > 8000" ), массив закладок или одну из констант. Для отмены действия условия отбора нужно присвоить этому свойству значение пустой строки "" или константу adFilterNone,
  • LockType. Устанавливает или возвращает тип блокировки, присущий данной записи,
  • MaxRecords. Ограничивает количество записей, предоставляемых по одному запросу,
  • PageSize. Позволяет разбить набор записей на логические страницы. Например, если вы хотите, чтобы на экране одновременно отображалось 20 записей, можно установить значение этого параметра равным 20. Можно пользоваться свойством AbsolutePage, для перехода на указанную страницу:
    ' задать 20 страниц и перейти на 3-ю
    ars.PageSize = 20 
    ars.AbsolutePage = 3
  • PageCount возвращает количество страниц в базе данных,
  • RecordCount. Возвращает количество записей в базе данных,
  • Sort. Позволяет сортировать объект Recordset по любому полю или набору полей. Сортировка доступна, если значение свойства CursorLocation равно adUseClient. С помощью ключевого слова ASCENDING или DESCENDING может быть указан порядок сортировки. Например: ars.sort = "emp_gender", Ascending
  • Source. Устанавливает и возвращает источник данных,
  • State. Возвращает информацию о текущем состоянии объекта,
  • Status. Возвращает сведения о текущей записи в виде комбинации констант (табл. 4.8):
    Сведения о текущей записи в виде комбинации констант
    Константа Описание
    adRecOK Запись была обновлена успешно
    adRecNew Запись только что создана
    adRecModified Запись была изменена
    adRecDeleted Запись была удалена
    adRecUnmodified Запись не была изменена
    adRecInvalid Запись не была сохранена, поскольку закладка неверна
    adRecMultipleChanges Запись не была сохранена, т.к. сохранение затронуло бы несколько записей
    adRecPendingChanges Запись не была сохранена по причинам, связанным с отложенной вставкой
    adRecCanceled Запись не была сохранена, т.к. операция была отменена
    adRecCantRelease Новая запись не была сохранена из-за блокирования записей
    adRecConcurrencyViolation Запись не была сохранена, т.к. применялась оптимистическая стратегия параллельного доступа к данным
    adRecIntegrityViolation Запись не была сохранена, т.к. пользователь нарушил условие непротиворечивости данных
    adRecMaxChangesExceeded Запись не была сохранена, т.к. было слишком много незаконченных изменений adRecObjectOpen Запись не была сохранена из-за конфликта с открытым объектом хранения
    adRecOutOfMemory Запись не была сохранена, т.к. у компьютера закончились ресурсы свободной памяти
    adRecPermissionDenied Запись не была сохранена из-за недостаточности полномочий пользователя
    adRecSchemaViolation Запись не была сохранена, т.к. она нарушает структуру базы данных
    adRecDBDeleted Запись уже удалена из источника данных
  • Методы объекта Recordset:

    AddNew. Добавляет новую запись. Дополнительно можно указать значения полей записи. При этом имена полей и их значений указываются с помощью функции Array:

    ars.AddNew Array ("emp_salary", "emp_gender"), Array (55000, "m" )

  • CancelBatch. Отменяет незавершенное пакетное обновление,
  • CancelUpdate. Отменяет незавершенные изменения,
  • Clone. Создает копию объекта Recordset со всеми сохраненными закладками,
  • Delete. Удаляет текущую запись,
  • Find - поиск. Синтаксис обращения:

    Find (criteria, SkipRows, searchDirection, start), здесь: criteria - допустимое выражение инструкции WHERE SQL (без самого ключевого слова WHERE ), например, "emp_gender = 'g""

    Ключевое слово Like может применяться для поиска похожих текстовых строк, например: ars.find ("emp_name Like 'F_*").

    Аргумент SkipRows указывает количество строк таблицы, которые необходимо пропустить, начиная с заданной позиции. Аргумент SearchDirection указывает направление поиска. С помощью аргумента start можно передать закладку, с которой нужно начинать поиск,

  • Move. Позволяет переместить текущую позицию курсора,
  • MoveFirst, MoveLast, MoveNext, MovePrevious. Методы позволяют установить текущую позицию на первую, последнюю, следующую и предыдущую соответственно,
  • Requiry. Обновляет данные в объекте Recordset, выполняя запрос повторно,
  • Resync. Обновляет данные в объекте Recordset, отображая изменения, произведенные другими пользователями,
  • Save. Сохраняет объект Recordset в виде файла. Если установлено какое-либо условие отбора, то сохраняются только записи, удовлетворяющие ему. Файл не закрывается до тех пор, пока не будет закрыт объект Recordset.

    Синтаксис: Recordset.Save FileName, PersistFormat, здесь PersistFormat указывает формат файла.

  • Supports. Указывает, обладает ли объект Recordset определенными функциональными возможностями,
  • Update. Сохраняет изменения текущей записи. При перемещении от одной записи к другой программное обеспечение ADO автоматически вызывает метод Update,
  • UpdateBatch. Сохраняет все пакетные изменения на диске.
  • Коллекция Fields и объект Field. У каждого объекта Recordset есть коллекция Fields, состоящая из объектов Field. Каждый объект Field представляет отдельное поле объекта Recordset. Объект Field содержит основную информацию о поле (значение, тип данных и размер). Каждый объект Field содержит коллекцию Properties.
  • Свойства объекта Field:

    ActualSize. Возвращает количество байт, хранящихся в поле,

  • Attributes. Описывает характеристики объекта. Используются некоторые константы, значение которых может принимать,
  • adFldUpdatable. Объект Field может быть обновлен,
  • adFldFixed. Объект Field содержит данные фиксированной длины,
  • adFldNullable. Объект Field может содержать значение Null,
  • adFldRowVersion. Объект Field содержит номер версии или отметку времени,
  • DefinedSize. Содержит максимальный размер объекта Field (в байтах),
  • Name. Содержит имя поля в базе данных или в команде выборки данных,
  • OriginalValue. Содержит значение объекта Field, присущее ему до измеения соответствующего поля,
  • Type. Возвращает константу, указывающую тип поля,
  • UnderLyingValue. Возвращает текущее значение поля, хранящееся в базе данных,
  • Value. Устанавливает или возвращает текущее значение поля.

    Методы объекта Field: у объекта Field есть два метода: AppendChunk и GetChunk, используемых для управления большими объемами двоичной или текстовой информации. Метод GetChunk используется для получения всей информации, хранящейся в объекте Field или ее части. С помощью метода AppendChunk можно добавить к полю новые данные.

  • Коллекция Properties и объект Propertу. У объектов Connection, Command, Recordset, Parameter и Field есть коллекция Properties, содержащая объекты Property. У объекта Property есть 4 свойства:
  • Name. Устанавливает или возвращает имя свойства,
  • Value. Устанавливает или возвращает значение свойства,
  • Attributes. Устанавливает или возвращает значение, равное комбинации констант: adPropNotSupported (поставщик не поддерживает это свойство), adPropRequired (значение этого свойства должно быть указано до инициализации источника данных), adPropOptional (значение этого свойства не обязательно указывать до инициализации источника данных ), adPropRead (свойство доступно для чтения), adPropWrite (свойство доступно для записи),
  • Type. Устанавливает или возвращает тип данных.
  • Коллекция Errors и объект Error. При возникновении ошибки поставщика данных, содержимое коллекции удаляется и в коллекцию помещается один или несколько новых объектов Error. Некоторые сообщения поставщика данных добавляются к коллекции Errors, не приостанавливая выполнения программы. При каждом действии, которое может вызвать ошибку, следует очищать коллекцию с помощью метода Clear. Ошибки ADO обрабатываются системой обработки Visual Basic.

    Свойства объекта Error:

  • Description. Возвращает строку с кратким описанием ошибки. Задается либо программным обеспечением ADO, либо поставщиком данных,
  • NativeError. Указывает код ошибки поставщика данных,
  • Number. Указывает номер, однозначно определяющий объект Error,
  • Source. Указывает имя объекта в котором произошла ошибка,
  • SQLState. Содержит код состояния SQL для данного объекта Error.
  • События, предусмотренные в модели ADO

  • CommitTransComplete. Происходит после выполнения транзакции объектом Connect,
  • ConnectComplete. Генерируется после связывания с базой данных,
  • EndOfRecordset. Происходит при попытке обратиться по адресу, находящемуся за пределами области данных,
  • ExecuteComplete. Активизируется после выполнения команды (метода Execute объектов Connection или Command или метода Open объекта Recordset ),
  • FetchComplete. Происходит, когда в результате выполнения продолжительной асинхронной операции были получены все записи в наборе записей,
  • FetchProgress. Aктивизируется при выполнении продолжительной асинхронной операции выборки записей, давая возможность отменить операцию,
  • FieldChangeComplete. Происходит после изменения одного или нескольких объектов Field методами Value или Update объекта Recordset,
  • InfoMessage. Генерируется при активизации какого-либо события объекта связи, если соответствующая операция прошла успешно, но поставщик данных пересылает дополнительную информацию,
  • MoveComplete. Происходит после изменения текущей позиции в наборе записей Recordset,
  • OnError. Происходит при возникновении какой-либо ошибки базы данных,
  • RecordChangeComplete. Активизируется при изменении хотя бы одной записи в объекте Recordset одним из методов: AddNew, CancelButton, CancelUpdate, Delete, Update или UpdateBatch,
  • RecordsetChangeComplete. Происходит после изменения набора записей методами Close, Filter, Open, Requery или Resync объекта Recordset,
  • RollbackTransComplete. Происходит после завершения метода RollBackTrans объекта Connection, отменяющего последнюю транзакцию,
  • WillChangeField. Происходит перед изменением одного или нескольких объектов Field методами Value или Update объекта Recordset,
  • WillChangeRecord. Происходит перед изменением одной или нескольких записей в объкте Recordset одним из методов: AddNew, CancelButton, CancelUpdate, Delete, Update или UpdateBatch,
  • WillChangeRecordset. Происходит перед изменением набора записей методами Close, Filter, Open, Requery или Resync объекта Recordset,
  • WillExecute. Происходит перед выполнением команды (метода Execute объектов Connection или Command или метода Open объекта Recordset ),
  • WillConnect. Происходит перед установкой связей с базой данных,
  • WillMove. Происходит перед изменением текущей структуры позиции в наборе записей Recordset.
  • Практическая работа 30. ADO

    30а. ADO: вывод данных в поле списка; добавление/удаление записей в базу данных из проекта

  • Создать на форме 5 полей списка ( lstName, lstVorname, lstVatersn, lstGebdat, lstNummer ),
  • создать ссылку на библиотеку: Проект $$\to$$ Информация (рис 4.5(рис 4.5) MSFlexGrid
  • создать на форме меню (рис. 4.6): Инструменты $$\to$$ Редактор меню, данные табл. 4.9 $$\to$$ OK,
    Данные, используемые при создании меню
    Имя Название
    mnuDob Добавить
    mnuUd Удалить
    mnuExit Выход
  • ввести код, данный ниже, пояснения даны под комментариями,
    (General) (Declarations) (формы)
    ' описание переменных как объектов подключения и 
    ' набора записей
    Private cn As adodb.Connection
    Private rs As adodb.Recordset
    (рис 4.6) Вид формы Form1
    Private Sub Form_Activate()
    ' переменная для хранения строки подключения к базе данных
    Dim cmd As String
    ' переменная для хранения SQL-запроса
    sql As String
    Dim cn As adodb.Connection 
    Dim rs As adodb.Recordset
    ' очистить списки
    lstName.Clear
    lstVorname.Clear
    lstVatersn.Clear
    lstGebdat.Clear
    lstNummer.Clear
    
    ' создать строку подключения. Подключение проводится с помощью
    ' провайдера OLEDB (иначе в строке нужно указать другого провайдера).
    ' Следующий параметр (см. строку программы) определяет имя базы данных.
    ' Строка кода выделяется в отдельную функцию, что позволяет реализовать работу с 
    ' различными источниками данных. Такой функции можно передать параметр.
    cmd = "Provider=Microsoft.Jet.OLEDB.3.51;Persist Security _
    Info=False;Data Source=A:\db1.mdb"
    ' установить соединение с базой данных
    Set cn = New adodb.Connection 
    cn.ConnectionString = cmd
    cn.Open
    ' создать запрос
    sql = "select * from Таble1" 
    
    ' открыть набор записей. Открывается объект Recordset, ему нужно передать
    ' SQL-запрос (sql = "select * from Table1"), Set rs = New..... Далее
    ' набор открывается командой rs.Open sql, cn,adOpenDynamic, adLOckOPtimistic
    ' параметр sgl хранит SQL-запрос, второй параметр означает, что для 
    'подключения к базе нужно использовать объект cn, следующий параметр
    ' определяет тип курсора (табл. 4.10)
    Типы курсоров
    Тип курсора Описание
    ad OpenForwardOnly Лишь для перебора записей в одном направлении
    adOpenKeyset Для большого набора записей
    adOpenDynamic Позволяет отслеживать изменения, вносимые другими пользователями в набор записей
    adOpenStatic Для небольших наборов

    Последний параметр определяет тип доступа к набору записей (табл. 4.11)

    Тип блокировки
    Тип блокировки Описание
    ad LockReadOnly Использовать, если не нужно добавлять, обновлять или удалять записи
    adLockPessimistic Запись блокируется в начале редактирования до его завершения или перехода к следующей записи
    adLockOptimistic Включается при вызове метода Update для записи. Запись временно блокируется (на время сохранения изменений в базе)
    Set rs = New adodb.Recordset 
    rs.Open sql, cn, adOpenDynamic, adLockOptimistic
    Do While Not rs.EOF
    ' включить данные в каждый список
    lstName.AddItem rs("Name")
    lstVorname.AddItem rs("Vorname")
    lstVatersn.AddItem rs("Vatersn")
    lstGebdat.AddItem rs("Gebdat")
    lstNummer.AddItem rs ("Nummer")
    rs.MoveNext ' перейти к следующей записи
    Loop
    ' закрыть набор записей и очистить объектную переменную
    rs.Close
    Set rs = Nothing
    ' закрыть подключение и уничтожить объект подключения
    cn.Close: Set cn = Nothing
    End Sub
    
    Private Sub mnuDob_Click()
    ' показать форму "Добавление"
    frmDob.Show
    End Sub
    
    Private Sub mnuExit_Click()
    Dim v As Integer ' код возврата
    ' проверка, хочет ли пользователь закончить 
    ' выполнение проекта
    v = MsgBox("Exit ?", vbYesNo + vbQuestion, " Exit ?")
    ' число 6 соответствует нажатой кнопке Yes
    If v = 6 Then End 
    End Sub
    
    Private Sub mnuUd_Click()
    ' показать форму "Удаление"
    frmUd.Show
    End Sub
  • добавить новую форму для добавления записей в базу данных, на форме создать 6 элементов управления Label (значения свойств Caption даны на рис 4.7(рис 4.7) Вид формы Добавление записи
  • ввести код, данный ниже:
    (General) (Declarations)
    Private cn As adodb.Connection 
    Private rs As adodb.Recordset
    
    Private Sub Command1_Сlick()
    Dim rc As String 'код возврата
    Dim cmd As String, sql As String
    Dim cn As adodb.Connection, rs As adodb.Recordset
    ' создать строку подключения
    cmd = "Provider=Microsoft.Jet.OLEDB.3.51;Persist Security _
    Info=False;Data Source=A:\db1.mdb"
    ' установить соединение с базой данных
    Set cn = New adodb.Connection
    cn.ConnectionString = cmd
    cn.Open
    sql = "select * from Таble1" ' создать запрос
    Set rs = New adodb.Recordset ' открыть набор записей
    rs.Open sql, cn, adOpenDynamic, adLockOptimistic
    ' проверка, действительно ли пользователь
    ' хочет добавить данные
    rc = MsgBox("Add ?", vbYesNo + vbQuestion, "Add !")
    If rc = 6 Then
    ' процесс добавления данных 
    rs.AddNew: rs("Name") = txtName
    rs("Vorname") = txtVorname
    rs("Vatersn") = txtVatersn
    rs("Gebdat") = txtGebdat
    rs("Nummer") = txtNummer
    rs.Update
    End If
    rs.Close: Set rs = Nothing
    cn.Close
    Set cn = Nothing
    ' вывод сообщения о добавлении записи в БД
    MsgBox "Введенная вами запись добавлена в базу данных!",_ vbOKOnly, "Успешное добавление!"
    End Sub
    
    Private Sub Command2_Click()
    ' перейти на главную форму
    Unload Me: Form1.Show
    End Sub
  • добавить новую форму для работ по удалению записей из базы данных, создать на форме элементы управления Label, TextВox (Name= txtQuery), 2 элемента управления CommandButton, рис 4.8(рис 4.8) Вид формы Form3. Удаление записи
  • ввести код:
    Private cn As adodb.Connection
    Private rs As adodb.Recordset
    
    Private Sub Command1_Сlick()
    Dim rc As Integer 'код возврата
    Dim cmd As String, sql As String, cn As adodb.Connection
    Dim rs As adodb.Recordset
    ' создание SQL-запроса 
    sql = "SELECT Таble1.Nummer From Таble1 WHERE_
    (((Таble1.Nummer) = "_
    sql = sql  """"  txtQuery.Text  """" "));"
    ' создать строку подключения
    cmd = "Provider=Microsoft.Jet.OLEDB.3.51;Persist Security _
    Info=False;Data Source=A:\db1.mdb"
    ' установить соединение с базой данных
    Set cn = New adodb.Connection 
    cn.ConnectionString = cmd
    cn.Open ' открыть набор записей
    Set rs = New adodb.Recordset 
    rs.Open sql, cn, adOpenDynamic, adLockOptimistic
    ' проверка, действительно ли пользователь хочет 
    ' удалить данные
    rc = MsgBox("Yes or No ?", vbYesNo + vbQuestion, "Del)
    If rc = 6 Then
    rs.Delete ' процесс удаления
    MsgBox "Запись из базы данных удалена!", _
    vbInformation + vbOKOnly, "Удаление выполнено!"
    End If
    rs.Close:
    Set rs = Nothing
    cn.Close
    Set cn = Nothing
    End Sub
    
    Private Sub Command2_Click()
    Unload Me: Form1.Show
    End Sub
  • cтартовать проект, при этом выводятся данные в поля ListBox, ввести записи в базу данных из проекта, удалить записи.
  • 30b. Элемент управления ADO Data: вывод данных, добавление записей в таблицу из проекта, выполнение SQL-запроса, вывод результатов

    В данной работе рассматриваeтся:

  • создание базы данных (ado.mdb) с использованием Visual Data Manager,
  • вывод с помощью ADO Data Control данных таблицы saleslist, см. табл. 4.12, в текстовое поле,
  • выполнение SQL-запроса и вывод результатов.
  • Содержимое таблицы базы данных saleslist
    Name of product Price Quantity Total
    tvset 400 10 4000
    computer 300 2 6000
    Fax 200 20 4000
    telephone 150 20 3000
    scaner 700 15 10500

    Порядок выполнения:

  • создать на форме 4 элемента управления TextBox и 4 элемента управления Label (установить свойства Caption каждого элемента соответственно - Name of product, Price, Quantity, Total, рис 4.9(рис 4.9) Вид формы
  • cоздать базу данных с использованием Visual Data Manager, для этого:
  • выполнить команды: Модули $$\to$$ Visual Data Manager $$\to$$ File $$\to$$ New $$\to$$ Microsoft Access $$\to$$ Version 7.0 MDB, рис 4.10(рис 4.10) Visual Data Manager
  • ввести название: ado $$\to$$ сохранить,
  • в диалоговом окне Database Window сделать щелчок правой клавишей мыши. В появившемся меню выбрать New Table, рис 4.11(рис 4.11) Таблица Structure
  • задать имя таблицы: saleslist,
  • в диалоговом окне Table Structure сделать щелчок на кнопке Add field, рис 4.12(рис 4.12) Окно Add Field
  • в диалоговом окне Add Field в соответствующие поля ввести имена полей таблицы и типы данных, делать щелчок на кнопке ОК после каждого ввода:
    name_of_product, text,
    price currency
    quantity byte
    total currency
  • сделать щелчок на кнопке Close,
  • в диалоговом окне Table Structure сделать щелчок на кнопке Build the Table, которая стала активной, рис 4.13(рис 4.13) Database Window
  • в окне Database Window сделать двойной щелчок на поле saleslist, рис 4.14(рис 4.14) Построение таблицы saleslist
  • в диалоговом окне динамического набора Dynaset: saleslist сделать щелчок на кнопке Add, рис 4.15(рис 4.15) Построение таблицы, продолжение
  • вводить данные, после ввода каждой записи делать щелчок на кнопке Update, затем снова Add и т.д,
  • в окне Dynaset: saleslist сделать щелчок на кнопке Close; в окне Visdata выполнить команды: File $$\to$$ Exit. Создание базы данных ado.mdb завершено; файл базы данных сохраняется на дисковом устройстве в каталоге (system32),
  • для вывода элемента управления ADO Data выполнить следующее: Проект -> Компоненты -> Microsoft ADO Control 6.0 (OLEDB), рис 4.16(рис 4.16) Microsoft ADO Data Control
  • поместить элемент управления ADO Data на форму, рис 4.17(рис 4.17) Элемент управления на форме
  • присвоить значение свойства ConnectionString, рис 4.18(рис 4.18) Окно Property Pages
  • в диалоговом окне Property Pages сделать щелчок на кнопке Build, рис 4.19(рис 4.19) Поставщики услуг
  • в диалоговом окне Свойства связи с данными выбрать из списка поставщиков услуг Microsoft Jet 3.51 (или Microsoft Jet 4.0, если имеется в наличии), рис. 20. Эти поставщики используются при соединении источника данных, для которого не существует провайдера OLE DB, с другим источником данных OLE DB. Для баз данных Microsoft SQL Server используется Microsoft OLE DB Provider for SQL Server и т. д,
  • в диалоговом окне Свойства связи с данными сделать щелчок на кнопке Далее. Перейти к регистру Подключение, рис 4.20(рис 4.20) Регистр Подключение
  • найти в дереве файлов базу данных ado.mdb, выбрать в списке имя базы данных ado.mdb. Использовать имя пользователя - admin, рис. 4.20
  • сделать щелчок на кнопке Проверить подключение, если при этом выводится сообщение "Подключение успешно", то сделать щелчок на кнопке ОК,
  • в диалоговом окне Свойства связи с данными сделать щелчок на кнопке ОК; cтроится строка "Provider:, путь к базе данных" в окне Property Pages, рис. 4.18. В диалоговом окне Property Pages сделать щелчок на кнопке ОК,
  • присвоить значение свойству RecordSource для элемента данных ADO, рис 4.21(рис 4.21) Окно Property Pages
  • в диалоговом окне Property Pages выбрать для Command Type значение 2-adCmdTable, а для Table or Stored Procedure Name - saleslist $$\to$$ OK. Теперь установлена связь с базой данных ado.mdb и можно начать работу c элементами управления TextBox,
  • присвоить свойству DataSource каждого элемента управления TextBox значение Adodc1; а свойству DataField (см. также поля Label) каждого элемента управления TextBox (соответственно) - name_of_product, price, quantity, total,
  • стартовать проект, наблюдать выведенные данные, для этого перелистывать данные, используя стрелки > или >, см рис 4.22(рис 4.22) Вид формы после старта проекта
  • для добавления записей в таблицу базы данных выполнить следующее:
  • остановить выполнение проекта,
  • изменить значение свойства EOFAction объекта Adodc1 с 0 - adDoMoveLast на 2 - adDoAddNew,
  • стартовать проект и заполнить пустую запись, следующую после пятой записи, например, следующим образом: printer 800 10 8000.

    Замечание: для проверки (внесения записи) стартовать Visual Data Manager, двойным щелчком открыть и просмотреть таблицу. Переходить от одного поля TextBox к другому можно либо с помощью курсора мыши, либо с помощью клавиши Tab,

  • остановить выполнение проекта,
  • для выполнения SQL-запроса - для вывода в поле TextBox, например, наименования тех продуктов, стоимость которых равна 4000 (или больше 5000) выполнить следующее:
  • поместить на форму ещe один элемент управления (Adodc2) и еще один элемент управленияTextBox,
  • установить значение ConnectionString для элемента управления Adodc2 то же, что и у Adodc1 $$\to$$ OK,
  • при установке значения RecordSource в диалоговом окне Property Pages выбрать для Command Type значение 1 - adCmdText, а для Command Text (SQL) ввести запрос: Select * from saleslist where total=4000 (или total>5000)
  • установить свойства TextBox следующим образом: DataSource - Adodc2, DataField - name_of_product (название того поля, записи которого должны быть выведены в поле TextBox),
  • стартовать проект, наблюдать результаты, для этого перелистывать данные, используя стрелки > <.
  • 30c. ADO: вывод данных в MSFlexGrid; добавление записей в базу данных из проекта Visual Basic, поиск, удаление данных

    Рассматриваются следующие задачи:

  • создание базы данных с помощью редактора Visual Data Manager,
  • создание связи с базой данных с использованием ADO,
  • вывод таблицы в поле элемента управления MsFlexGrid (см. Form1),
  • добавление новых записей в таблицу базы данных (см. процедуру Command1_Click ()),
  • обновление записей в элементе управления MsFlexGrid (см. процедуру Command5_Click ()),
  • отбор записей по введенному критерию (см. процедуру Command2 ),
  • удаление записи (см. процедуру Command3_Click ()).
  • Последовательность действий:

  • создать базу данных с помощью Visual Data Manager:
  • Добавления $$\to$$ Visual Data Manager $$\to$$ File $$\to$$ New $$\to$$ Microsoft Access $$\to$$ Version7.0 MDB:, в открывшемся диалоговом окне ввести название базы данных (Inf.mdb) $$\to$$ OK,
  • в окне Database window сделать щелчок на правой кнопке мыши и выбрать New Table,
  • в поле Table name ввести имя таблицы (Clients). Чтобы ввести названия полей таблицы сделать щелчок на кнопке Add Field. В открывшемся диалоговом окне в поле Name ввести название поля $$\to$$ OK,
  • ввести следующие названия: Name, FirstName, Experience, Marital, Status, Age, Post -> Close. В диалоговом окне Table Structure появились названия полей таблицы,
  • сделать щелчок на кнопке Close. В окне Database window появилось название таблицы. Открыть ее двойным щелчком. Чтобы внести данные в таблицу, сделать щелчок на кнопке Add, после внесения - на кнопке Update (рис 4.23(рис 4.23) Cоздание таблицы

    Созданная таблица имеет вид (рис. 4.24):

    (рис 4.24) Содержание таблицы
  • сделать ссылку на библиотеку ADODB (Microsoft ActiveX Data Objects Library 2.1): Проект $$\to$$ Ссылки $$\to$$ Microsoft ActiveX Data Objects Library 2.1 - $$\to$$ OK,
  • создать на форме 4 элемента управления Command Вutton и элемент управления MsFlexGrid. Свойствам Caption элементов управления Command Вutton присвоить значения: Добавить, Поиск, Удалить, Выход, Обновить,
  • для добавления элемента управления MsFlexGrid выполнить следующее: Проект $$\to$$ Компоненты $$\to$$ Microsoft FlexGrid Control 6.0,
  • ввести код, данный ниже:
    ' описание переменных cn (соединение с базой данных)
    ' и rs (набор записей базы данных)
    Private cn As ADODB.Connection
    Private rs As ADODB.Recordset
    Private Sub Form_Load()
    ' cmd содержит адрес базы данных
    Dim cmd As String
    ' sql - SQL-запрос 
    Dim sql As String
    ' установить соединение с базой данных
    ' и открыть набор записей
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset
    
    cmd = "Provider=Microsoft.Jet.OLEDB.4.0;"  "Data Source="  _
    "C:\Program Files\Microsoft Visual Studio\"  "VB98\Inf.mdb"
    Set cn = New ADODB.Connection ' cоздать новое соединение:
    
    With cn
    ' свойству ConnectionString объекта cn присвоить 
    ' значение cmd
    .ConnectionString = cmd 
    .Open
    End With
    
    ' cоздать SQL запрос, открывающий всю таблицу Clients
    sql = "select * from Clients" 
    Set rs = New ADODB.Recordset 'создать новый набор записей:
    
    With rs
    ' oткрыть таблицу:
    .Open sql, cn, adOpenKeyset, adLockOptimistic
    End With
    
    ' данные вывести в поле элемента MSFlexGrid1: число 
    ' столбцов в MSFlexGrid' равно числу полей в таблице.
    MSFlexGrid1.Cols = rs.Fields.Count
    MSFlexGrid1.Rows = 1 ' число строк = 1
    ' вывести названия полей базы данных:
    For i = 0 To rs.Fields.Count - 1
    MSFlexGrid1.TextMatrix(0, i) = rs.Fields(i).Name
    Next I
    ' заполнить остальные строки:
    Do Until rs.EOF
    MSFlexGrid1.Rows = MSFlexGrid1.Rows + 1
    For i = 0 To rs.Fields.Count - 1
    If Not rs.Fields(i) = "" Then
    MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, i) = rs.Fields(i)
    End If
    Next i
    rs.MoveNext
    Loop
    rs.Close: Set rs = Nothing
    cn.Close: Set cn = Nothing
    End Sub
  • стартовать проект и наблюдать данные таблицы в (рис 4.25) Вид формы после старта проекта
  • ввести код процедуры Command1_Click(), которая будет добавлять записи в базу данных:
    Private Sub Command1_Click()
    ' описание массивов названий 
    Dim k(7) As Variant, z(7) As Variant 
    Dim cmd As String
    Dim sql As String
    Dim cn As ADODB.Connection: Dim rs As ADODB.Recordset
    
    cmd = "Provider=Microsoft.Jet.OLEDB.4.0;"  "Data Source="  _
    "C:\Program Files\Microsoft Visual Studio\"  "VB98\Inf.mdb"
    Set cn = New ADODB.Connection
    
    With cn
    .ConnectionString = cmd
    .Open
    End With
    
    sql = "select * from Clients "
    Set rs = New ADODB.Recordset
    rs.CursorType = adOpenDynamic
    
    With rs
    .Open sql, cn, adOpenKeyset, adLockOptimistic
    End With
    
    With rs
    .MoveLast
    Dim f As Field ' описание переменной f как объект поле
    ' в массиве k(t) запомнить названия всех полей
    For Each f In rs.Fields
    t = t + 1
    k(t) = f.Name
    ' в массив z(t) занести значения, 
    ' которые будут вводиться пользователем в таблицу
    z(t) = InputBox("Введите данные для занесения _
    в поле "  k(t), "Добавления")
    Next
    
    With rs
    ' добавить строку в таблицу
    .AddNew Array(k(1), k(2), k(3), k(4), k(5), k(6), k(7)), _
    Array(z(1), z(2), z(3), z(4), z(5), z(6), z(7))
    End With
    
    rs.Close: Set rs = Nothing
    cn.Close: Set cn = Nothing 
    End Sub
  • стартовать проект,
  • после щелчка на кнопке "Добавить" выводится окно ввода и пользователь должен ввести данные для занесения в таблицу, однако введeнные данные можно наблюдать лишь после обновления записей MSFlexGrid, см. код процедуры Command5_Click() "Обновить"
    Private Sub Command5_Click()
    Dim cmd As String: Dim sql As String
    Dim cn As ADODB.Connection: Dim rs As ADODB.Recordset
    cmd = "Provider=Microsoft.Jet.OLEDB.4.0;"  "Data Source="  _
    "C:\Program Files\Microsoft Visual Studio\"  "VB98\Inf.mdb"
    Set cn = New ADODB.Connection
    
    With cn
    .ConnectionString = cmd
    .Open
    End With
    
    sql = "select * from Clients "
    Set rs = New ADODB.Recordset
    
    With rs
    .Open sql, cn, adOpenKeyset, adLockOptimistic
    End With
    
    MSFlexGrid1.Cols = rs.Fields.Count
    MSFlexGrid1.Rows = 1
    For i = 0 To rs.Fields.Count - 1
    MSFlexGrid1.TextMatrix(0, i) = rs.Fields(i).Name
    Next i
    
    Do Until rs.EOF
    MSFlexGrid1.Rows = MSFlexGrid1.Rows + 1
    For i = 0 To rs.Fields.Count - 1
    If Not rs.Fields(i) = "" Then
    MSFleGrid1.TextMatrix(MSFlexGrid1.Rows - 1, i) = rs.Fields(i)
    End If
    Next i
    rs.MoveNext
    Loop
    
    rs.Close: Set rs = Nothing
    cn.Close: Set cn = Nothing
    End Sub
  • провести поиск в соответствии с некоторым критерием
    Private Sub Command2_Click()
    Dim cmd As String: Dim sql As String
    Dim cn As ADODB.Connection: Dim rs As ADODB.Recordset
    cmd = "Provider=Microsoft.Jet.OLEDB.4.0;"  "Data Source="  _
    "C:\Program Files\Microsoft Visual Studio\"  "VB98\Inf.mdb"
    Set cn = New ADODB.Connection
    
    With cn
    .ConnectionString = cmd
    .Open
    End With
    
    ' переменные Po и Kr служат для хранения критериев поиска:
    Po = InputBox("Введите названия полей, в которых будет_
    проводиться поиск")
    Kr = InputBox("Введите критерий, в соответствии с которым 
    будет проводиться поиск")
    ' ввести SQL запрос, в соответствии с которым выводятся 
    ' только те строки, которые соответствуют критерию
    sql = "Select * From Clients Where "  Po  Kr
    Set rs = New ADODB.Recordset
    
    With rs
    ' открыть только те строки таблицы, которые
    ' соответствуют критерию
    .Open sql, cn, adOpenKeyset, adLockOptimistic
    End With
    
    ' внести изменения в MSFlexGrid1:
    MSFlexGrid1.Cols = rs.Fields.Count
    MSFlexGrid1.Rows = 1
    For i = 0 To rs.Fields.Count - 1
    MSFlexGrid1.TextMatrix(0, i) = rs.Fields(i).Name
    Next i
    
    Do Until rs.EOF
    MSFlexGrid1.Rows = MSFlexGrid1.Rows + 1
    For i = 0 To rs.Fields.Count - 1
    If Not rs.Fields(i) = "" Then
    MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, i)_
    = rs.Fields(i)
    End If
    Next i
    rs.MoveNext
    Loop
    
    rs.Close: Set rs = Nothing
    cn.Close: Set cn = Nothing
    End Sub
  • стартовать проект и сделать щелчок на кнопке "Поиск". Ввести данные. Наблюдать за изменениями в MSFlexGrid1.
  • удаление выбранных записей
    Private Sub Command3_Click()
    Dim cmd As String: Dim sql As String
    Dim cn As ADODB.Connection: Dim rs As ADODB.Recordset
    cmd = "Provider=Microsoft.Jet.OLEDB.4.0;"  "Data Source=" _
    "C:\Program Files\Microsoft Visual Studio\"  "VB98\Inf.mdb"
    Set cn = New ADODB.Connection
    
    With cn
    .ConnectionString = cmd
    .Open
    End With
    
    sql = "select * from Clients"
    Set rs = New ADODB.Recordset
    
    With rs
    .Open sql, cn, adOpenKeyset, adLockOptimistic
    ' переменной fa присвоить значение - фамилию, которую
    ' хотим удалить вместе с соответствующей записью
    fa = InputBox("Введите фамилию для удаления _
    соответствующей записи")
    ' найти запись с такой фамилией и удалить ее
    
    Do Until .EOF
    If rs("FirstName") = fa Then
    rs.Delete adAffectCurrent
    End If
    .MoveNext
    Loop
    
    End With
    
    rs.Close: Set rs = Nothing
    cn.Close: Set cn = Nothing
    End Sub
  • стартовать проект, сделать щелчок на кнопке "Удалить", ввести требуемые данные, затем сделать щелчок на кнопке "Обновить", при этом удаляется выбранная запись.
    Private Sub Command4_Click()
    End
    End Sub
  • Практическая работа 31. Программное создание базы данных и работа с ней: создание файла, базы данных, двух таблиц, отношения, заполнение таблиц в диалоговом режиме, создание SQL-запроса и вывод результатов

    Задание: создать программным способом:

  • файл базы данных,
  • две таблицы (см. рис. 4.26, рис. 4.27, рис. 4.28), ключевые поля таблиц,
  • отношение,
  • возможность ввода записей таблиц в диалоговом режиме,
  • SQL-запрос для получения информации о данных клиентов (номер, фамилия, разряд, коэффициент тарифной сетки),
  • реализовать вывод результатов запроса.
  • (рис 4.26) Таблица 1(Таrif) (рис 4.27) Таблица 2 (Kunde) (рис 4.28) Таблица 2 (Kunde), режим конструктора (имя поля, тип данных)

    Пример выполнения практической работы 31.

  • Cоздать форму Form1, рис. 4.29 и меню, таблица 4.29">рис. 4.29 и меню, (рис 4.29) Форма Form1, внешний вид. Создано меню и указана последовательность выполнения задания
    Меню
    File Table Record Set Relation Query Exit
    Create Tab1 Record Set Table1 Create
    Query
    Open Tab1 Record Set Table2 Open
    Query

    Здесь:

  • Form $$\to$$ Create (рис. 4.31) - создать файл базы данных,
  • Table $$\to$$ Tab1 - создать структуру таблицы 1,
  • Table $$\to$$ Tab2 - создать структуру таблицы 2 (рис. 4.28),
  • RecordSet $$\to$$ RecordSetTable1 - в диалоговом режиме создать записи таблицы1 (рис. 4.33),
  • RecordSet $$\to$$ RecordSetTable2 - в диалоговом режиме создать записи таблицы2 (рис. 4.34),
  • Relation - создать отношение,
  • Query - CreateQuery - создать запрос,
  • Query - OpenQuery - открыть запрос (рис. 4.35),
  • Exit - завершить выполнение проекта,
  • создать Стандартный модуль и 5 форм, рис 4.30(рис 4.30) Окно проекта - составляющие проекта
  • ввести код формы Form1, пояснения даны под комментариями:
    Private Sub mnuCreate_Click() ' создать файл базы данных
    Load FrmCreate
    FrmCreate.Show
    End Sub
    
    Private Sub mnuCreateQuery_Click() ' создать запрос
    Call Query
    End Sub
    
    Private Sub mnuExit_Click() ' завершение работы проекта
    Call DatabaseClose
    Unload Form1
    MsgBox ("Завершение работы проекта!?"), vbCritical + vbOKOnly
    End
    End Sub
    
    Private Sub mnuOpen_Click() ' выбрать файл для его
    ' последующего открытия
    Load FrmOpen
    FrmOpen.Show
    End Sub
    
    Private Sub mnuOpenQuery_Click() ' открыть запрос
    Load FrmQuery
    FrmQuery.Show
    End Sub
    
    Private Sub mnuRecordSetTab1_Click() ' создать записи в
    ' таблице 1
    Load FrmTarif
    FrmTarif.Show
    End Sub
    
    Private Sub mnuRecordSetTab2_Click()' создать записи в
    ' таблице 2
    Load FrmKunde
    FrmKunde.Show
    End Sub
    
    Private Sub mnuRelation_Click() ' создать отношение
    Call Relation
    End Sub
    
    Private Sub mnuTab1_Click() ' создать структуру таблицы 1
    Call Tab1
    End Sub
    
    Private Sub mnuTab2_Click() ' создать структуру таблицы 2
    Call Tab2
    End Sub
  • ввести код модуля, данный ниже; пояснения даны под комментариями:
    (General) (Declarations)
    Public NewDB As Database
    Public NewWS As Workspace
    Public NewTbl As TableDef1
    Public NewTbl As TableDef2
    Public idx1 As Index
    Public idx2 As Index
    Public NewRel As Relation
    Public sqlquery As QueryDef
    Public NewRec As Recordset
    
    Public Sub Tab1() ' создание таблицы 1
    Set NewTbl1 = NewDB.CreateTableDef("Tarif")
    
    Set f1 = NewTbl1.CreateField()
    Set f2 = NewTbl1.CreateField() 
    
    f1.Name = "Razrjad" ' имя поля
    f1.Type = dbInteger ' тип данных
    f2.Name = "Koeffcnt"
    f2.Type = dbSingle
    NewTbl1.Fields.Append f1
    NewTbl1.Fields.Append f2
    
    Set idx1 = NewTbl1.CreateIndex("TarifIndex") ' создание индекса
    Idx1.Primary = True
    Set f1 = idx1.CreateField("Razrjad") ' создание индексного поля
    ' (используется метод объета idx)
    idx1.Fields.Append f1
    NewTbl1.Indexes.Append idx1
    NewDB.TableDefs.Append NewTbl1
    
    MsgBox ("Создана структура таблицы Tarif"), vbInformation +_
    vbOKOnly
    End Sub
    
    Public Sub Tab2() ' создание таблицы 2
    Set NewTbl2 = NewDB.CreateTableDef("Kunde")
    
    ' создание полей таблицы
    Set f3 = NewTbl2.CreateField()
    Set f4 = NewTbl2.CreateField()
    Set f6 = NewTbl2.CreateField()
    
    ' присваивание имeн полям и типов данным
    f3.Name = "Tabnumber"
    f3.Type = dbInteger
    f4.Name = "Nam"
    f4.Type = dbText
    f4.Size = 20
    f4.AllowZeroLength = True
    ' здесь позднее (см. Public Sub Relation) будет создано 
    ' зависимое поле (f5) отношения
    f6.Name = "Razrjad"
    f6.Type = dbInteger
    
    ' добавление полей в таблицу
    NewTbl2.Fields.Append f3
    NewTbl2.Fields.Append f4
    NewTbl2.Fields.Append f6
    
    ' создание индекса
    Set idx2 = NewTbl2.CreateIndex("KundeIndex")
    ' указание того, что главный индекс существует
    idx2.Primary = True
    ' создание индексного поля
    Set f3 = idx2.CreateField("Razrjad")
    Idx2.Fields.Append f3
    NewTbl2.Indexes.Append idx2
    NewDB.TableDefs.Append NewTbl2
    
    MsgBox ("Создана структура таблицы Kunde !"), vbOKOnly +_
    vbInformation
    End Sub
    
    Public Sub Relation() ' создание отношения
    Set NewRel = NewDB.CreateRelation("RelKunde") ' используется
    ' метод Создать отношение объекта База данных
    ' указание главной таблицы в отношении
    NewRel.Table = "Tarif"
    ' указание зависимой таблицы в отношении
    NewRel.ForeignTable = "Kunde"
    
    ' создание зависимого поля в отношении
    Set f5 = NewRel.CreateField("Razrjad")
    ' указание имени зависмого поля, по которому 
    ' строится отношение
    f5.ForeignName = "Razrjad"
    NewRel.Fields.Append f5
    ' добавление отношения в базу данных
    NewDB.Relations.Append NewRel
    
    MsgBox ("Отношение создано!"), vbOKOnly + vbInformation
    End Sub
    
    Public Sub Query() ' создание запроса
    Set sqlquery = NewDB.CreateQueryDef("sql1")
    
    ' указание того, что требуется выбрать в запросе,
    ' из каких таблиц провести выбор и формулировка 
    ' cоответствующих условий 
    
    sqlquery.SQL = "SELECT Kunde.Tabnumber, Kunde.Nam, _
    Kunde.Razrjad, Tarif.Razrjad, Tarif.Koeffcnt _
    FROM Tarif INNER JOIN Kunde ON Tarif.Razrjad = Kunde.Razrjad _
    WHERE Kunde.Tabnumber = 2;"
    MsgBox (" SQL-запрос введeнi!"), vbOKOnly + vbInformation
    End Sub
    
    Public Sub CreateFile() ' создание файла базы данных
    Set NewWS = DBEngine.Workspaces(0)
    Set NewDB = NewWS.CreateDatabase(FrmCreate.txtPath.Text,_ dbLangCyrillic)
    MsgBox (""Файл в формате mdb создан!"), vbInformation
    Unload FrmCreate
    End Sub
    
    Public Sub DatabaseClose() 
    NewWS.Close
    Set NewWC = Nothing
    End Sub
    
    Sub Main() ' начало проекта
    resp = MsgBox("Здравствуйте! Программное создание базы_ данных и работа с ней. Выберите ДА или НЕТ!", vbYesNo, " ")
    If resp = vbYes Then
    MsgBox "Сделайте щелчок на кнопке ОК для продолжения диалога!"
    Load Form1
    Form1.Show
    End If
    End Sub
  • на форме (рис 4.31) Форма FrmCreate (drvDrive, dirDirect, txtPaht)
    Private Sub Cancel_Click()
    Unload Me
    End Sub
    
    Private Sub Create_Click()
    Call CreateFile
    End Sub
    
    Private Sub dirDirect_Change()
    filFile.Path = dirDirect.Path
    End Sub
    
    Private Sub drvDrive_Change()
    dirDirect.Path = drvDrive.Drive
    End Sub
    
    Private Sub Path_Click() ' вывод пути и имени файла в
    ' поле txtPath 
    If drvDrive.Drive = "a:" Then
    dirDirect.Path = "a:\"
    txtPath.Text = dirDirect.Path + filFile.FileName
    Else
    txtPath.Text = dirDirect.Path + "\" + filFile.FileName
    End If
    End Sub
  • на форме FrmOpen, рис 4.32(рис 4.32) FrmOpen (drvDrive, dirDirect, txtPaht)
  • Private Sub Cancel_Click()
    Unload Me
    End Sub
    
    Private Sub Com1_Click() ' пометить требуемый файл и 
    ' перейти к Form1
    MsgBox ("Файл:" + FrmOpen.txtPath.Text), vbInformation
    FrmOpen.Hide
    End Sub
    
    Private Sub dirDirect_Change()
    filFile.Path = dirDirect.Path
    End Sub
    
    Private Sub drvDrive_Change()
    dirDirect.Path = drvDrive.Drive
    End Sub
    
    Private Sub filFile_Click()
    If Right(dirDirect.Path, 1) = "\" Then
    txtPath = dirDirect.Path + filFile.FileName
    Exit Sub
    Else
    txtPath.Text = dirDirect.Path + "\" + filFile.FileName
    End If
    End Sub
  • на форме FrmTarif, рис. 4.33, создать требуемые объекты и ввести код, данный ниже:
    Private Sub Cancel_Click() '
    Unload Me
    End Sub
    
    Private Sub Com1_Click() ' добавить
    ' открывает буфер для очередной записи в таблице
    datTarif.Recordset.AddNew
    End Sub
    
    Private Sub Com2_Click() ' обновить
    ' сбрасывает содержимое буфера для того, чтобы
    ' изменения были зафиксированы в записи
    datTarif.UpdateRecord
    End Sub
    
    Private Sub Com3_Click() ' выход
    Unload Me
    End Sub
    
    Private Sub Com4_Click() ' удалить
    ' уничтожает запись таблицы
    datTarif.Recordset.Delete
    End Sub
    
    Private Sub Com5_Click() ' восстановить
    ' если изменено содержимое записи, но ещё не обновлено,
    ' то восстановится предыдущее значение поля
    datTarif.UpdateControls
    End Sub
    
    Private Sub Com6_Click() ' вперёд
    datTarif.Recordset.MoveNext
    If datTarif.Recordset.EOF Then
    MsgBox "Конец таблицы!", vbOKOnly + vbInformation, " "
    datTarif.Recordset.MoveLast
    End If
    End Sub
    
    Private Sub Com7_Click() ' назад
    datTarif.Recordset.MovePrevious
    If datTarif.Recordset.BOF Then
    MsgBox "Hачало таблицы!", vbOKOnly + vbInformation, " "
    datTarif.Recordset.MoveFirst
    End If
    End Sub
    
    Private Sub Com8_Click() ' к первой записи
    datTarif.Recordset.MoveFirst
    End Sub
    
    Private Sub Com9_Click() ' к последней записи
    datTarif.Recordset.MoveLast
    End Sub
    
    Private Sub Exit_Click() ' выход
    Unload Me
    End Sub
    
    Private Sub Form_Load()
    Set NewDB = Worspaces(0).OpenDatabase(FrmOpen.txtPath.Text)
    
    ' установка свойств элементов управленя Data и TextBox
    datTarif.DatabaseName = FrmOpen.txtPath.Text
    datTarif.RecordSource = "Tarif"
    
    ' txtRazrjad.DataSource = "datTarif" ' можно испоьзовать окно 
    ' свойств
    ' txtKoeffcnt.DataSource = "datTarif"
    
    txtRazrjad.DataField = "Razrjad"
    txtKoeffcnt.DataField = "Koeffcnt"
    End Sub
    (рис 4.33) Форма FrmTarif
  • на форме FrmKunde, рис. 4.34, создать требуемые объекты и ввести код, данный ниже:
    Private Sub Cancel_Click()
    Unload Me
    End Sub
    
    Private Sub Com1_Click() ' добавить
    datKunde.Recordset.AddNew
    End Sub
    
    Private Sub Com2_Click() ' обновить
    datKunde.UpdateRecord
    End Sub
    
    Private Sub Com3_Click() ' выход
    Unload Me
    End Sub
    
    Private Sub Com4_Click() ' удалить
    datKunde.Recordset.Delete
    End Sub
    
    Private Sub Com5_Click() ' восстановить
    datKunde.UpdateControls
    End Sub
    
    Private Sub Com6_Click() ' вперeд (к следующей записи)
    datKunde.Recordset.MoveNext
    If datKunde.Recordset.EOF Then
    MsgBox "Конец таблицы!", vbOKOnly + vbInformation, " "
    datKunde.Recordset.MoveLast
    End If
    End Sub
    
    Private Sub Com7_Click() ' назад (к предыдущей записи)
    datKunde.Recordset.MovePrevious
    If datKunde.Recordset.BOF Then
    MsgBox "Начало таблицы!", vbOKOnly + vbInformation, " "
    datKunde.Recordset.MoveFirst
    End If
    End Sub
    
    Private Sub Com8_Click() ' в начало таблицы
    datKunde.Recordset.MoveFirst
    End Sub
    
    Private Sub Com9_Click() ' в конец таблицы
    datKunde.Recordset.MoveLast
    End Sub
    
    Private Sub Exit_Click() ' выход
    Unload Me
    End Sub
    
    Private Sub Form_Load()
    Set NewDB = Worspaces(0).OpenDatabase(FrmOpen.txtPath.Text)
    
    ' yстановка свойств элементов управления Data иTextBox
    datKunde.DatabaseName = FrmOpen.txtPath.Text
    datKunde.RecordSource = "Kunde"
    
    ' txtTabnumber.DataSource = "datKunde" ' можно
    ' использовать окно свойств
    ' txtNam.DataSource = "datKunde"
    ' txtRazrjad.DataSource = "datKunde"
    
    txtRazrjad.DataField = "Razrjad"
    txtNam.DataField = "Nam"
    txtTabnumber.DataField = "Tabnumber"
    End Sub
    (рис 4.34) Форма FrmKunde
  • на форме FrmQuery, рис. 4.35, создать требуемые объекты и ввести код, данный ниже:
    Private Sub Cancel_Click()
    Unload Me
    End Sub
    
    Private Sub Com1_Click() ' к первой записи
    NewRec.MoveFirst
    Call showfields
    End Sub
    
    Private Sub Com2_Click() ' к последней записи
    NewRec.MoveLast
    Call showfields
    End Sub
    
    Private Sub Com3_Click() ' к следующей записи
    NewRec.MoveNext
    ' если достигнут конец таблицы, то выдаeтся 
    ' соответствующее сообщение и проводится переход к 
    ' последней записи
    If NewRec.EOF Then
    MsgBox "Kонец таблицы!", vbOKOnly + vbInformation, " "
    NewRec.MoveLast
    End If
    Call showfields
    End Sub
    
    Private Sub Com4_Click() ' к предыдущей записи таблицы
    NewRec.MovePrevious
    ' если достигнуто начало таблицы, то выдаeтся 
    ' соответствующее сообщение и проводится переход
    ' к первой записи
    If NewRec.BOF Then
    MsgBox "Hачало таблицы!", vbOKOnly + vbInformation, " "
    NewRec.MoveFirst
    End If
    Call showfields
    End Sub
    
    Private Sub Exit_Click()
    NewDB.Close
    Set NewDB = Nothing
    Unload Me
    End Sub
    
    Private Sub Form_Load()
    Set NewWS = DBEngine.Workspaces(0)
    Set NewDB = NewWS.OpenDatabase(FrmOpen.txtPath.Text)
    
    ' указатель на набор данных создаeтся с помощью метода 
    ' Recordset объекта Database. Синтаксис:
    ' Set RecordSet = Database.OpenRecordSet ("имя_таблицы или
    ' SQL-запроса, из которых берут данные", dbName), здесь 
    ' dbName - константа, которая определяет тип размещения
    ' данных. В основном используется dbname = dbOpenDynaset
    ' - размещение данных в виде динамического набора, 
    ' открывающего полный доступ к таблицам: перемещение, 
    ' индексирование, редактировние и т.д.
    Set NewRec = NewDB.OpenRecordset("sql1", dbOpenDynaset)
    Call showfields
    End Sub
    
    Private Sub showfields()
    ' используемый синтаксис: NewRec(name), где NewRec - 
    ' указатель на объект Recordset, name - имя поля
    txtTabnumber.Text = NewRec("Tabnumber")
    txtName.Text = NewRec("Nam")
    txtRazrjad.Text = NewRec("Tarif.Razrjad")
    txtKoeffcnt.Text = NewRec("Koeffcnt")
    End Sub
    (рис 4.35) Форма FrmQuery
  • стартовать проект, рис. 4.36. Последовательность действий пользователя дана на форме Form1 (рис. 4.29). На рис. 4.37 даны результаты запроса (см. также рис. 4.35 - форма FrmQuery ). На рис. 4.38 запрос представлен на бланке запроса, на рис. 4.39 запрос представлен в SQL -форме. Эти данные взяты из файла базы данных (см. регистр Запрос базы данных),
  • остановить выполнение проекта (рис. 4.38). Использовать кнопку Exit формы (рис 4.36) Старт проекта (рис 4.37) Результаты запроса (рис 4.38) Запрос на бланке запроса (рис 4.39) Запрос в SQL-форме (рис 4.40) Завершение выполнения проекта
  • Страницы:

    Использование элемента управления Data

    Элемент управления Data обеспечивает связь проекта Visual Basic с файлом базы данных. Следующие свойства элемента управления Data используются при реализации связи, табл. 4.1.

    Свойства элемента управления Data
    Свойство Пример значения свойства
    Connect Access
    DatabaseName A:\Studium.mdb ' имя базы данных
    RecordSource software ' имя таблицы

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

    Свойства элемента управления TextBox
    Свойство Пример значения свойства
    DataSource Data1 ' элемент управления Data с его номером
    DataField Hersteller ' имя поля таблицы базы данных. Замечание: для каждого элемента управления TextBox не забудьте установить свое значение этого свойства

    Практическая работа 21. Базы данных; элемент управления Data (считать таблицу в двумерный массив и вывести на экран в массив поля списка). Использование стандартного модуля

    Задание: создать таблицу базы данных, содержащую данные о 9 программных продуктах с полями: Hersteller - изготовитель, Typ - тип продукта, Preis - цена, Tendenz - тенденция, Anbieter - распространитель, Ort - местность, табл. 4.3:

    Software
    Коde Hersteler Typ Preis Tendenz Anbieter Ort
    1 Ahead Nero Burning 59 A Media Markt Berlin-Tegel
    2 Steinberg Maxima Studio 59 В Media Markt Koeln
    3 Norton Anti Virus 70 A Schaubandt Flensburg
    4 G Data Power Adress-manager 70 A Pro Markt Berlin
    5 Top Systems Win Zip 89 B Media Markt Stuttgart
    6 Alfons Lernwelt Deutsch 98 A Media Markt Berlin-NeuKoeln
    7 Microsoft Encarta 99 A Saturn Duesseldorf
    8 Cequadrat Picture it 99 A Schaubandt Isenhagen
    9 Corel Corel Draw 379 A US-Electronic Hilden

    Следует создать стандартный модуль для обеспечения использования переменных в (данном случае) в 2-х формах. Первую форму использовать для связи проекта с базой данных (использовать элементы управления Data и TextBox) и создания двумерного массива, соответствующего таблице базы данных. Вторую форму использовать для вывода двумерного массива на экран (в массив поля списка) и нахождения максимальной цены программного продукта.

    Последовательность действий:

  • Создать
  • модуль
  • на первой форме (рис.4.1): элементы управления Data и массив Text1(7) для вывода 7 полей таблицы на экран, 3 командные кнопки:
  • для процедуры построчного считывания записей таблицы в двумерный массив,
  • для процедуры разового считывания тех же данных в тот же массив,
  • для перехода ко второй форме,
  • на второй форме: массив List1 (9) для вывода данных двумерного массива на экран, элемент управления Label1, 2 командные кнопки для:
  • процедуры вывода двумерного массива на экран в массив поля списка,
  • процедуры нахождения максимальной цены продукта и вывода в поле Label1 результата,
  • присвоить значения свойствам элемента управления Data и свойствам элементов массива текстового поля (примеры даны в табл. 4.1: и табл. 4.2:),
  • описать переменные в области модуля и ввести код, данный ниже (пояснения даны под комментариями), стартовать проект
  • (рис 4.1) Доступ к данным; использование элемента управления Data, вид формы Form 1 (рис 4.2) Доступ к данным - Data, вид формы Form2
    (General) (Declarations)
    ' описание двумерного массива, соответствующего
    ' таблице software базы данных
    Public mass(9, 6) As Variant 
    Public i As Integer, j As Integer, k As Integer
    ' переменная-счетчик для работы с номерами записей
    ' таблицы
    Public n As Integer
    ' переменная для хранения максимальной цены продукта
    Public max As Integer

    Form1

    ' Последовательное считывание данных таблицы software
    ' в массив текстового поля. Щелчком на правой 
    ' кнопке элемента Data и последовательным 
    ' нажатием командной кнопки Command1 (Caption = Lesen1)
    ' присвоить текущему элементу массива 
    ' mass(n, j) текущее значение свойства Text 
    ' элементов массива текстового поля
    
    Private Sub Command1_Click() 
    mass (n, 1) = Text1(1): mass (n, 2) = Text1(2)
    mass (n, 3) = Text1(3): mass (n, 4) = Text1(4)
    mass (n, 5) = Text1(5): mass (n, 6) = Text1(6)
    n = n + 1 ' увеличить значение переменной-счeтчик на 1
    End Sub
    
    ' автоматическое считывание данных в массив
    ' (Caption = Lesen2)
    Private Sub Command2_Click()
    For n = 0 To 8 
    mass (n, 1) = Text1(1): mass (n, 2) = Text1(2)
    mass (n, 3) = Text1(3): mass (n, 4) = Text1(4)
    mass (n, 5) = Text1(5):mass (n, 6) = Text1(6)
    ' MoveNext - метод, обеспечивающий автоматический 
    ' переход к следующей записи
    Data1.Recordset.MoveNext 
    Next n
    End Sub
    
    ' Методы MoveFirst, MoveLast, MoveNext, MovePrevious 
    ' находят в указанном объекте Recordset соответствующую
    ' запись и делают еe текущей
    
    Private Sub Command3_Click()
    Unload Me
    Form2.Show
    End Sub

    Form2

    ' вывод данных двумерного массива на экран в 
    ' массив поля списка
    Private Sub Command1_Click()
    For i = 0 To 8
    For j = 1 To 6
    List1(i).List(j - 1) = mass (i, j)
    Next j, i
    End Sub
    
    ' нахождение максимальной цены продукта и вывод в
    ' поле метки результата
    Private Sub Command2_Click() 
    max = mass(0,3)
    For k = 1 To 8
    If mass (k, 3) > max Then max = mass (k, 3)
    Next k
    Label1.Caption = max
    End Sub

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

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

    Для работы с источниками данных используется иерархия объектов Microsoft Jet, табл. 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.

    Внутренний валовой продукт США
    # 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
    Таблица базы данных 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

    MSНFlexGrid и MSFlexGrid - элементы управления для отображения и оперирования данными в табличном формате

    Элемент управления MSFlexGrid, выводимый на форму при работах с базами данных, представляет собой cетку строк и столбцов. MSFlexGrid поддерживает следующие функции:

  • чтение данных, если элементу MSFlexGrid назначен элемент управления данными; связывание данных для чтения,
  • динамическая перестановка столбцов и строк; автоматическая перегруппировка данных при упорядочении столбцов,
  • адаптация к существующему программному коду для связанного элемента управления DataGrid,
  • управление помещением в ячейку текста/графики; перенос текста в ячейках.
  • Вывод MSFlexGrid на панель элементов управления: меню Проект (Project) $$\to$$ Компоненты (Components) $$\to$$ Microsoft FlexGrid 6.0.

    Свойство Rows таблицы, выводимой на форму при использовании MSFlexGrid, можно использовать для задания количества строк в таблице, а свойство Cols - для задания количества столбцов. На рис. 4.4 представлена сетка MSFlexGrid. В качестве первого индекса ячейки используется номер строки, в качестве второго - номер столбца. Например, ячейка в левом верхнем углу таблицы имеет адрес 0, 0. Чтобы поместить данные в ячейку таблицы MSFlexGrid, нужно использовать свойство TextMatrix и задать координаты ячейки.

    Пример 1: поместить слово "элемент" в ячейку (2, 1): MSFIexGridl.TextMatrix (2,1) = "элемент"

    Пример 2: ввести число 3000 в ячейку (5, 2): MSFIexGridl.TextMatrix (5,2) = 3000

    MSFlexGrid обеспечивает множество стандартных стилей форматирования ячеек. Если при работе нужно добавить новые строки в таблицу, то используется метод Addltem.

    MSHFIexGrid - Microsoft Hierarchical FlexGrid - иерархическая гибкая таблица поддерживает по сравнению с MSFIexGrid множество дополнительных функций:

  • ActiveX Data Binding - привязывание данных ActiveX, когда свойства DataSource и DataMember элемента управления связаны с поставщиком данных,
  • связывание через Data Binding Manager - Диспетчер связывания данных в Visual Basic,
  • привязывание непосредственно к сгруппированным и связанным наборам записей ADO ( ADO RecordSet ) из иерархии Command (Управление),
  • создание отображений сгруппированных и связанных наборов RecordSet.
  • Практическая работа 28. MSFIexGrid

  • Создать базу данных ACCESS с таблицами, например, student (см. табл. 4.7) и др, сохранить в файле stud.mdb; впоследствие это имя выбирается в стандартном диалоговом окне Open,
    Содержимое таблицы student базы данных
    Num Name Geschl Geb_dat Gruppe
    1012 Wolf M 20.08.76 Kp-3
    1013 Hase M 30.09.77 Kp-4
    1021 Weiss W 24.06.77 Kp-3
    1040 Kalb M 23.03.77 Kp-3
  • создать на форме объекты (см. рис. 4.4 и код, данный ниже):
  • MSFlexGrid (см. выше),
  • CommonDialоg: Проект $$\to$$ Компоненты $$\to$$ Управление $$\to$$ Microsoft CommonDialog Control,
  • CommandButton (Name = Command1),
  • Data (Name = Data1, Connect = Accеss),
  • ComboBox (Name = Combo1, Style = 0), см. 10.1,
  • TеxtBox (Name = Text1),
  • ввести код, данный ниже, пояснения даны под комментариями:
    Private Sub Command1_Click()
    Dim i As Integer
    ' очистить свойство объекта CommonDialog, содержащее 
    ' имя базы данных 
    CommonDialog1.FileName = ""
    ' стартовать CommonDialog 
    CommonDialog1.Action = 1
    ' выводится стандартное диалоговое окно Open; 
    ' нужно выбрать требуемую базу данных.
    
    ' связать объект Data1 с файлом базы данных, выбранным с
    ' помощью элемента управления CommonDialog1 
    Data1.DatabaseName = CommonDialog1.FileName 
    ' обновить содержимое элемента управления Data1 
    Data1.Refresh
    
    ' читать в цикле имена таблиц базы данных и занести
    ' их в ComboBox (AddItem)
    For i = 0 To Data1.Database.TableDefs.Count - 1
    ' свойство Count определяет количестко элементов 
    Combo1.AddItem (Data1.Database.TableDefs(i).Name)
    Next i
    ' после добавления имeн таблиц в ComboBox очистить теку-
    ' щее значение свойства Text 
    Combo1.Text = ""
    
    ' введeнный в текстовое поле строку SQL присвоить 
    ' свойству RecordSource элемента Data1 
    Data1.RecordSource = Text1.Text
    ' обновить содержимое Data1. Реализуется запрос, т.к 
    ' свойству RecordSource присвоено значение строки SQL
    Data1.Refresh
    
    ' оставшаяся часть кода может быть заменена
    ' следующим оператором присваивания: 
    ' MSFlexGrid1.DataSource = Data1 в Окне свойств. Эта
    ' часть кода нужна лишь для того чтобы пользователь мог
    ' освоить работу с ячейками MSFlexGrid. 
    ' Свойство MSFlexGrid1.Cols - характеризует количество 
    ' столбцов в сетке; Data1.Recordset.Fields.Count - количество 
    ' столбцов таблицы базы данных, к которой сделан 
    ' SQL-запрос
    MSFlexGrid1.Cols = Data1.Recordset.Fields.Count
    ' MSFlexGrid1.Rows - количество строк в сетке 
    ' установить равным 1
    MSFlexGrid1.Rows = 1
    
    ' в элементе управления MSFlexGrid1 доступ к строкам и 
    ' столбцам проводится начиная с ячейки (0,0),
    ' свойство TextMatrix(X, Y) позволяет получить доступ 
    ' к отдельным ячейкам таблицы 
    
    For i = 0 To Data1.Recordset.Fields.Count - 1
    ' занести название имeн полей таблицы базы данных в 
    ' первую строку MSFlexGrid1
    MSFlexGrid1.TextMatrix(0, i) = Data1.Recordset.Fields(i).Name
    Next i
    
    ' проверить, является ли запись в таблице (строка) по-
    ' следней; организовать цикл прохода по строкам 
    Do While Not Data1.Recordset.EOF
    ' увеличить количество строк в MSFlexGrid на единицу
    MSFlexGrid1.Rows = MSFlexGrid1.Rows + 1
    
    ' цикл переноса данных из Data1 в MSFlexGrid1
    For i = 0 To Data1.Recordset.Fields.Count - 1
    ' перенос данных данной строки (по полям). Если данные в
    ' ячейке Data1 имеются, то перенести их в 
    ' таблицу MSFlexGrid1
    If Not Data1.Recordset.Fields(i) = "" Then
    MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, i) = Data1.Recordset.Fields(i)
    End If
    ' конец цикла переноса данных из элемента управления Data1 
    ' в таблицу MSFlexGrid1 для одной строки
    Next i
    
    ' использовать метод MoveNext - переход к 
    ' следующей строке
    Data1.Recordset.MoveNext
    Loop
    End Sub
  • стартовать проект, ввести в текстовое поле SQL-строку (запрос) SELECT * FROM student, сделать щелчок на командной кнопке, в выведенном стандартном диалоговом окне Open выбрать базу данных stud.mdb. В таблицу MSFlexGrid выводятся результаты запроса. Одновременно в список элемента управления ComboBox выводятся имена всех имеющихся таблиц, рис 4.4(рис 4.4) MSFlexGrid
  • выбрать таблицу в списке ComboBox, изменить запрос - ввести новый запрос для другой таблицы (ввести этот запрос в текстовое поле), сделать щелчок на командной кнопке, наблюдать результат.
  • Репликация и синхронизация баз данных

    Реплицировать означает тиражировать. Если учреждение располагает сетью, тогда целесообразно иметь основную копию базы данных (главная реплика) в главном подразделении фирмы и несколько еe копий (реплик) в других помещениях/на других территориях. Пользователи баз данных на других территориях в процессе работы (например, в результате реализации/приобретения изделий, перечень которых содержит база данных) делают изменения таблиц в своих копиях (репликах). Позднее (периодически) каждый должен внести им сделанные изменения в главную реплику и получить информацию об изменениях, сделанных другими пользователями. Это процесс синхронизации - приведение репликационного набора в состояние, когда реплики одинаковы.

    Пусть имеется база данных sabi.mdb c несколькими таблицами . Превратим sabi.mdb в главную реплику. Создадим на дисковом устройстве С: каталог rep, который будем использовать для проекта. Сначала нужно просмотреть базу данных в приложении Visdata: меню Добавления $$\to$$ Визуальный менеджер данных (Visual Data Manager) $$\to$$ Файл $$\to$$ Открыть базу данных $$\to$$ Microsoft Access $$\to$$ в выведенном списке выбрать файл sabi.mdb. В окно приложения выводится список таблиц базы данных. Существуют также системные таблицы; для их вывода на экран использовать команду: Utility $$\to$$ Preferences $$\to$$ Include System Tables. Представляет особый интерес объект Properties - свойства исходной базы данных: Name = C:\ : sabi.mdb, Connect*,: .

    Практическая работа 29. Репликация и синхронизация баз данных

    Для приобретения навыков репликации и синхронизации нужно выполнить несколько этапов:

  • сделать ссылку на библиотеку Microsoft Jet and Replication Objects 2.1 Library (меню Проект $$\to$$ Ссылки $$\to$$ библиотека $$\to$$ OK) и библиотеку, обеспечивающую работу с DAO: Microsoft DAO 3,54 Objects Library,
  • создать главную реплику ( Command1_Click (), см. ниже):
  • открыть базу данных,
  • создать свойство Replicable и присвоить ему значение "Т",
  • cоздать копию главной реплики ( Command2_Click (), см. ниже):
  • открыть базу данных,
  • использовать метод MakeReplica,
  • внести изменения в главную реплику и еe копию:
  • внести изменение в 1-ой записи главной реплики и копии,
  • зафиксировать изменение значения поля s_Generation (см. ниже) при изменении содержимого таблиц; там появятся нули вместо единиц и соответствующая запись будет позднее скопирована при выполении процедуры синхронизации,
  • выполнение синхронизации - копирование изменений главной реплики в реплику и наоборот ( Command3_Click (), см. ниже):
  • открыть базу данных,
  • использовать метод Cynchronize объекта Database.
  • Последовательность действий:

  • ввести код процедур Command1_Click () и Command2_Click (), см. ниже,
  • стартовать первую процедуру (создание главной реплики),
  • после остановки выполнения проекта открыть базу данных (главную реплику) в приложении Visdata, найти добавленные поля каждой таблицы: в каждую таблицу главной реплики добавлены 3 поля:
  • s_Generation, идентифицирующее записи, которые были изменены Вами/сотрудниками учреждения. После изменения записей, содержимое поля меняется с 1 на 0 (сначала везде была 1) и в процессе синхронизации, т.е. позднее, пересылаются только записи, которым соответствует значение поля 0,
  • s_GUID, содержащее идентификатор каждой записи,
  • s_Lineage, хранящее количество изменений записи.
  • Пояснения: после создания главной реплики в главной реплике появились новые системные таблицы, появились дополнительные свойства главной реплики. Свойство Replicable (установлено в Т) означает, что для базы данных можно создавать реплики. После создания главной реплики появились новые свойства любой таблицы главной реплики.

  • стартовать вторую процедуру (создание реплики),
  • после остановки выполнения проекта просмотреть базу данных в приложении Visdata (в базе данных содержатся те же самые таблицы),
  • открыть таблицу MSysReplicas, содержащую информацию о каждом члене репликационного набора, где появилась вторая запись из-за создания реплики (ранее была только одна запись),
  • поочерeдно открыть базы данных (главную реплику и реплику) в любом приложении, предназначенном для работы с базами данных и сделать изменения в одной записи какой-либо таблицы. Наблюдать изменения поля s_Generation - появление чисел 0 вместо 1 после внесения изменений Вами/сотрудниками учреждения в записи таблиц главной реплики и реплики,
  • создать и стартовать процедуру Command3_Click (), см. код ниже,
  • после остановки выполнения проекта загрузить реплику в приложение Visdata, просмотреть содержимое соответствующей таблицы (в этой таблице появились изменения, сделанные ране в главной реплике) и значения поля s_Generation: в процессе синхронизации значение поля увеличивается на 1 при каждом изменении записи.

    В тех случаях, когда в разных репликах изменяется одна и та же запись несkолько раз, то в итоге в процессе синхронизации копируются данные той реплики, которая изменила запись большее число раз. В случае равенства числа изменений Microsoft Jet выбирает запись из таблицы с наименьшим значением ReplicaID,

  • cделать изменения в реплике 1 раз, в главной реплике - 2 раза. Сделать щелчок на третьей командной кнопке, затем проверить результат синхронизации.
  • Private Sub Command1_Click() ' создание главной реплики
    Dim dbHaupt As Database, replicaProp As Property
    ' открыть базу
    Set dbHaupt = OpenDatabase("C:\rep\sabi.mdb", True) 
    ' создать свойство Replicable
    Set replicaProp = dbHaupt.CreateProperty("Replicable", dbText, "T")
    dbHaupt.Properties.Append replicaProp ' добавить свойство
    ' свойству присвоить значение True
    dbHaupt.Properties("Replicable") = "T" 
    End Sub
    
    Private Sub Command2_Click() ' создание реплики
    Dim dbHaupt As Database
    ' открыть базу
    Set dbHaupt = OpenDatabase("C:\rep\sabi.mdb", True) 
    'создать новый объект репликационного набора
    dbHaupt.MakeReplica "C:\rep\sabicopy.mdb", "Replica of "  "dbHaupt"
    dbHaupt.Close
    End Sub
    
    Private Sub Command3_Click() ' процесс синхронизации
    Dim dbHaupt As Database
    ' открыть базу данных - главную реплику
    Set dbHaup = OpenDatabase("C:\rep\sabi.mdb", True) 
    ' копирование изменений 
    dbHaupt.Synchronize "C:\rep\sabicopy.mdb"
    End Sub

    ADO

    Общие сведения

    Модель ADO - ActiveX Data Objects разработанная корпорацией Microsoft представляет собой семейство объектов, используемых для работы с источниками данных.

    OLE DB - основа универсальной модели доступа к данным представляет собой набор интерфейсов COM, которые обеспечивают доступ программ к данным. Способ использования приложением функциональных возможностей ADO частично определяется наличием поставщика OLE DB для данных. ADO разработан для работы с OLE DB, если поставщик OLE DB недоступен, можно использовать ADO для непосредственного соединения с помощью драйвера ODBC.

    Наиболее простое средство реализации ADO в приложениях - использование элемента управления ADO Data.

    Когда ADO связывается с базой данных, работа происходит через сетевую библиотеку. Выбор сетевой библиотеки определяется поставщиком и конфигурацией системы.

    Объекты

  • Объект Connection - соединение позволяет приложениям установить связь с источником данных. После этого объект Connection можно употреблять для исполнения SQL-запросов, он может также использоваться объектами Command и Recordset. Для установления соединения с источником данных используется метод Open, для закрытия соединения - метод Close.

    Свойства объекта Connection:

  • ConnectionTimeout. Указывает время ожидания выполнения операции установки связи с базой данных в секундах. По истечению заданного интервала генерируется ошибка,
  • ConnectionString. Предоставляет информацию, необходимую для установки связи с базой данных,
  • CursorLocation. Указывает позицию курсора,
  • DefaultDatabase. Указывает базу данных, заданную для данного объекта Connection по умолчанию,
  • Mode. Определяет права доступа на запись и чтение данных. Присвоить значение этому свойству можно только до установки связи с источником данных. В случае с удаленными службами данных его значение должно быть adModeUnknown,
  • State. Возвращает текущее состояние связи - значение adStateClosed, adStateOpen, adStateExecuting, adStateConnecting.
  • Методы объекта Connection:

  • BeginTrans. Используется, чтобы начать транзакцию,
  • Cancel. Прекращает выполнение текущей асинхронной операции,
  • CommitTrans. Фиксирует все изменения в объекте Connection,
  • Execute. Выполняет команду, представленную в виде объекта Command. Формат обращения к этому объекту имеет вид:

    Connection.Еxecute CommandText, RecordsAffected, Options здесь: CommandText - это выражение SQL, имя таблицы, имя хранимой процедуры или иной текст команды. RecordsAffected возвращает количество записей, обработанных командой. В качестве значения параметра Options используют константу adExecuteSync, чтобы стартовать асинхронную операцию, или adFetchAsync, указывающее, что строки, остающиеся после заполнения буфера, должны возвращаться асинхронно,

  • Open. Устанавливает связь с источником данных. При использовании удаленных служб данных связь не устанавливается, пока не открыт набор записей Recordset. Формат обращения к методу Open:

    Сonnection.Open ConnectionString, UserID, Password, Option

    Аргументы UserID и Password задают соответственно учетную запись и пароль пользователя. Значение аргумента Option может быть установлено равным константе adAsyncConnect, чтобы установка связи происходила асинхронно. Все аргументы являются необязательными

    ,
  • OpenSchema. Возвращает информацию о схеме базы данных, например, о структуре таблицы,
  • RollbackTrans. Отменяет все изменения в текущем объекте Connection,
  • Объект Command.Объект Command используется для передачи команд в источник данных. Для источников данных типа SQL Server состоят из динамических команд SQL, подготовленных команд SQL или вызовов хранимых процедур (Хранимая процедура предствляет собой откомпилированное заранее семейство инструкций SQL и необязательных инструкций управления порядком выполнения, хранимое под некоторым именем и обрабатываемое как единое целое). Свойство Текст команды (CommandText) содержит саму команду, а метод Исполнить (Execute) ее стартует.

    Некоторые свойства:

  • ActiveConnection. Ассоциирует объект Command с объектом Connection,
  • CommandText. Является текстовой строкой, содержащей команду, которая должна быть выполнена, например, инструкция языка SQL SELECT: acmd.CommandText = "SELECT * FROM empl"
  • CommandTimeout. Указывает период времени в секундах, предоставленный команде на выполнение. Если значение данного поля равно 0, то время ожидания не ограничено. Значение по умолчанию - 30,
  • CommandType. Описывает тип команды,
  • Prepared. Является значением типа Boolean, указывающим, нужно ли перед выполнением команды ее скомпилировать,
  • State. Указывает текущее состояние объекта.

    Методы объекта Command. У объекта Command есть три метода. Метод Execute используется для старта команд. Если команда возвращает строки таблицы, ее результат должен быть присвоен объекту Recordset: Set ars = acmd.Execute ars - объект типа Recordset, acmd - объект типа Command Метод Cancel используется для остановки выполнения текущей команды. Метод CreateParametеr используется для создания нового объекта Parameter: Set Parameter = command.CreateParameter (Name, Type, Direction, Size, Value)

  • Коллекция. Parameters и объект Parameter Коллекция Parameters представляет все параметры или аргументы запроса или сохраненной процедуры. У каждого объекта Parameter есть коллекция Parameters. Свойства объекта Parameter:
  • Attributes. Описывает объект Parameter при помощи одной из следующих констант: adParamSigned - параметр принимает числовые значения со знаком, adParamNullable - параметр может принимать значение Null, adParamLong - объект может принимать значение двоичных или символьных данных очень большого размера через метод AppendChunk,
  • Direction. Указывает направленность параметра, то есть определяет, является объект Parameter входным или выходным, или изменяемым параметром, или результатом выполнения хранимой процедуры базы данных,
  • NumericScale. Является переменной типа Byte, указывающей количество десятичных знаков для представления значения числового параметра,
  • Size. Указывает максимальный размер параметра в байтах,
  • Type. Указывает тип объекта Parameter,
  • Value. Задает и возвращает значение объекта Parameter. Тип этого свойства - Variant.

    Методы объекта Parameter: имеется один метод AppendChunk. Используемый формат: object.AppendChunk Data, здесь Data - данные, добавляемые к значению свойства Value объекта Parameter. При первом вызове этого метода данные не добавляются, они переписываются вместо старых данных. При последующих вызовах данные добавляются к концу существующих. Этот метод используется для размещения в объекте Parameter большого количества текстовой или двоичной информации.

  • Объект Recordset. Представляет набор записей той или иной базы данных либо набор записей, являющийся результатом выполнения определенной команды. Объект Recordset позволяет преходить от одной записи к другой, редактировать и удалять записи. В модели ADO для объектов Recordset применяются четыре различные типа курсора:
  • динамический курсор. Позволяет произвольно перемещаться по записям объекта,
  • индексный курсор. Аналогичен динамическому, но запрещает доступ к записям, добавленным или удаленным другими пользователями,
  • статический курсор. Создает Объект Recordset, который допускает неограниченное перемещение по объекту, однако изменения, вставки и удаления записей, произведенные другими пользователями невидимы,
  • однонаправленный курсор. Идентичен статическому курсору с той разницей, что по записям объекта можно двигаться только вперед.

    Свойства объекта Recordset:

  • AbsolutePosition. Возвращает или устанавливает абсолютный номер текущей записи. (Число типа Long, нумерация записей ведется с 1). Может также возвращать одну из следующих констант:
  • AdPosBOF указывает, что достигнуто начало файла,
  • AdPosEOF указывает, что достигнут конец файла,
  • adPosUnknown указывает, что позиция текущей записи неизвестна,
  • BOF. Будучи установленным True, указывает, что курсор указывает на начальную запись набора Recordset,
  • Bookmark. Устанавливает или возвращает значение типа Variant, содержащее определенную позицию (положение текущей записи) в базе данных. С помощью закладки можно запомнить текущую позицию и впоследствии вернуться к ней,
  • CacheSize. Устанавливает или возвращает количество локально буферируемых записей. Например, если установить значение этого свойства равным 20, то при открытии объекта Recordset в локальную память будет скопировано 20 записей. Чтобы в уже находящихся в буфере записях отобразились изменения, произведенные другими пользователями, нужно использовать метод Resync,
  • CursorLocation. Устанавливает или возвращает размещение механизма курсора. Значение adUseServer указывает, что должен использоваться курсор, базирующийся на сервере. Значение adUseClient указывает, что курсор должен управляться локально,
  • CursorType. Устанавливает или возвращает тип курсора. Может принимать значения: adOpenForwardOnly (однонаправленный), adOpenKeyset (индексный), adOpenDynamic (динамический), adOpenStatic (статический),
  • EditMode. Возвращает режим обработки текущей записи,
  • EOF. Если значение - True, то курсор находится в конце набора записей Recordset,
  • Filter. Устанавливает или возвращает значение типа Variant, которое может содержать текстовую строку критерия отбора записей (например, "emp_Gender = "ж" OR emp_Salary > 8000" ), массив закладок или одну из констант. Для отмены действия условия отбора нужно присвоить этому свойству значение пустой строки "" или константу adFilterNone,
  • LockType. Устанавливает или возвращает тип блокировки, присущий данной записи,
  • MaxRecords. Ограничивает количество записей, предоставляемых по одному запросу,
  • PageSize. Позволяет разбить набор записей на логические страницы. Например, если вы хотите, чтобы на экране одновременно отображалось 20 записей, можно установить значение этого параметра равным 20. Можно пользоваться свойством AbsolutePage, для перехода на указанную страницу:
    ' задать 20 страниц и перейти на 3-ю
    ars.PageSize = 20 
    ars.AbsolutePage = 3
  • PageCount возвращает количество страниц в базе данных,
  • RecordCount. Возвращает количество записей в базе данных,
  • Sort. Позволяет сортировать объект Recordset по любому полю или набору полей. Сортировка доступна, если значение свойства CursorLocation равно adUseClient. С помощью ключевого слова ASCENDING или DESCENDING может быть указан порядок сортировки. Например: ars.sort = "emp_gender", Ascending
  • Source. Устанавливает и возвращает источник данных,
  • State. Возвращает информацию о текущем состоянии объекта,
  • Status. Возвращает сведения о текущей записи в виде комбинации констант (табл. 4.8):
    Сведения о текущей записи в виде комбинации констант
    Константа Описание
    adRecOK Запись была обновлена успешно
    adRecNew Запись только что создана
    adRecModified Запись была изменена
    adRecDeleted Запись была удалена
    adRecUnmodified Запись не была изменена
    adRecInvalid Запись не была сохранена, поскольку закладка неверна
    adRecMultipleChanges Запись не была сохранена, т.к. сохранение затронуло бы несколько записей
    adRecPendingChanges Запись не была сохранена по причинам, связанным с отложенной вставкой
    adRecCanceled Запись не была сохранена, т.к. операция была отменена
    adRecCantRelease Новая запись не была сохранена из-за блокирования записей
    adRecConcurrencyViolation Запись не была сохранена, т.к. применялась оптимистическая стратегия параллельного доступа к данным
    adRecIntegrityViolation Запись не была сохранена, т.к. пользователь нарушил условие непротиворечивости данных
    adRecMaxChangesExceeded Запись не была сохранена, т.к. было слишком много незаконченных изменений adRecObjectOpen Запись не была сохранена из-за конфликта с открытым объектом хранения
    adRecOutOfMemory Запись не была сохранена, т.к. у компьютера закончились ресурсы свободной памяти
    adRecPermissionDenied Запись не была сохранена из-за недостаточности полномочий пользователя
    adRecSchemaViolation Запись не была сохранена, т.к. она нарушает структуру базы данных
    adRecDBDeleted Запись уже удалена из источника данных
  • Методы объекта Recordset:

    AddNew. Добавляет новую запись. Дополнительно можно указать значения полей записи. При этом имена полей и их значений указываются с помощью функции Array:

    ars.AddNew Array ("emp_salary", "emp_gender"), Array (55000, "m" )

  • CancelBatch. Отменяет незавершенное пакетное обновление,
  • CancelUpdate. Отменяет незавершенные изменения,
  • Clone. Создает копию объекта Recordset со всеми сохраненными закладками,
  • Delete. Удаляет текущую запись,
  • Find - поиск. Синтаксис обращения:

    Find (criteria, SkipRows, searchDirection, start), здесь: criteria - допустимое выражение инструкции WHERE SQL (без самого ключевого слова WHERE ), например, "emp_gender = 'g""

    Ключевое слово Like может применяться для поиска похожих текстовых строк, например: ars.find ("emp_name Like 'F_*").

    Аргумент SkipRows указывает количество строк таблицы, которые необходимо пропустить, начиная с заданной позиции. Аргумент SearchDirection указывает направление поиска. С помощью аргумента start можно передать закладку, с которой нужно начинать поиск,

  • Move. Позволяет переместить текущую позицию курсора,
  • MoveFirst, MoveLast, MoveNext, MovePrevious. Методы позволяют установить текущую позицию на первую, последнюю, следующую и предыдущую соответственно,
  • Requiry. Обновляет данные в объекте Recordset, выполняя запрос повторно,
  • Resync. Обновляет данные в объекте Recordset, отображая изменения, произведенные другими пользователями,
  • Save. Сохраняет объект Recordset в виде файла. Если установлено какое-либо условие отбора, то сохраняются только записи, удовлетворяющие ему. Файл не закрывается до тех пор, пока не будет закрыт объект Recordset.

    Синтаксис: Recordset.Save FileName, PersistFormat, здесь PersistFormat указывает формат файла.

  • Supports. Указывает, обладает ли объект Recordset определенными функциональными возможностями,
  • Update. Сохраняет изменения текущей записи. При перемещении от одной записи к другой программное обеспечение ADO автоматически вызывает метод Update,
  • UpdateBatch. Сохраняет все пакетные изменения на диске.
  • Коллекция Fields и объект Field. У каждого объекта Recordset есть коллекция Fields, состоящая из объектов Field. Каждый объект Field представляет отдельное поле объекта Recordset. Объект Field содержит основную информацию о поле (значение, тип данных и размер). Каждый объект Field содержит коллекцию Properties.
  • Свойства объекта Field:

    ActualSize. Возвращает количество байт, хранящихся в поле,

  • Attributes. Описывает характеристики объекта. Используются некоторые константы, значение которых может принимать,
  • adFldUpdatable. Объект Field может быть обновлен,
  • adFldFixed. Объект Field содержит данные фиксированной длины,
  • adFldNullable. Объект Field может содержать значение Null,
  • adFldRowVersion. Объект Field содержит номер версии или отметку времени,
  • DefinedSize. Содержит максимальный размер объекта Field (в байтах),
  • Name. Содержит имя поля в базе данных или в команде выборки данных,
  • OriginalValue. Содержит значение объекта Field, присущее ему до измеения соответствующего поля,
  • Type. Возвращает константу, указывающую тип поля,
  • UnderLyingValue. Возвращает текущее значение поля, хранящееся в базе данных,
  • Value. Устанавливает или возвращает текущее значение поля.

    Методы объекта Field: у объекта Field есть два метода: AppendChunk и GetChunk, используемых для управления большими объемами двоичной или текстовой информации. Метод GetChunk используется для получения всей информации, хранящейся в объекте Field или ее части. С помощью метода AppendChunk можно добавить к полю новые данные.

  • Коллекция Properties и объект Propertу. У объектов Connection, Command, Recordset, Parameter и Field есть коллекция Properties, содержащая объекты Property. У объекта Property есть 4 свойства:
  • Name. Устанавливает или возвращает имя свойства,
  • Value. Устанавливает или возвращает значение свойства,
  • Attributes. Устанавливает или возвращает значение, равное комбинации констант: adPropNotSupported (поставщик не поддерживает это свойство), adPropRequired (значение этого свойства должно быть указано до инициализации источника данных), adPropOptional (значение этого свойства не обязательно указывать до инициализации источника данных ), adPropRead (свойство доступно для чтения), adPropWrite (свойство доступно для записи),
  • Type. Устанавливает или возвращает тип данных.
  • Коллекция Errors и объект Error. При возникновении ошибки поставщика данных, содержимое коллекции удаляется и в коллекцию помещается один или несколько новых объектов Error. Некоторые сообщения поставщика данных добавляются к коллекции Errors, не приостанавливая выполнения программы. При каждом действии, которое может вызвать ошибку, следует очищать коллекцию с помощью метода Clear. Ошибки ADO обрабатываются системой обработки Visual Basic.

    Свойства объекта Error:

  • Description. Возвращает строку с кратким описанием ошибки. Задается либо программным обеспечением ADO, либо поставщиком данных,
  • NativeError. Указывает код ошибки поставщика данных,
  • Number. Указывает номер, однозначно определяющий объект Error,
  • Source. Указывает имя объекта в котором произошла ошибка,
  • SQLState. Содержит код состояния SQL для данного объекта Error.
  • События, предусмотренные в модели ADO

  • CommitTransComplete. Происходит после выполнения транзакции объектом Connect,
  • ConnectComplete. Генерируется после связывания с базой данных,
  • EndOfRecordset. Происходит при попытке обратиться по адресу, находящемуся за пределами области данных,
  • ExecuteComplete. Активизируется после выполнения команды (метода Execute объектов Connection или Command или метода Open объекта Recordset ),
  • FetchComplete. Происходит, когда в результате выполнения продолжительной асинхронной операции были получены все записи в наборе записей,
  • FetchProgress. Aктивизируется при выполнении продолжительной асинхронной операции выборки записей, давая возможность отменить операцию,
  • FieldChangeComplete. Происходит после изменения одного или нескольких объектов Field методами Value или Update объекта Recordset,
  • InfoMessage. Генерируется при активизации какого-либо события объекта связи, если соответствующая операция прошла успешно, но поставщик данных пересылает дополнительную информацию,
  • MoveComplete. Происходит после изменения текущей позиции в наборе записей Recordset,
  • OnError. Происходит при возникновении какой-либо ошибки базы данных,
  • RecordChangeComplete. Активизируется при изменении хотя бы одной записи в объекте Recordset одним из методов: AddNew, CancelButton, CancelUpdate, Delete, Update или UpdateBatch,
  • RecordsetChangeComplete. Происходит после изменения набора записей методами Close, Filter, Open, Requery или Resync объекта Recordset,
  • RollbackTransComplete. Происходит после завершения метода RollBackTrans объекта Connection, отменяющего последнюю транзакцию,
  • WillChangeField. Происходит перед изменением одного или нескольких объектов Field методами Value или Update объекта Recordset,
  • WillChangeRecord. Происходит перед изменением одной или нескольких записей в объкте Recordset одним из методов: AddNew, CancelButton, CancelUpdate, Delete, Update или UpdateBatch,
  • WillChangeRecordset. Происходит перед изменением набора записей методами Close, Filter, Open, Requery или Resync объекта Recordset,
  • WillExecute. Происходит перед выполнением команды (метода Execute объектов Connection или Command или метода Open объекта Recordset ),
  • WillConnect. Происходит перед установкой связей с базой данных,
  • WillMove. Происходит перед изменением текущей структуры позиции в наборе записей Recordset.
  • Практическая работа 30. ADO

    30а. ADO: вывод данных в поле списка; добавление/удаление записей в базу данных из проекта

  • Создать на форме 5 полей списка ( lstName, lstVorname, lstVatersn, lstGebdat, lstNummer ),
  • создать ссылку на библиотеку: Проект $$\to$$ Информация (рис 4.5(рис 4.5) MSFlexGrid
  • создать на форме меню (рис. 4.6): Инструменты $$\to$$ Редактор меню, данные табл. 4.9 $$\to$$ OK,
    Данные, используемые при создании меню
    Имя Название
    mnuDob Добавить
    mnuUd Удалить
    mnuExit Выход
  • ввести код, данный ниже, пояснения даны под комментариями,
    (General) (Declarations) (формы)
    ' описание переменных как объектов подключения и 
    ' набора записей
    Private cn As adodb.Connection
    Private rs As adodb.Recordset
    (рис 4.6) Вид формы Form1
    Private Sub Form_Activate()
    ' переменная для хранения строки подключения к базе данных
    Dim cmd As String
    ' переменная для хранения SQL-запроса
    sql As String
    Dim cn As adodb.Connection 
    Dim rs As adodb.Recordset
    ' очистить списки
    lstName.Clear
    lstVorname.Clear
    lstVatersn.Clear
    lstGebdat.Clear
    lstNummer.Clear
    
    ' создать строку подключения. Подключение проводится с помощью
    ' провайдера OLEDB (иначе в строке нужно указать другого провайдера).
    ' Следующий параметр (см. строку программы) определяет имя базы данных.
    ' Строка кода выделяется в отдельную функцию, что позволяет реализовать работу с 
    ' различными источниками данных. Такой функции можно передать параметр.
    cmd = "Provider=Microsoft.Jet.OLEDB.3.51;Persist Security _
    Info=False;Data Source=A:\db1.mdb"
    ' установить соединение с базой данных
    Set cn = New adodb.Connection 
    cn.ConnectionString = cmd
    cn.Open
    ' создать запрос
    sql = "select * from Таble1" 
    
    ' открыть набор записей. Открывается объект Recordset, ему нужно передать
    ' SQL-запрос (sql = "select * from Table1"), Set rs = New..... Далее
    ' набор открывается командой rs.Open sql, cn,adOpenDynamic, adLOckOPtimistic
    ' параметр sgl хранит SQL-запрос, второй параметр означает, что для 
    'подключения к базе нужно использовать объект cn, следующий параметр
    ' определяет тип курсора (табл. 4.10)
    Типы курсоров
    Тип курсора Описание
    ad OpenForwardOnly Лишь для перебора записей в одном направлении
    adOpenKeyset Для большого набора записей
    adOpenDynamic Позволяет отслеживать изменения, вносимые другими пользователями в набор записей
    adOpenStatic Для небольших наборов

    Последний параметр определяет тип доступа к набору записей (табл. 4.11)

    Тип блокировки
    Тип блокировки Описание
    ad LockReadOnly Использовать, если не нужно добавлять, обновлять или удалять записи
    adLockPessimistic Запись блокируется в начале редактирования до его завершения или перехода к следующей записи
    adLockOptimistic Включается при вызове метода Update для записи. Запись временно блокируется (на время сохранения изменений в базе)
    Set rs = New adodb.Recordset 
    rs.Open sql, cn, adOpenDynamic, adLockOptimistic
    Do While Not rs.EOF
    ' включить данные в каждый список
    lstName.AddItem rs("Name")
    lstVorname.AddItem rs("Vorname")
    lstVatersn.AddItem rs("Vatersn")
    lstGebdat.AddItem rs("Gebdat")
    lstNummer.AddItem rs ("Nummer")
    rs.MoveNext ' перейти к следующей записи
    Loop
    ' закрыть набор записей и очистить объектную переменную
    rs.Close
    Set rs = Nothing
    ' закрыть подключение и уничтожить объект подключения
    cn.Close: Set cn = Nothing
    End Sub
    
    Private Sub mnuDob_Click()
    ' показать форму "Добавление"
    frmDob.Show
    End Sub
    
    Private Sub mnuExit_Click()
    Dim v As Integer ' код возврата
    ' проверка, хочет ли пользователь закончить 
    ' выполнение проекта
    v = MsgBox("Exit ?", vbYesNo + vbQuestion, " Exit ?")
    ' число 6 соответствует нажатой кнопке Yes
    If v = 6 Then End 
    End Sub
    
    Private Sub mnuUd_Click()
    ' показать форму "Удаление"
    frmUd.Show
    End Sub
  • добавить новую форму для добавления записей в базу данных, на форме создать 6 элементов управления Label (значения свойств Caption даны на рис 4.7(рис 4.7) Вид формы Добавление записи
  • ввести код, данный ниже:
    (General) (Declarations)
    Private cn As adodb.Connection 
    Private rs As adodb.Recordset
    
    Private Sub Command1_Сlick()
    Dim rc As String 'код возврата
    Dim cmd As String, sql As String
    Dim cn As adodb.Connection, rs As adodb.Recordset
    ' создать строку подключения
    cmd = "Provider=Microsoft.Jet.OLEDB.3.51;Persist Security _
    Info=False;Data Source=A:\db1.mdb"
    ' установить соединение с базой данных
    Set cn = New adodb.Connection
    cn.ConnectionString = cmd
    cn.Open
    sql = "select * from Таble1" ' создать запрос
    Set rs = New adodb.Recordset ' открыть набор записей
    rs.Open sql, cn, adOpenDynamic, adLockOptimistic
    ' проверка, действительно ли пользователь
    ' хочет добавить данные
    rc = MsgBox("Add ?", vbYesNo + vbQuestion, "Add !")
    If rc = 6 Then
    ' процесс добавления данных 
    rs.AddNew: rs("Name") = txtName
    rs("Vorname") = txtVorname
    rs("Vatersn") = txtVatersn
    rs("Gebdat") = txtGebdat
    rs("Nummer") = txtNummer
    rs.Update
    End If
    rs.Close: Set rs = Nothing
    cn.Close
    Set cn = Nothing
    ' вывод сообщения о добавлении записи в БД
    MsgBox "Введенная вами запись добавлена в базу данных!",_ vbOKOnly, "Успешное добавление!"
    End Sub
    
    Private Sub Command2_Click()
    ' перейти на главную форму
    Unload Me: Form1.Show
    End Sub
  • добавить новую форму для работ по удалению записей из базы данных, создать на форме элементы управления Label, TextВox (Name= txtQuery), 2 элемента управления CommandButton, рис 4.8(рис 4.8) Вид формы Form3. Удаление записи
  • ввести код:
    Private cn As adodb.Connection
    Private rs As adodb.Recordset
    
    Private Sub Command1_Сlick()
    Dim rc As Integer 'код возврата
    Dim cmd As String, sql As String, cn As adodb.Connection
    Dim rs As adodb.Recordset
    ' создание SQL-запроса 
    sql = "SELECT Таble1.Nummer From Таble1 WHERE_
    (((Таble1.Nummer) = "_
    sql = sql  """"  txtQuery.Text  """" "));"
    ' создать строку подключения
    cmd = "Provider=Microsoft.Jet.OLEDB.3.51;Persist Security _
    Info=False;Data Source=A:\db1.mdb"
    ' установить соединение с базой данных
    Set cn = New adodb.Connection 
    cn.ConnectionString = cmd
    cn.Open ' открыть набор записей
    Set rs = New adodb.Recordset 
    rs.Open sql, cn, adOpenDynamic, adLockOptimistic
    ' проверка, действительно ли пользователь хочет 
    ' удалить данные
    rc = MsgBox("Yes or No ?", vbYesNo + vbQuestion, "Del)
    If rc = 6 Then
    rs.Delete ' процесс удаления
    MsgBox "Запись из базы данных удалена!", _
    vbInformation + vbOKOnly, "Удаление выполнено!"
    End If
    rs.Close:
    Set rs = Nothing
    cn.Close
    Set cn = Nothing
    End Sub
    
    Private Sub Command2_Click()
    Unload Me: Form1.Show
    End Sub
  • cтартовать проект, при этом выводятся данные в поля ListBox, ввести записи в базу данных из проекта, удалить записи.
  • 30b. Элемент управления ADO Data: вывод данных, добавление записей в таблицу из проекта, выполнение SQL-запроса, вывод результатов

    В данной работе рассматриваeтся:

  • создание базы данных (ado.mdb) с использованием Visual Data Manager,
  • вывод с помощью ADO Data Control данных таблицы saleslist, см. табл. 4.12, в текстовое поле,
  • выполнение SQL-запроса и вывод результатов.
  • Содержимое таблицы базы данных saleslist
    Name of product Price Quantity Total
    tvset 400 10 4000
    computer 300 2 6000
    Fax 200 20 4000
    telephone 150 20 3000
    scaner 700 15 10500

    Порядок выполнения:

  • создать на форме 4 элемента управления TextBox и 4 элемента управления Label (установить свойства Caption каждого элемента соответственно - Name of product, Price, Quantity, Total, рис 4.9(рис 4.9) Вид формы
  • cоздать базу данных с использованием Visual Data Manager, для этого:
  • выполнить команды: Модули $$\to$$ Visual Data Manager $$\to$$ File $$\to$$ New $$\to$$ Microsoft Access $$\to$$ Version 7.0 MDB, рис 4.10(рис 4.10) Visual Data Manager
  • ввести название: ado $$\to$$ сохранить,
  • в диалоговом окне Database Window сделать щелчок правой клавишей мыши. В появившемся меню выбрать New Table, рис 4.11(рис 4.11) Таблица Structure
  • задать имя таблицы: saleslist,
  • в диалоговом окне Table Structure сделать щелчок на кнопке Add field, рис 4.12(рис 4.12) Окно Add Field
  • в диалоговом окне Add Field в соответствующие поля ввести имена полей таблицы и типы данных, делать щелчок на кнопке ОК после каждого ввода:
    name_of_product, text,
    price currency
    quantity byte
    total currency
  • сделать щелчок на кнопке Close,
  • в диалоговом окне Table Structure сделать щелчок на кнопке Build the Table, которая стала активной, рис 4.13(рис 4.13) Database Window
  • в окне Database Window сделать двойной щелчок на поле saleslist, рис 4.14(рис 4.14) Построение таблицы saleslist
  • в диалоговом окне динамического набора Dynaset: saleslist сделать щелчок на кнопке Add, рис 4.15(рис 4.15) Построение таблицы, продолжение
  • вводить данные, после ввода каждой записи делать щелчок на кнопке Update, затем снова Add и т.д,
  • в окне Dynaset: saleslist сделать щелчок на кнопке Close; в окне Visdata выполнить команды: File $$\to$$ Exit. Создание базы данных ado.mdb завершено; файл базы данных сохраняется на дисковом устройстве в каталоге (system32),
  • для вывода элемента управления ADO Data выполнить следующее: Проект -> Компоненты -> Microsoft ADO Control 6.0 (OLEDB), рис 4.16(рис 4.16) Microsoft ADO Data Control
  • поместить элемент управления ADO Data на форму, рис 4.17(рис 4.17) Элемент управления на форме
  • присвоить значение свойства ConnectionString, рис 4.18(рис 4.18) Окно Property Pages
  • в диалоговом окне Property Pages сделать щелчок на кнопке Build, рис 4.19(рис 4.19) Поставщики услуг
  • в диалоговом окне Свойства связи с данными выбрать из списка поставщиков услуг Microsoft Jet 3.51 (или Microsoft Jet 4.0, если имеется в наличии), рис. 20. Эти поставщики используются при соединении источника данных, для которого не существует провайдера OLE DB, с другим источником данных OLE DB. Для баз данных Microsoft SQL Server используется Microsoft OLE DB Provider for SQL Server и т. д,
  • в диалоговом окне Свойства связи с данными сделать щелчок на кнопке Далее. Перейти к регистру Подключение, рис 4.20(рис 4.20) Регистр Подключение
  • найти в дереве файлов базу данных ado.mdb, выбрать в списке имя базы данных ado.mdb. Использовать имя пользователя - admin, рис. 4.20
  • сделать щелчок на кнопке Проверить подключение, если при этом выводится сообщение "Подключение успешно", то сделать щелчок на кнопке ОК,
  • в диалоговом окне Свойства связи с данными сделать щелчок на кнопке ОК; cтроится строка "Provider:, путь к базе данных" в окне Property Pages, рис. 4.18. В диалоговом окне Property Pages сделать щелчок на кнопке ОК,
  • присвоить значение свойству RecordSource для элемента данных ADO, рис 4.21(рис 4.21) Окно Property Pages
  • в диалоговом окне Property Pages выбрать для Command Type значение 2-adCmdTable, а для Table or Stored Procedure Name - saleslist $$\to$$ OK. Теперь установлена связь с базой данных ado.mdb и можно начать работу c элементами управления TextBox,
  • присвоить свойству DataSource каждого элемента управления TextBox значение Adodc1; а свойству DataField (см. также поля Label) каждого элемента управления TextBox (соответственно) - name_of_product, price, quantity, total,
  • стартовать проект, наблюдать выведенные данные, для этого перелистывать данные, используя стрелки > или >, см рис 4.22(рис 4.22) Вид формы после старта проекта
  • для добавления записей в таблицу базы данных выполнить следующее:
  • остановить выполнение проекта,
  • изменить значение свойства EOFAction объекта Adodc1 с 0 - adDoMoveLast на 2 - adDoAddNew,
  • стартовать проект и заполнить пустую запись, следующую после пятой записи, например, следующим образом: printer 800 10 8000.

    Замечание: для проверки (внесения записи) стартовать Visual Data Manager, двойным щелчком открыть и просмотреть таблицу. Переходить от одного поля TextBox к другому можно либо с помощью курсора мыши, либо с помощью клавиши Tab,

  • остановить выполнение проекта,
  • для выполнения SQL-запроса - для вывода в поле TextBox, например, наименования тех продуктов, стоимость которых равна 4000 (или больше 5000) выполнить следующее:
  • поместить на форму ещe один элемент управления (Adodc2) и еще один элемент управленияTextBox,
  • установить значение ConnectionString для элемента управления Adodc2 то же, что и у Adodc1 $$\to$$ OK,
  • при установке значения RecordSource в диалоговом окне Property Pages выбрать для Command Type значение 1 - adCmdText, а для Command Text (SQL) ввести запрос: Select * from saleslist where total=4000 (или total>5000)
  • установить свойства TextBox следующим образом: DataSource - Adodc2, DataField - name_of_product (название того поля, записи которого должны быть выведены в поле TextBox),
  • стартовать проект, наблюдать результаты, для этого перелистывать данные, используя стрелки > <.
  • 30c. ADO: вывод данных в MSFlexGrid; добавление записей в базу данных из проекта Visual Basic, поиск, удаление данных

    Рассматриваются следующие задачи:

  • создание базы данных с помощью редактора Visual Data Manager,
  • создание связи с базой данных с использованием ADO,
  • вывод таблицы в поле элемента управления MsFlexGrid (см. Form1),
  • добавление новых записей в таблицу базы данных (см. процедуру Command1_Click ()),
  • обновление записей в элементе управления MsFlexGrid (см. процедуру Command5_Click ()),
  • отбор записей по введенному критерию (см. процедуру Command2 ),
  • удаление записи (см. процедуру Command3_Click ()).
  • Последовательность действий:

  • создать базу данных с помощью Visual Data Manager:
  • Добавления $$\to$$ Visual Data Manager $$\to$$ File $$\to$$ New $$\to$$ Microsoft Access $$\to$$ Version7.0 MDB:, в открывшемся диалоговом окне ввести название базы данных (Inf.mdb) $$\to$$ OK,
  • в окне Database window сделать щелчок на правой кнопке мыши и выбрать New Table,
  • в поле Table name ввести имя таблицы (Clients). Чтобы ввести названия полей таблицы сделать щелчок на кнопке Add Field. В открывшемся диалоговом окне в поле Name ввести название поля $$\to$$ OK,
  • ввести следующие названия: Name, FirstName, Experience, Marital, Status, Age, Post -> Close. В диалоговом окне Table Structure появились названия полей таблицы,
  • сделать щелчок на кнопке Close. В окне Database window появилось название таблицы. Открыть ее двойным щелчком. Чтобы внести данные в таблицу, сделать щелчок на кнопке Add, после внесения - на кнопке Update (рис 4.23(рис 4.23) Cоздание таблицы

    Созданная таблица имеет вид (рис. 4.24):

    (рис 4.24) Содержание таблицы
  • сделать ссылку на библиотеку ADODB (Microsoft ActiveX Data Objects Library 2.1): Проект $$\to$$ Ссылки $$\to$$ Microsoft ActiveX Data Objects Library 2.1 - $$\to$$ OK,
  • создать на форме 4 элемента управления Command Вutton и элемент управления MsFlexGrid. Свойствам Caption элементов управления Command Вutton присвоить значения: Добавить, Поиск, Удалить, Выход, Обновить,
  • для добавления элемента управления MsFlexGrid выполнить следующее: Проект $$\to$$ Компоненты $$\to$$ Microsoft FlexGrid Control 6.0,
  • ввести код, данный ниже:
    ' описание переменных cn (соединение с базой данных)
    ' и rs (набор записей базы данных)
    Private cn As ADODB.Connection
    Private rs As ADODB.Recordset
    Private Sub Form_Load()
    ' cmd содержит адрес базы данных
    Dim cmd As String
    ' sql - SQL-запрос 
    Dim sql As String
    ' установить соединение с базой данных
    ' и открыть набор записей
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset
    
    cmd = "Provider=Microsoft.Jet.OLEDB.4.0;"  "Data Source="  _
    "C:\Program Files\Microsoft Visual Studio\"  "VB98\Inf.mdb"
    Set cn = New ADODB.Connection ' cоздать новое соединение:
    
    With cn
    ' свойству ConnectionString объекта cn присвоить 
    ' значение cmd
    .ConnectionString = cmd 
    .Open
    End With
    
    ' cоздать SQL запрос, открывающий всю таблицу Clients
    sql = "select * from Clients" 
    Set rs = New ADODB.Recordset 'создать новый набор записей:
    
    With rs
    ' oткрыть таблицу:
    .Open sql, cn, adOpenKeyset, adLockOptimistic
    End With
    
    ' данные вывести в поле элемента MSFlexGrid1: число 
    ' столбцов в MSFlexGrid' равно числу полей в таблице.
    MSFlexGrid1.Cols = rs.Fields.Count
    MSFlexGrid1.Rows = 1 ' число строк = 1
    ' вывести названия полей базы данных:
    For i = 0 To rs.Fields.Count - 1
    MSFlexGrid1.TextMatrix(0, i) = rs.Fields(i).Name
    Next I
    ' заполнить остальные строки:
    Do Until rs.EOF
    MSFlexGrid1.Rows = MSFlexGrid1.Rows + 1
    For i = 0 To rs.Fields.Count - 1
    If Not rs.Fields(i) = "" Then
    MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, i) = rs.Fields(i)
    End If
    Next i
    rs.MoveNext
    Loop
    rs.Close: Set rs = Nothing
    cn.Close: Set cn = Nothing
    End Sub
  • стартовать проект и наблюдать данные таблицы в (рис 4.25) Вид формы после старта проекта
  • ввести код процедуры Command1_Click(), которая будет добавлять записи в базу данных:
    Private Sub Command1_Click()
    ' описание массивов названий 
    Dim k(7) As Variant, z(7) As Variant 
    Dim cmd As String
    Dim sql As String
    Dim cn As ADODB.Connection: Dim rs As ADODB.Recordset
    
    cmd = "Provider=Microsoft.Jet.OLEDB.4.0;"  "Data Source="  _
    "C:\Program Files\Microsoft Visual Studio\"  "VB98\Inf.mdb"
    Set cn = New ADODB.Connection
    
    With cn
    .ConnectionString = cmd
    .Open
    End With
    
    sql = "select * from Clients "
    Set rs = New ADODB.Recordset
    rs.CursorType = adOpenDynamic
    
    With rs
    .Open sql, cn, adOpenKeyset, adLockOptimistic
    End With
    
    With rs
    .MoveLast
    Dim f As Field ' описание переменной f как объект поле
    ' в массиве k(t) запомнить названия всех полей
    For Each f In rs.Fields
    t = t + 1
    k(t) = f.Name
    ' в массив z(t) занести значения, 
    ' которые будут вводиться пользователем в таблицу
    z(t) = InputBox("Введите данные для занесения _
    в поле "  k(t), "Добавления")
    Next
    
    With rs
    ' добавить строку в таблицу
    .AddNew Array(k(1), k(2), k(3), k(4), k(5), k(6), k(7)), _
    Array(z(1), z(2), z(3), z(4), z(5), z(6), z(7))
    End With
    
    rs.Close: Set rs = Nothing
    cn.Close: Set cn = Nothing 
    End Sub
  • стартовать проект,
  • после щелчка на кнопке "Добавить" выводится окно ввода и пользователь должен ввести данные для занесения в таблицу, однако введeнные данные можно наблюдать лишь после обновления записей MSFlexGrid, см. код процедуры Command5_Click() "Обновить"
    Private Sub Command5_Click()
    Dim cmd As String: Dim sql As String
    Dim cn As ADODB.Connection: Dim rs As ADODB.Recordset
    cmd = "Provider=Microsoft.Jet.OLEDB.4.0;"  "Data Source="  _
    "C:\Program Files\Microsoft Visual Studio\"  "VB98\Inf.mdb"
    Set cn = New ADODB.Connection
    
    With cn
    .ConnectionString = cmd
    .Open
    End With
    
    sql = "select * from Clients "
    Set rs = New ADODB.Recordset
    
    With rs
    .Open sql, cn, adOpenKeyset, adLockOptimistic
    End With
    
    MSFlexGrid1.Cols = rs.Fields.Count
    MSFlexGrid1.Rows = 1
    For i = 0 To rs.Fields.Count - 1
    MSFlexGrid1.TextMatrix(0, i) = rs.Fields(i).Name
    Next i
    
    Do Until rs.EOF
    MSFlexGrid1.Rows = MSFlexGrid1.Rows + 1
    For i = 0 To rs.Fields.Count - 1
    If Not rs.Fields(i) = "" Then
    MSFleGrid1.TextMatrix(MSFlexGrid1.Rows - 1, i) = rs.Fields(i)
    End If
    Next i
    rs.MoveNext
    Loop
    
    rs.Close: Set rs = Nothing
    cn.Close: Set cn = Nothing
    End Sub
  • провести поиск в соответствии с некоторым критерием
    Private Sub Command2_Click()
    Dim cmd As String: Dim sql As String
    Dim cn As ADODB.Connection: Dim rs As ADODB.Recordset
    cmd = "Provider=Microsoft.Jet.OLEDB.4.0;"  "Data Source="  _
    "C:\Program Files\Microsoft Visual Studio\"  "VB98\Inf.mdb"
    Set cn = New ADODB.Connection
    
    With cn
    .ConnectionString = cmd
    .Open
    End With
    
    ' переменные Po и Kr служат для хранения критериев поиска:
    Po = InputBox("Введите названия полей, в которых будет_
    проводиться поиск")
    Kr = InputBox("Введите критерий, в соответствии с которым 
    будет проводиться поиск")
    ' ввести SQL запрос, в соответствии с которым выводятся 
    ' только те строки, которые соответствуют критерию
    sql = "Select * From Clients Where "  Po  Kr
    Set rs = New ADODB.Recordset
    
    With rs
    ' открыть только те строки таблицы, которые
    ' соответствуют критерию
    .Open sql, cn, adOpenKeyset, adLockOptimistic
    End With
    
    ' внести изменения в MSFlexGrid1:
    MSFlexGrid1.Cols = rs.Fields.Count
    MSFlexGrid1.Rows = 1
    For i = 0 To rs.Fields.Count - 1
    MSFlexGrid1.TextMatrix(0, i) = rs.Fields(i).Name
    Next i
    
    Do Until rs.EOF
    MSFlexGrid1.Rows = MSFlexGrid1.Rows + 1
    For i = 0 To rs.Fields.Count - 1
    If Not rs.Fields(i) = "" Then
    MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, i)_
    = rs.Fields(i)
    End If
    Next i
    rs.MoveNext
    Loop
    
    rs.Close: Set rs = Nothing
    cn.Close: Set cn = Nothing
    End Sub
  • стартовать проект и сделать щелчок на кнопке "Поиск". Ввести данные. Наблюдать за изменениями в MSFlexGrid1.
  • удаление выбранных записей
    Private Sub Command3_Click()
    Dim cmd As String: Dim sql As String
    Dim cn As ADODB.Connection: Dim rs As ADODB.Recordset
    cmd = "Provider=Microsoft.Jet.OLEDB.4.0;"  "Data Source=" _
    "C:\Program Files\Microsoft Visual Studio\"  "VB98\Inf.mdb"
    Set cn = New ADODB.Connection
    
    With cn
    .ConnectionString = cmd
    .Open
    End With
    
    sql = "select * from Clients"
    Set rs = New ADODB.Recordset
    
    With rs
    .Open sql, cn, adOpenKeyset, adLockOptimistic
    ' переменной fa присвоить значение - фамилию, которую
    ' хотим удалить вместе с соответствующей записью
    fa = InputBox("Введите фамилию для удаления _
    соответствующей записи")
    ' найти запись с такой фамилией и удалить ее
    
    Do Until .EOF
    If rs("FirstName") = fa Then
    rs.Delete adAffectCurrent
    End If
    .MoveNext
    Loop
    
    End With
    
    rs.Close: Set rs = Nothing
    cn.Close: Set cn = Nothing
    End Sub
  • стартовать проект, сделать щелчок на кнопке "Удалить", ввести требуемые данные, затем сделать щелчок на кнопке "Обновить", при этом удаляется выбранная запись.
    Private Sub Command4_Click()
    End
    End Sub
  • Практическая работа 31. Программное создание базы данных и работа с ней: создание файла, базы данных, двух таблиц, отношения, заполнение таблиц в диалоговом режиме, создание SQL-запроса и вывод результатов

    Задание: создать программным способом:

  • файл базы данных,
  • две таблицы (см. рис. 4.26, рис. 4.27, рис. 4.28), ключевые поля таблиц,
  • отношение,
  • возможность ввода записей таблиц в диалоговом режиме,
  • SQL-запрос для получения информации о данных клиентов (номер, фамилия, разряд, коэффициент тарифной сетки),
  • реализовать вывод результатов запроса.
  • (рис 4.26) Таблица 1(Таrif) (рис 4.27) Таблица 2 (Kunde) (рис 4.28) Таблица 2 (Kunde), режим конструктора (имя поля, тип данных)

    Пример выполнения практической работы 31.

  • Cоздать форму Form1, рис. 4.29 и меню, таблица 4.29">рис. 4.29 и меню, (рис 4.29) Форма Form1, внешний вид. Создано меню и указана последовательность выполнения задания
    Меню
    File Table Record Set Relation Query Exit
    Create Tab1 Record Set Table1 Create
    Query
    Open Tab1 Record Set Table2 Open
    Query

    Здесь:

  • Form $$\to$$ Create (рис. 4.31) - создать файл базы данных,
  • Table $$\to$$ Tab1 - создать структуру таблицы 1,
  • Table $$\to$$ Tab2 - создать структуру таблицы 2 (рис. 4.28),
  • RecordSet $$\to$$ RecordSetTable1 - в диалоговом режиме создать записи таблицы1 (рис. 4.33),
  • RecordSet $$\to$$ RecordSetTable2 - в диалоговом режиме создать записи таблицы2 (рис. 4.34),
  • Relation - создать отношение,
  • Query - CreateQuery - создать запрос,
  • Query - OpenQuery - открыть запрос (рис. 4.35),
  • Exit - завершить выполнение проекта,
  • создать Стандартный модуль и 5 форм, рис 4.30(рис 4.30) Окно проекта - составляющие проекта
  • ввести код формы Form1, пояснения даны под комментариями:
    Private Sub mnuCreate_Click() ' создать файл базы данных
    Load FrmCreate
    FrmCreate.Show
    End Sub
    
    Private Sub mnuCreateQuery_Click() ' создать запрос
    Call Query
    End Sub
    
    Private Sub mnuExit_Click() ' завершение работы проекта
    Call DatabaseClose
    Unload Form1
    MsgBox ("Завершение работы проекта!?"), vbCritical + vbOKOnly
    End
    End Sub
    
    Private Sub mnuOpen_Click() ' выбрать файл для его
    ' последующего открытия
    Load FrmOpen
    FrmOpen.Show
    End Sub
    
    Private Sub mnuOpenQuery_Click() ' открыть запрос
    Load FrmQuery
    FrmQuery.Show
    End Sub
    
    Private Sub mnuRecordSetTab1_Click() ' создать записи в
    ' таблице 1
    Load FrmTarif
    FrmTarif.Show
    End Sub
    
    Private Sub mnuRecordSetTab2_Click()' создать записи в
    ' таблице 2
    Load FrmKunde
    FrmKunde.Show
    End Sub
    
    Private Sub mnuRelation_Click() ' создать отношение
    Call Relation
    End Sub
    
    Private Sub mnuTab1_Click() ' создать структуру таблицы 1
    Call Tab1
    End Sub
    
    Private Sub mnuTab2_Click() ' создать структуру таблицы 2
    Call Tab2
    End Sub
  • ввести код модуля, данный ниже; пояснения даны под комментариями:
    (General) (Declarations)
    Public NewDB As Database
    Public NewWS As Workspace
    Public NewTbl As TableDef1
    Public NewTbl As TableDef2
    Public idx1 As Index
    Public idx2 As Index
    Public NewRel As Relation
    Public sqlquery As QueryDef
    Public NewRec As Recordset
    
    Public Sub Tab1() ' создание таблицы 1
    Set NewTbl1 = NewDB.CreateTableDef("Tarif")
    
    Set f1 = NewTbl1.CreateField()
    Set f2 = NewTbl1.CreateField() 
    
    f1.Name = "Razrjad" ' имя поля
    f1.Type = dbInteger ' тип данных
    f2.Name = "Koeffcnt"
    f2.Type = dbSingle
    NewTbl1.Fields.Append f1
    NewTbl1.Fields.Append f2
    
    Set idx1 = NewTbl1.CreateIndex("TarifIndex") ' создание индекса
    Idx1.Primary = True
    Set f1 = idx1.CreateField("Razrjad") ' создание индексного поля
    ' (используется метод объета idx)
    idx1.Fields.Append f1
    NewTbl1.Indexes.Append idx1
    NewDB.TableDefs.Append NewTbl1
    
    MsgBox ("Создана структура таблицы Tarif"), vbInformation +_
    vbOKOnly
    End Sub
    
    Public Sub Tab2() ' создание таблицы 2
    Set NewTbl2 = NewDB.CreateTableDef("Kunde")
    
    ' создание полей таблицы
    Set f3 = NewTbl2.CreateField()
    Set f4 = NewTbl2.CreateField()
    Set f6 = NewTbl2.CreateField()
    
    ' присваивание имeн полям и типов данным
    f3.Name = "Tabnumber"
    f3.Type = dbInteger
    f4.Name = "Nam"
    f4.Type = dbText
    f4.Size = 20
    f4.AllowZeroLength = True
    ' здесь позднее (см. Public Sub Relation) будет создано 
    ' зависимое поле (f5) отношения
    f6.Name = "Razrjad"
    f6.Type = dbInteger
    
    ' добавление полей в таблицу
    NewTbl2.Fields.Append f3
    NewTbl2.Fields.Append f4
    NewTbl2.Fields.Append f6
    
    ' создание индекса
    Set idx2 = NewTbl2.CreateIndex("KundeIndex")
    ' указание того, что главный индекс существует
    idx2.Primary = True
    ' создание индексного поля
    Set f3 = idx2.CreateField("Razrjad")
    Idx2.Fields.Append f3
    NewTbl2.Indexes.Append idx2
    NewDB.TableDefs.Append NewTbl2
    
    MsgBox ("Создана структура таблицы Kunde !"), vbOKOnly +_
    vbInformation
    End Sub
    
    Public Sub Relation() ' создание отношения
    Set NewRel = NewDB.CreateRelation("RelKunde") ' используется
    ' метод Создать отношение объекта База данных
    ' указание главной таблицы в отношении
    NewRel.Table = "Tarif"
    ' указание зависимой таблицы в отношении
    NewRel.ForeignTable = "Kunde"
    
    ' создание зависимого поля в отношении
    Set f5 = NewRel.CreateField("Razrjad")
    ' указание имени зависмого поля, по которому 
    ' строится отношение
    f5.ForeignName = "Razrjad"
    NewRel.Fields.Append f5
    ' добавление отношения в базу данных
    NewDB.Relations.Append NewRel
    
    MsgBox ("Отношение создано!"), vbOKOnly + vbInformation
    End Sub
    
    Public Sub Query() ' создание запроса
    Set sqlquery = NewDB.CreateQueryDef("sql1")
    
    ' указание того, что требуется выбрать в запросе,
    ' из каких таблиц провести выбор и формулировка 
    ' cоответствующих условий 
    
    sqlquery.SQL = "SELECT Kunde.Tabnumber, Kunde.Nam, _
    Kunde.Razrjad, Tarif.Razrjad, Tarif.Koeffcnt _
    FROM Tarif INNER JOIN Kunde ON Tarif.Razrjad = Kunde.Razrjad _
    WHERE Kunde.Tabnumber = 2;"
    MsgBox (" SQL-запрос введeнi!"), vbOKOnly + vbInformation
    End Sub
    
    Public Sub CreateFile() ' создание файла базы данных
    Set NewWS = DBEngine.Workspaces(0)
    Set NewDB = NewWS.CreateDatabase(FrmCreate.txtPath.Text,_ dbLangCyrillic)
    MsgBox (""Файл в формате mdb создан!"), vbInformation
    Unload FrmCreate
    End Sub
    
    Public Sub DatabaseClose() 
    NewWS.Close
    Set NewWC = Nothing
    End Sub
    
    Sub Main() ' начало проекта
    resp = MsgBox("Здравствуйте! Программное создание базы_ данных и работа с ней. Выберите ДА или НЕТ!", vbYesNo, " ")
    If resp = vbYes Then
    MsgBox "Сделайте щелчок на кнопке ОК для продолжения диалога!"
    Load Form1
    Form1.Show
    End If
    End Sub
  • на форме (рис 4.31) Форма FrmCreate (drvDrive, dirDirect, txtPaht)
    Private Sub Cancel_Click()
    Unload Me
    End Sub
    
    Private Sub Create_Click()
    Call CreateFile
    End Sub
    
    Private Sub dirDirect_Change()
    filFile.Path = dirDirect.Path
    End Sub
    
    Private Sub drvDrive_Change()
    dirDirect.Path = drvDrive.Drive
    End Sub
    
    Private Sub Path_Click() ' вывод пути и имени файла в
    ' поле txtPath 
    If drvDrive.Drive = "a:" Then
    dirDirect.Path = "a:\"
    txtPath.Text = dirDirect.Path + filFile.FileName
    Else
    txtPath.Text = dirDirect.Path + "\" + filFile.FileName
    End If
    End Sub
  • на форме FrmOpen, рис 4.32(рис 4.32) FrmOpen (drvDrive, dirDirect, txtPaht)
  • Private Sub Cancel_Click()
    Unload Me
    End Sub
    
    Private Sub Com1_Click() ' пометить требуемый файл и 
    ' перейти к Form1
    MsgBox ("Файл:" + FrmOpen.txtPath.Text), vbInformation
    FrmOpen.Hide
    End Sub
    
    Private Sub dirDirect_Change()
    filFile.Path = dirDirect.Path
    End Sub
    
    Private Sub drvDrive_Change()
    dirDirect.Path = drvDrive.Drive
    End Sub
    
    Private Sub filFile_Click()
    If Right(dirDirect.Path, 1) = "\" Then
    txtPath = dirDirect.Path + filFile.FileName
    Exit Sub
    Else
    txtPath.Text = dirDirect.Path + "\" + filFile.FileName
    End If
    End Sub
  • на форме FrmTarif, рис. 4.33, создать требуемые объекты и ввести код, данный ниже:
    Private Sub Cancel_Click() '
    Unload Me
    End Sub
    
    Private Sub Com1_Click() ' добавить
    ' открывает буфер для очередной записи в таблице
    datTarif.Recordset.AddNew
    End Sub
    
    Private Sub Com2_Click() ' обновить
    ' сбрасывает содержимое буфера для того, чтобы
    ' изменения были зафиксированы в записи
    datTarif.UpdateRecord
    End Sub
    
    Private Sub Com3_Click() ' выход
    Unload Me
    End Sub
    
    Private Sub Com4_Click() ' удалить
    ' уничтожает запись таблицы
    datTarif.Recordset.Delete
    End Sub
    
    Private Sub Com5_Click() ' восстановить
    ' если изменено содержимое записи, но ещё не обновлено,
    ' то восстановится предыдущее значение поля
    datTarif.UpdateControls
    End Sub
    
    Private Sub Com6_Click() ' вперёд
    datTarif.Recordset.MoveNext
    If datTarif.Recordset.EOF Then
    MsgBox "Конец таблицы!", vbOKOnly + vbInformation, " "
    datTarif.Recordset.MoveLast
    End If
    End Sub
    
    Private Sub Com7_Click() ' назад
    datTarif.Recordset.MovePrevious
    If datTarif.Recordset.BOF Then
    MsgBox "Hачало таблицы!", vbOKOnly + vbInformation, " "
    datTarif.Recordset.MoveFirst
    End If
    End Sub
    
    Private Sub Com8_Click() ' к первой записи
    datTarif.Recordset.MoveFirst
    End Sub
    
    Private Sub Com9_Click() ' к последней записи
    datTarif.Recordset.MoveLast
    End Sub
    
    Private Sub Exit_Click() ' выход
    Unload Me
    End Sub
    
    Private Sub Form_Load()
    Set NewDB = Worspaces(0).OpenDatabase(FrmOpen.txtPath.Text)
    
    ' установка свойств элементов управленя Data и TextBox
    datTarif.DatabaseName = FrmOpen.txtPath.Text
    datTarif.RecordSource = "Tarif"
    
    ' txtRazrjad.DataSource = "datTarif" ' можно испоьзовать окно 
    ' свойств
    ' txtKoeffcnt.DataSource = "datTarif"
    
    txtRazrjad.DataField = "Razrjad"
    txtKoeffcnt.DataField = "Koeffcnt"
    End Sub
    (рис 4.33) Форма FrmTarif
  • на форме FrmKunde, рис. 4.34, создать требуемые объекты и ввести код, данный ниже:
    Private Sub Cancel_Click()
    Unload Me
    End Sub
    
    Private Sub Com1_Click() ' добавить
    datKunde.Recordset.AddNew
    End Sub
    
    Private Sub Com2_Click() ' обновить
    datKunde.UpdateRecord
    End Sub
    
    Private Sub Com3_Click() ' выход
    Unload Me
    End Sub
    
    Private Sub Com4_Click() ' удалить
    datKunde.Recordset.Delete
    End Sub
    
    Private Sub Com5_Click() ' восстановить
    datKunde.UpdateControls
    End Sub
    
    Private Sub Com6_Click() ' вперeд (к следующей записи)
    datKunde.Recordset.MoveNext
    If datKunde.Recordset.EOF Then
    MsgBox "Конец таблицы!", vbOKOnly + vbInformation, " "
    datKunde.Recordset.MoveLast
    End If
    End Sub
    
    Private Sub Com7_Click() ' назад (к предыдущей записи)
    datKunde.Recordset.MovePrevious
    If datKunde.Recordset.BOF Then
    MsgBox "Начало таблицы!", vbOKOnly + vbInformation, " "
    datKunde.Recordset.MoveFirst
    End If
    End Sub
    
    Private Sub Com8_Click() ' в начало таблицы
    datKunde.Recordset.MoveFirst
    End Sub
    
    Private Sub Com9_Click() ' в конец таблицы
    datKunde.Recordset.MoveLast
    End Sub
    
    Private Sub Exit_Click() ' выход
    Unload Me
    End Sub
    
    Private Sub Form_Load()
    Set NewDB = Worspaces(0).OpenDatabase(FrmOpen.txtPath.Text)
    
    ' yстановка свойств элементов управления Data иTextBox
    datKunde.DatabaseName = FrmOpen.txtPath.Text
    datKunde.RecordSource = "Kunde"
    
    ' txtTabnumber.DataSource = "datKunde" ' можно
    ' использовать окно свойств
    ' txtNam.DataSource = "datKunde"
    ' txtRazrjad.DataSource = "datKunde"
    
    txtRazrjad.DataField = "Razrjad"
    txtNam.DataField = "Nam"
    txtTabnumber.DataField = "Tabnumber"
    End Sub
    (рис 4.34) Форма FrmKunde
  • на форме FrmQuery, рис. 4.35, создать требуемые объекты и ввести код, данный ниже:
    Private Sub Cancel_Click()
    Unload Me
    End Sub
    
    Private Sub Com1_Click() ' к первой записи
    NewRec.MoveFirst
    Call showfields
    End Sub
    
    Private Sub Com2_Click() ' к последней записи
    NewRec.MoveLast
    Call showfields
    End Sub
    
    Private Sub Com3_Click() ' к следующей записи
    NewRec.MoveNext
    ' если достигнут конец таблицы, то выдаeтся 
    ' соответствующее сообщение и проводится переход к 
    ' последней записи
    If NewRec.EOF Then
    MsgBox "Kонец таблицы!", vbOKOnly + vbInformation, " "
    NewRec.MoveLast
    End If
    Call showfields
    End Sub
    
    Private Sub Com4_Click() ' к предыдущей записи таблицы
    NewRec.MovePrevious
    ' если достигнуто начало таблицы, то выдаeтся 
    ' соответствующее сообщение и проводится переход
    ' к первой записи
    If NewRec.BOF Then
    MsgBox "Hачало таблицы!", vbOKOnly + vbInformation, " "
    NewRec.MoveFirst
    End If
    Call showfields
    End Sub
    
    Private Sub Exit_Click()
    NewDB.Close
    Set NewDB = Nothing
    Unload Me
    End Sub
    
    Private Sub Form_Load()
    Set NewWS = DBEngine.Workspaces(0)
    Set NewDB = NewWS.OpenDatabase(FrmOpen.txtPath.Text)
    
    ' указатель на набор данных создаeтся с помощью метода 
    ' Recordset объекта Database. Синтаксис:
    ' Set RecordSet = Database.OpenRecordSet ("имя_таблицы или
    ' SQL-запроса, из которых берут данные", dbName), здесь 
    ' dbName - константа, которая определяет тип размещения
    ' данных. В основном используется dbname = dbOpenDynaset
    ' - размещение данных в виде динамического набора, 
    ' открывающего полный доступ к таблицам: перемещение, 
    ' индексирование, редактировние и т.д.
    Set NewRec = NewDB.OpenRecordset("sql1", dbOpenDynaset)
    Call showfields
    End Sub
    
    Private Sub showfields()
    ' используемый синтаксис: NewRec(name), где NewRec - 
    ' указатель на объект Recordset, name - имя поля
    txtTabnumber.Text = NewRec("Tabnumber")
    txtName.Text = NewRec("Nam")
    txtRazrjad.Text = NewRec("Tarif.Razrjad")
    txtKoeffcnt.Text = NewRec("Koeffcnt")
    End Sub
    (рис 4.35) Форма FrmQuery
  • стартовать проект, рис. 4.36. Последовательность действий пользователя дана на форме Form1 (рис. 4.29). На рис. 4.37 даны результаты запроса (см. также рис. 4.35 - форма FrmQuery ). На рис. 4.38 запрос представлен на бланке запроса, на рис. 4.39 запрос представлен в SQL -форме. Эти данные взяты из файла базы данных (см. регистр Запрос базы данных),
  • остановить выполнение проекта (рис. 4.38). Использовать кнопку Exit формы (рис 4.36) Старт проекта (рис 4.37) Результаты запроса (рис 4.38) Запрос на бланке запроса (рис 4.39) Запрос в SQL-форме (рис 4.40) Завершение выполнения проекта
  • Вернуться к учебному плану