Visual Basic 6. Руководство разработчика


Доступ к полям в объектах


RecordSet

Связанные с данными элементы управления могут отображать поля текущей записи в объекте RecordSet элемента управления Data, но необходимо также обра­щаться к значениям полей из кода программ. К полям можно обращаться через объект Field набора записей RecordSet. Следующее выражение задает поля (столбцы) набора записей RecordSet.

recordset.Fields

Переменная recordset представляет собой объект RecordSet (это может быть свойство RecordSet элемента Data, например, Data I. RecordSet или переменная с именем RecordSet).

Обращайтесь к отдельным полям по имени поля или его порядковому номеру в таблице Если элемент управления Data с именем Datal связан с таблицей Titles базы данных BIBLIO, то можно обращаться к полю Title текущей записи с помощью любого из следующих операторов.

bookTitle = Datal.Recordset.Fields(0)

bookTitle = Datal.Recordset.Fields ("Title")

Другие два свойства, представляющие интерес - это свойство RecordCount объекта RecordSet (возвращает число записей в RecordSet) и свойство Count объекта Fields (возвращает число полей в строке RecordSet). Эти два свойства фактически являются размерами объекта RecordSet.. Число записей в RecordSet элемента Datal определяет строка

Datal.RecordSet.RecordCount

а число столбцов в этом же RecordSet — следующая строка:

Datal.RecordSet.Fields.Count

VB6 в действии: просмотр RecordSet

Разработаем небольшое приложение, демонстрирующее, как можно просматривать записи в наборе RecordSet и обрабатывать их поля. Обработка довольно триви­альна: помещение строк объекта RecordSet в элемент управления ListBox. Программа демонстрирует, как просматривать RecordSet и извлекать конкретные поля.



Чтобы создать это приложение, выполните следующие действия.

1. Откройте новый проект и поместите элементы управления ListBox и Data на форму (рис. 17.14).

2. Установите свойство Visible элемента управления Data в False. Нельзя исполь­зовать элемент управления Data для перемещения по RecordSet после того, как все записи отображены в элементе управления ListBox.


3. Установите свойства DatabaseName и RecordSource элемента управления Data на любую таблицу базы данных BIBLIO или NWIND.



Рис. 17.14. Приложение загружает поля RecordSet в элемент управления ListBox

4. Теперь введите следующий код в событие Load формы.

Private Sub Form_Load()

Dim i As Integer

Data1.Refresh

Data1.Recordset.MoveLast

Data1.Recordset.MoveFirst

For i = 1 To Data1.Recordset.RecordCount

List1.AddItem Data1.Recordset.Fields(1)

Data1.Recordset.MoveNext

Next

End Sub

Совет

При запуске этого приложения элемент управления ListBox заполняется значениями из второго поля таблицы. Этот код предназначен для использования в больших приложениях. В параграфе " Усовершенствованные элементы управления, связанные с данными" рассмотрен связанный с данными элемент управления ListBox, заполняю­щийся автоматически. Метод Refresh вызывается перед использованием свойств элемента управления Data и заставляет элемент управления Data читать RecordSet из базы данных. Когда объект RecordSet только создан или обновлен, ему не известно, сколько в нем записей. Несомненным является наличие только одной записи — первой. Если пользователь щелкает на кнопке Next, то RecordSet считает, что содержит две записи, потому другие еще не видны. Чтобы узнать общее количество записей, необходимо перейти на последнюю запись с помощью метода MoveLast. После вызова этого метода для определения числа строк в RecordSet используется свойство RecordCount.

Seek. Можно немедленно найти запись в таблице на основании значения индексного поля с помощью метода Seek объекта RecordSet. Этот метод чрезвычайно быстр, потому что использует индекс таблицы и ищет записи в отсортированном списке. Метод имеет следующий синтаксис.

Seek operator, key

     Параметр

operator- одна из следующих операций сравнения:

•   = (равно)

