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

Базы данных

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

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

  1. создание базы данных с помощью редактора Visual Data Manager,
  2. создание связи с базой данных с использованием ADO,
  3. вывод таблицы в поле элемента управления MsFlexGrid (см. Form1),
  4. добавление новых записей в таблицу базы данных (см. процедуру Command1_Click ()),
  5. обновление записей в элементе управления MsFlexGrid (см. процедуру Command5_Click ()),
  6. отбор записей по введенному критерию (см. процедуру Command2 ),
  7. удаление записи (см. процедуру 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) После того, как заполнили таблицу, закрыть все окна, кроме окна проекта,
    Cоздание таблицы

    Рис. 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
  • стартовать проект и наблюдать данные таблицы в MSFlexGrid1, рис. 4.25
    Вид формы после старта проекта

    увеличить изображение
    Рис. 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
Константин Новков
Константин Новков

Лекция 3: 2

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

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

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