Элемент управления Data обеспечивает связь проекта Visual Basic с файлом базы данных. Следующие свойства элемента управления Data используются при реализации связи, табл. 4.1.
| Свойство | Пример значения свойства |
| Connect | Access |
| A:\Studium.mdb ' имя базы данных | |
| RecordSource | software ' имя таблицы |
Для отображения/редактирования данных в простейшем случае может быть использовано текстовое поле, поле списка и т.д., при этом используются их свойства, данные в табл. 4.2:
| Свойство | Пример значения свойства |
| DataSource | Data1 ' элемент управления Data с его номером |
| Hersteller ' имя поля таблицы базы данных. Замечание: для каждого элемента управления TextBox не забудьте установить свое значение этого свойства |
Задание: создать таблицу базы данных, содержащую данные о 9 программных продуктах с полями: Hersteller - изготовитель, Typ - тип продукта, Preis - цена, Tendenz - тенденция, Anbieter - распространитель, Ort - местность, табл. 4.3:
| Коde | Hersteler | Typ | Preis | Tendenz | Anbieter | Ort |
| 1 | Ahead | Nero |
59 | A | Media Markt | Berlin-Tegel |
| 2 | Steinberg | Maxima Studio | 59 | В | Media Markt | Koeln |
| 3 | Norton | 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 | Duesseldorf | |
| 8 | Cequadrat | Picture it | 99 | A | Schaubandt | Isenhagen |
| 9 | Corel | Corel Draw | 379 | A | US-Electronic | Hilden |
Следует создать стандартный модуль для обеспечения использования переменных в (данном случае) в 2-х формах. Первую форму использовать для связи проекта с базой данных (использовать элементы управления Data и TextBox) и создания двумерного массива, соответствующего таблице базы данных. Вторую форму использовать для вывода двумерного массива на экран (в массив поля списка) и нахождения максимальной цены программного продукта.
Последовательность действий:
List1 (9) для вывода данных двумерного массива на экран, элемент управления Label1, 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
Объекты доступа к данным - это объекты, представляющие структуру базы данных и её содержимое. Программист может использовать
Для работы с источниками данных используется иерархия объектов Microsoft Jet, табл. 4.4:
| DBEngine | |
| Properties | |
| TableDef... QueryDef ...Recordset ...Relation | |
| Field... Index | Field ...Field |
DBEngine - объект самого верхнего уровня в иерархии объектов Microsoft Jet обеспечивает связь приложения с СУБД Microsoft DBEngine имеет свойства и методы и содержит коллекции - объекты одного типа,Properties содержит свойства объекта DBEngine,Workspaces . Объект Workspace - это рабочее пространство, которое определяет именованный сеанс работы пользователя. Коллекция Workspaces содержит все определeнные рабочие пространства. Workspaсe имеет свойства (Name - имя рабочего пространства, UserName - имя пользователя, IsolateODBCTrans используется для контроля за числом соединений ODBC, установленных с базой данных во время сеанса) и 2 метода - CreateDatabase и OpenDatabase,Databases содержит все объекты Database - базы данных, открытые для данного объекта Workspace . Объект Database создается каждый раз, когда пользователь открывает базу данных с помощью метода OpenDatabase. Содержит несколько свойств и методов (Name, Connect, : Connection ), например, метод OpenRecordset служит для доступа к таблицам баз данных,Recordset - объект, содержащий наборы записей; имеется большое количество свойств и методов, доступность которых зависит от того, в каком рабочем пространстве был создан объект Recordset - Microsoft Jet или ODBCDirect.
Технология ODBCDirect - модель доступа к данным ODBC. Частью этой модели доступа является объект Connection. Эта модель даeт возможность программисту обращаться к источникам данных ODBC напрямую, не используя объекты данных Microsoft Jet.Relation - содержит информацию об установленных между таблицами отношениях (указание полей и типа связей),Properties, имеет несколько свойств и методов,Объекты используются в определeнном порядке. Сначала с помощью ключевого слова Set формируется , затем Database, Recordset и другие объекты. Для открытия базы данных используется метод OpenDatabase объекта , а для открытия таблицы - метод OpenRecordset объекта Database. Для получения доступа к определенному количеству строк таблицы используется метод GetRows(numrows) объекта Recordset, numrows - это число строк. Строки/столбцы нумеруются, начиная с 0.
Следует сделать ссылку на библиотеку объектов доступа к данным: Проект $$\to$$ Информация $$\to$$ Microsoft
| # | year | incomepercapital | structures | goods | services | ||
| 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
В разделе 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) Свойства рабочего пространства
Объекты, содержащие наборы записей, представляют наибольший интерес. Ввести код, данный ниже, пояснения даны под комментариями к коду, затем стартовать проект, сделать щелчок на командной кнопке, проанализировать выведенные данные.
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
При работе с базами данных проекте Visual Basic часто возникает необходимость создать инструкцию SQL. Простейший способ создания инструкции SQL заключается в создании запроса на бланке запроса, последующем использовании меню Вид $$\to$$ режим SQL ; копировании создаваемой автоматически в выводимом окне инструкции SQL и вставке еe в процедуру.
При работе с объектом QueryDef (запрос) должна быть использована допустимая строка SQL.
В данном примере создаваемый запрос возвращает данные таблицы 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
QueryDef с использованием инструкции SQL. Создаваемый запрос возвращает количество товаров, проданных после 21.01.98, содержимое таблицы базы данных dar1.mdb приведено в табл. 4.6,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
| 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 |
Часто при выполнении запросов нужно использовать данные, вводимые или изменяемые пользователем. В этом случае нужно вводить в запрос переменные или элемент управления (см. Практическая работа 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
Создать объект 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
Элемент управления 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.| 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 |
MSFlexGrid (см. выше),CommonDialоg: Проект $$\to$$ Компоненты $$\to$$ Управление $$\to$$ Microsoft CommonDialog Control,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
Реплицировать означает тиражировать. Если учреждение располагает сетью, тогда целесообразно иметь основную копию базы данных (главная реплика) в главном подразделении фирмы и несколько еe копий (реплик) в других помещениях/на других территориях.
Пусть имеется база данных sabi.mdb c несколькими таблицами . Превратим sabi.mdb в главную реплику. Создадим на дисковом устройстве С: каталог rep, который будем использовать для проекта. Сначала нужно просмотреть базу данных в приложении Visdata: меню Добавления $$\to$$ Визуальный менеджер данных (Visual Name = C:\ : sabi.mdb, Connect*,: .
Для приобретения навыков репликации и синхронизации нужно выполнить несколько этапов:
DAO : Microsoft Command1_Click (), см. ниже):Command2_Click (), см. ниже):MakeReplica,Command3_Click (), см. ниже):Cynchronize объекта Database.Последовательность действий:
Command1_Click () и Command2_Click (), см. ниже,Пояснения: после создания главной реплики в главной реплике появились новые системные таблицы, появились дополнительные свойства главной реплики. Свойство Replicable (установлено в Т) означает, что для базы данных можно создавать реплики. После создания главной реплики появились новые свойства любой таблицы главной реплики.
s_Generation - появление чисел 0 вместо 1 после внесения изменений Вами/сотрудниками учреждения в записи таблиц главной реплики и реплики,Command3_Click (), см. код ниже,s_Generation: в процессе синхронизации значение поля увеличивается на 1 при каждом изменении записи.В тех случаях, когда в разных репликах изменяется одна и та же запись несkолько раз, то в итоге в процессе синхронизации копируются данные той реплики, которая изменила запись большее число раз. В случае равенства числа изменений Microsoft Jet выбирает запись из таблицы с наименьшим значением ReplicaID,
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 - разработанная корпорацией 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,
Аргументы
OpenSchema. Возвращает информацию о схеме базы данных, например, о структуре таблицы,RollbackTrans. Отменяет все изменения в текущем объекте Connection,Некоторые свойства:
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 в 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:
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 можно добавить к полю новые данные.
Name. Устанавливает или возвращает имя свойства,Value. Устанавливает или возвращает значение свойства,Attributes. Устанавливает или возвращает значение, равное комбинации констант: adPropNotSupported (поставщик не поддерживает это свойство), adPropRequired (значение этого свойства должно быть указано до инициализации источника данных), adPropOptional (значение этого свойства не обязательно указывать до инициализации источника данных ), adPropRead (свойство доступно для чтения), adPropWrite (свойство доступно для записи),Type. Устанавливает или возвращает тип данных.Clear.
Ошибки ADO обрабатываются системой обработки Visual Basic.Свойства объекта Error:
Description. Возвращает строку с кратким описанием ошибки. Задается либо программным обеспечением ADO, либо поставщиком данных,NativeError. Указывает код ошибки поставщика данных,Number. Указывает номер, однозначно определяющий объект Error,Source. Указывает имя объекта в котором произошла ошибка,SQLState. Содержит код состояния SQL для данного объекта Error.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.lstName, lstVorname, lstVatersn, lstGebdat, lstNummer ),| Имя | Название |
| 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
(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
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
В данной работе рассматриваeтся:
ADO | Name of product | Price | Total | |
| tvset | 400 | 10 | 4000 |
| computer | 300 | 2 | 6000 |
| 200 | 20 | 4000 | |
| telephone | 150 | 20 | 3000 |
| scaner | 700 | 15 | 10500 |
Порядок выполнения:
name_of_product, text, price currency quantity byte total currency
Замечание: для проверки (внесения записи) стартовать Visual
Рассматриваются следующие задачи:
ADO,MsFlexGrid (см. Form1),Command1_Click ()),Command5_Click ()),Command2 ),Command3_Click ()).Последовательность действий:
Созданная таблица имеет вид (рис. 4.24):
(рис 4.24) Содержание таблицы
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
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
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
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
Задание: создать программным способом:
(рис 4.26) Таблица 1(Таrif)
(рис 4.27) Таблица 2 (Kunde)
(рис 4.28) Таблица 2 (Kunde), режим конструктора (имя поля, тип данных)
Пример выполнения практической работы 31.
| File | Table | Record Set | Relation | Query | Exit |
|---|---|---|---|---|---|
| Create | Tab1 | Record Set Table1 | Create | ||
| Query | |||||
| Open | Tab1 | Record Set Table2 | Open | ||
| Query |
Здесь:
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
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
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
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
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
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
FrmQuery ). На рис. 4.38 запрос представлен на бланке запроса, на рис. 4.39 запрос представлен в SQL -форме. Эти данные взяты из файла базы данных (см. регистр Запрос базы данных),
(рис 4.37) Результаты запроса
(рис 4.38) Запрос на бланке запроса
(рис 4.39) Запрос в SQL-форме
(рис 4.40) Завершение выполнения проекта
Элемент управления Data обеспечивает связь проекта Visual Basic с файлом базы данных. Следующие свойства элемента управления Data используются при реализации связи, табл. 4.1.
| Свойство | Пример значения свойства |
| Connect | Access |
| A:\Studium.mdb ' имя базы данных | |
| RecordSource | software ' имя таблицы |
Для отображения/редактирования данных в простейшем случае может быть использовано текстовое поле, поле списка и т.д., при этом используются их свойства, данные в табл. 4.2:
| Свойство | Пример значения свойства |
| DataSource | Data1 ' элемент управления Data с его номером |
| Hersteller ' имя поля таблицы базы данных. Замечание: для каждого элемента управления TextBox не забудьте установить свое значение этого свойства |
Задание: создать таблицу базы данных, содержащую данные о 9 программных продуктах с полями: Hersteller - изготовитель, Typ - тип продукта, Preis - цена, Tendenz - тенденция, Anbieter - распространитель, Ort - местность, табл. 4.3:
| Коde | Hersteler | Typ | Preis | Tendenz | Anbieter | Ort |
| 1 | Ahead | Nero |
59 | A | Media Markt | Berlin-Tegel |
| 2 | Steinberg | Maxima Studio | 59 | В | Media Markt | Koeln |
| 3 | Norton | 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 | Duesseldorf | |
| 8 | Cequadrat | Picture it | 99 | A | Schaubandt | Isenhagen |
| 9 | Corel | Corel Draw | 379 | A | US-Electronic | Hilden |
Следует создать стандартный модуль для обеспечения использования переменных в (данном случае) в 2-х формах. Первую форму использовать для связи проекта с базой данных (использовать элементы управления Data и TextBox) и создания двумерного массива, соответствующего таблице базы данных. Вторую форму использовать для вывода двумерного массива на экран (в массив поля списка) и нахождения максимальной цены программного продукта.
Последовательность действий:
List1 (9) для вывода данных двумерного массива на экран, элемент управления Label1, 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
Объекты доступа к данным - это объекты, представляющие структуру базы данных и её содержимое. Программист может использовать
Для работы с источниками данных используется иерархия объектов Microsoft Jet, табл. 4.4:
| DBEngine | |
| Properties | |
| TableDef... QueryDef ...Recordset ...Relation | |
| Field... Index | Field ...Field |
DBEngine - объект самого верхнего уровня в иерархии объектов Microsoft Jet обеспечивает связь приложения с СУБД Microsoft DBEngine имеет свойства и методы и содержит коллекции - объекты одного типа,Properties содержит свойства объекта DBEngine,Workspaces . Объект Workspace - это рабочее пространство, которое определяет именованный сеанс работы пользователя. Коллекция Workspaces содержит все определeнные рабочие пространства. Workspaсe имеет свойства (Name - имя рабочего пространства, UserName - имя пользователя, IsolateODBCTrans используется для контроля за числом соединений ODBC, установленных с базой данных во время сеанса) и 2 метода - CreateDatabase и OpenDatabase,Databases содержит все объекты Database - базы данных, открытые для данного объекта Workspace . Объект Database создается каждый раз, когда пользователь открывает базу данных с помощью метода OpenDatabase. Содержит несколько свойств и методов (Name, Connect, : Connection ), например, метод OpenRecordset служит для доступа к таблицам баз данных,Recordset - объект, содержащий наборы записей; имеется большое количество свойств и методов, доступность которых зависит от того, в каком рабочем пространстве был создан объект Recordset - Microsoft Jet или ODBCDirect.
Технология ODBCDirect - модель доступа к данным ODBC. Частью этой модели доступа является объект Connection. Эта модель даeт возможность программисту обращаться к источникам данных ODBC напрямую, не используя объекты данных Microsoft Jet.Relation - содержит информацию об установленных между таблицами отношениях (указание полей и типа связей),Properties, имеет несколько свойств и методов,Объекты используются в определeнном порядке. Сначала с помощью ключевого слова Set формируется , затем Database, Recordset и другие объекты. Для открытия базы данных используется метод OpenDatabase объекта , а для открытия таблицы - метод OpenRecordset объекта Database. Для получения доступа к определенному количеству строк таблицы используется метод GetRows(numrows) объекта Recordset, numrows - это число строк. Строки/столбцы нумеруются, начиная с 0.
Следует сделать ссылку на библиотеку объектов доступа к данным: Проект $$\to$$ Информация $$\to$$ Microsoft
| # | year | incomepercapital | structures | goods | services | ||
| 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
В разделе 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) Свойства рабочего пространства
Объекты, содержащие наборы записей, представляют наибольший интерес. Ввести код, данный ниже, пояснения даны под комментариями к коду, затем стартовать проект, сделать щелчок на командной кнопке, проанализировать выведенные данные.
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
При работе с базами данных проекте Visual Basic часто возникает необходимость создать инструкцию SQL. Простейший способ создания инструкции SQL заключается в создании запроса на бланке запроса, последующем использовании меню Вид $$\to$$ режим SQL ; копировании создаваемой автоматически в выводимом окне инструкции SQL и вставке еe в процедуру.
При работе с объектом QueryDef (запрос) должна быть использована допустимая строка SQL.
В данном примере создаваемый запрос возвращает данные таблицы 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
QueryDef с использованием инструкции SQL. Создаваемый запрос возвращает количество товаров, проданных после 21.01.98, содержимое таблицы базы данных dar1.mdb приведено в табл. 4.6,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
| 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 |
Часто при выполнении запросов нужно использовать данные, вводимые или изменяемые пользователем. В этом случае нужно вводить в запрос переменные или элемент управления (см. Практическая работа 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
Создать объект 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
Элемент управления 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.| 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 |
MSFlexGrid (см. выше),CommonDialоg: Проект $$\to$$ Компоненты $$\to$$ Управление $$\to$$ Microsoft CommonDialog Control,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
Реплицировать означает тиражировать. Если учреждение располагает сетью, тогда целесообразно иметь основную копию базы данных (главная реплика) в главном подразделении фирмы и несколько еe копий (реплик) в других помещениях/на других территориях.
Пусть имеется база данных sabi.mdb c несколькими таблицами . Превратим sabi.mdb в главную реплику. Создадим на дисковом устройстве С: каталог rep, который будем использовать для проекта. Сначала нужно просмотреть базу данных в приложении Visdata: меню Добавления $$\to$$ Визуальный менеджер данных (Visual Name = C:\ : sabi.mdb, Connect*,: .
Для приобретения навыков репликации и синхронизации нужно выполнить несколько этапов:
DAO : Microsoft Command1_Click (), см. ниже):Command2_Click (), см. ниже):MakeReplica,Command3_Click (), см. ниже):Cynchronize объекта Database.Последовательность действий:
Command1_Click () и Command2_Click (), см. ниже,Пояснения: после создания главной реплики в главной реплике появились новые системные таблицы, появились дополнительные свойства главной реплики. Свойство Replicable (установлено в Т) означает, что для базы данных можно создавать реплики. После создания главной реплики появились новые свойства любой таблицы главной реплики.
s_Generation - появление чисел 0 вместо 1 после внесения изменений Вами/сотрудниками учреждения в записи таблиц главной реплики и реплики,Command3_Click (), см. код ниже,s_Generation: в процессе синхронизации значение поля увеличивается на 1 при каждом изменении записи.В тех случаях, когда в разных репликах изменяется одна и та же запись несkолько раз, то в итоге в процессе синхронизации копируются данные той реплики, которая изменила запись большее число раз. В случае равенства числа изменений Microsoft Jet выбирает запись из таблицы с наименьшим значением ReplicaID,
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 - разработанная корпорацией 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,
Аргументы
OpenSchema. Возвращает информацию о схеме базы данных, например, о структуре таблицы,RollbackTrans. Отменяет все изменения в текущем объекте Connection,Некоторые свойства:
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 в 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:
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 можно добавить к полю новые данные.
Name. Устанавливает или возвращает имя свойства,Value. Устанавливает или возвращает значение свойства,Attributes. Устанавливает или возвращает значение, равное комбинации констант: adPropNotSupported (поставщик не поддерживает это свойство), adPropRequired (значение этого свойства должно быть указано до инициализации источника данных), adPropOptional (значение этого свойства не обязательно указывать до инициализации источника данных ), adPropRead (свойство доступно для чтения), adPropWrite (свойство доступно для записи),Type. Устанавливает или возвращает тип данных.Clear.
Ошибки ADO обрабатываются системой обработки Visual Basic.Свойства объекта Error:
Description. Возвращает строку с кратким описанием ошибки. Задается либо программным обеспечением ADO, либо поставщиком данных,NativeError. Указывает код ошибки поставщика данных,Number. Указывает номер, однозначно определяющий объект Error,Source. Указывает имя объекта в котором произошла ошибка,SQLState. Содержит код состояния SQL для данного объекта Error.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.lstName, lstVorname, lstVatersn, lstGebdat, lstNummer ),| Имя | Название |
| 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
(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
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
В данной работе рассматриваeтся:
ADO | Name of product | Price | Total | |
| tvset | 400 | 10 | 4000 |
| computer | 300 | 2 | 6000 |
| 200 | 20 | 4000 | |
| telephone | 150 | 20 | 3000 |
| scaner | 700 | 15 | 10500 |
Порядок выполнения:
name_of_product, text, price currency quantity byte total currency
Замечание: для проверки (внесения записи) стартовать Visual
Рассматриваются следующие задачи:
ADO,MsFlexGrid (см. Form1),Command1_Click ()),Command5_Click ()),Command2 ),Command3_Click ()).Последовательность действий:
Созданная таблица имеет вид (рис. 4.24):
(рис 4.24) Содержание таблицы
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
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
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
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
Задание: создать программным способом:
(рис 4.26) Таблица 1(Таrif)
(рис 4.27) Таблица 2 (Kunde)
(рис 4.28) Таблица 2 (Kunde), режим конструктора (имя поля, тип данных)
Пример выполнения практической работы 31.
| File | Table | Record Set | Relation | Query | Exit |
|---|---|---|---|---|---|
| Create | Tab1 | Record Set Table1 | Create | ||
| Query | |||||
| Open | Tab1 | Record Set Table2 | Open | ||
| Query |
Здесь:
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
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
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
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
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
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
FrmQuery ). На рис. 4.38 запрос представлен на бланке запроса, на рис. 4.39 запрос представлен в SQL -форме. Эти данные взяты из файла базы данных (см. регистр Запрос базы данных),
(рис 4.37) Результаты запроса
(рис 4.38) Запрос на бланке запроса
(рис 4.39) Запрос в SQL-форме
(рис 4.40) Завершение выполнения проекта
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.