•   > (больше чем)

•   < (меньше чем)

•   >= (больше или равно)

•   <= (меньше или равно)

Параметр

key (ключ) - значение, сравниваемое с ключевым полем индекса. Если индекс создан на основе одного поля, то key —



одиночное значение, если на основе нескольких полей, то параметр key содержит несколько значений, разделен­ных запятыми.

Например, если таблица Customers проиндексирована по полю State (Штат), то следующий вызов позволяет найти первого заказчика в Калифорнии.

Datal.Recordset.Seek "=" , "СА"

Метод Seek быстрее, чем метод Find, но менее гибкий. Если приходится часто производить поиск записей на основании значения определенного поля, то необхо­димо по этому полю создать индекс и использовать метод Seek. Для выполнения поиска всех типов, включающих несколько полей и оператор LIKE, можно использовать метод Find, но он выполняется не так быстро, как метод Seek.

VB6 в действии: проект ManyTbIs

Приложение ManyTbIs (проект с несколькими таблицами) демонстрирует использование метода Seek для быстрого поиска записей с помощью первичных ключей (рис. 17.15). Это приложение объединяет все таблицы в базе данных BIBLIO, чтобы отобразить названия книг вместе с именами авторов, издателей и сопутст­вующей информацией (комментарии и описания).



Рис. 17.15. Приложение ManyTbIs: названия всех книг, имена авторов и издателей содержатся в различных таблицах базе данных BIBLIO

Примечание

Читатели, которые уже знакомы с SQL, поймут, что это приложение может быть реализовано без использования метода Seek. По сути, можно написать единственную строку кода, содержащую SQL-запрос. Этот пример предназначен только для демонст­рации использования метода Seek. Далее в этой главе приложение ManyTbIs будет модифицировано, и вы увидите, как его реализовать с помощью одного SQL-запроса.

При перемещении по названиям книг (с помощью соответствующих кнопок элемента управления Data таблицы Titles) программа отображает соответствующий заголовок книги в первом текстовом поле формы и поля Comments и Subject в со­ответствующих им текстовых полях. Эти текстовые поля непосредственно связаны с элементом управления Data формы.

Чтобы отображать сведения об издателе, приложение использует поле PubID (ID издателя) таблицы Titles, как ключ к таблице Publishers (Издатели), в которой оно находит (с помощью метода Seek) запись с таким же значением PubID.



Для отображения имени автора приложение использует поле ISBN, чтобы найти соответствующую запись в таблице Title Author (Авторы книги). Когда эта запись найдена, для поиска имени автора программа использует поле AuID как ключ к таблице Authors (Авторы).

Код для выполнения этих действий находится в обработчике события Reposition (перемещение) элемента управления Data, которое вызывается каждый раз, когда пользователь нажимает одну из кнопок перемещения для перехода на другую запись в таблице Titles. Приложение использует все четыре таблицы базы данных, следовательно, ему необходимы и четыре объекта RecordSet — по одному на каждую таблицу. Форма приложения во время проектирования содержит четыре элемента управления Data, но только один из них видим во время выполнения приложения (рис. 17.16).



Рис. 17.16. Приложение ManyTbIs в процессе проектирования

Для разработки приложения ManyTbIs выполните следующие действия.

1. Создайте новый проект и поместите элементы управления Label и TextBox так, как изображено на рис. 17.16.

2. Поместите на форму и четыре элемента управления Data: TITLES, PUBLISHERS, AuthorISBN и Authors. Задайте в их свойствах DatabaseName путь к базе данных BIBLIO.

3. Каждый элемент управления Data должен видеть свою таблицу базы данных, так что обязательно установите свойство RecordSource каждого элемента управ­ления Data, как показано в табл. 17.10.

Таблица 17.10. Значения свойства

RecordSource элементов управления Data на форме ManyTbIs

Имя элемента управления Data

Значение свойства

RecordSource

TITLES

Titles

PUBLISHERS

Publishers

AUTHORISBN

Title Author

AUTHORS

Authors

4. Теперь свяжите текстовые поля с соответствующими полями элементов управ­ления Data.

•  Свяжите текстовое поле, в котором отображается название книги, с полем Title элемента управления Data с именем TITLES.

•  Свяжите текстовое поле, в котором отображается имя издателя, с полем Publisher элемента управления Data с именем PUBLISHERS.



•  Свяжите текстовое поле, в котором отображается имя автора, с полем Author элемента управления Data с именем AUTHORS.

Свяжите остальные текстовые поля с соответствующими полями элемента управления Data. Можно открыть приложение ManyTbIs в среде разработки Visual Basic и посмотреть, как различные элементы управления, связанные с данными, подключены к элементам управления Data. На этом этапе можно объединять любое название книги с любым автором и любым издателем, потому что все три элемента управления Data не соединены и могут быть размещены как угодно в соответствующих таблицах.

Для соединения элементов управления применим метод

Seek элемента управления Data, поэтому необходимо использовать первичные индексы таблиц. Выполняться это должно при загрузке формы.

5. Введите следующий код в обработчик события Load формы.

Private Sub Form Load ()

PUBLISHERS.Refresh

AUTHORISBN.Refresh

AUTHORS.Refresh

PUBLISHERS.Recordset.Index = "PrimaryKey"

AUTHORISBN.Recordset.Index = "ISBN"

AUTHORS.Recordset.Index = "PrimaryKey"

End Sub

Чтобы открыть индексный файл для таблицы объекта

RecordSet типа Table, необходимо назначить имя индекса свойству Index объекта RecordSet. Когда свойству Index назначено значение, то все вызовы Seek по отношению к RecordSet используют этот индекс

6. Введите следующий код в обработчик события Reposition элемента управления Data с именем TITLES

Private Sub TITLES_Reposition()

PUBLISHERS.Recordset.Seek "=",

TITLES.Recordset.Fields ("PubID")

If PUBLISHERS.Recordset.NoMatch Then

lblPublisher.Caption = "***"

AUTHORISBN.Recordset.Seek "=", _

TITLES.Recordset.Fields ("ISBN")

If AUTHORISBN.Recordset.NoMatch Then

lblAuthor.Caption = "***"

Exit Sub

End If

AUTHORS.Recordset.Seek " ", _

AUTHORISBN.Recordset.Fields ("Au_ID")

End Sub

Каждый раз, когда пользователь изменяет позицию элемента управления Data в объекте RecordSet, программа выполняет следующее.



1. Использует метод Seek для PUBLISHERS RecordSet, чтобы найти запись, у которой поле PubID соответствует полю PubID отображаемого названия книги.

2. Если такой записи нет, то она печатает звездочки в текстовом поле, в котором могло бы быть имя издателя. Если соответствующая запись найдена, программа ничего не выполняет. Метод Seek помещает элемент управления PUBLISHERS Data на строку таблицы Publishers с именем издателя, соответствующим названию книги. Соответствующее текстовое поле, связанное с данными, обновляется автоматически.

3. Затем программа находит запись таблицы Title Author, у которой поле ISBN равно ISBN текущей книги. Если подобная запись не существует - печатаются звездочки и происходит выход из подпрограммы. Если запись найдена, то ее поле AuID становится ключом для последней операции установки, нахо­дящей запись в таблице AUTHORS, у которой поле AuID соответствует полю AuID в таблице Title Authors.

Метод Seek быстр поля на форме обновляются немедленно. Даже с большими файлами этот подход работает хорошо и не приводит к значительным задержкам. Обратите внимание можно искать записи в RecordSet на основании более чем одного индекса. Каждый вызов Seek выполняется с определенным индексом, но можно изменять текущий индекс, устанавливая другое значение свойства Index объекта RecordSet.


Содержание раздела