назад | содержание | вперед

Осуществление доступа к данным

Теперь надо определить средства доступа к данным. Для этих целей будем использовать технологию ADO (ActiveX Data Objects). Чтобы получить набор строк источника данных, воспользуемся объектами Recordset и Connection.

Добавьте в исходный код модуля ownNavigator описание используемого объекта Recordset:

Dim WithEvents mrstMain As ADODB.Recordset

Добавьте также в исходный код объекта connection, используемого для соединения с сервером, следующий код:

Dim WithEvents mcnnMain As ADODB.Connection

Ключевое слово WithEvents, включенное в описание этих объектов, позволит обрабатывать связанные с ними события.

Теперь рассмотрим создание описанных объектов, осуществление соединения и выборки записей. Чтобы можно было программно управлять этим процессом на этапе дальнейшего использования компонента ownNavigator, добавим два общедоступных метода OpenRecordset и CloseRecordset:

Public Sub OpenRecordset ()

If mcnnMain Is Nothing Then

'создаем Connection

Set mcnnMain = New ADODB.Connect ion

'устанавливаем его параметры

mcnnMain.CursorLocation = adUseClient

mcnnMain.Provider = "SQLOLEDB.1"

mcnnMain.CommandTimeout = 300

'строка для соединения, имя пользователя, пароль

mcnnMain.Open "Data Source= MYSERVER; Initial Catalog=SALES", "SYSADM", "SYSADM"

End If

If mrstMain Is Nothing Then

'создаем Recordset

Set mrstMain = New ADODB.Recordset

'открываем Recordset

mrstMain.Open "customer", mcnnMain, adOpenKeyset, adLockOptimistic, adCmdTable

If Not (mrstMain.BOF And mrstMain.EOF) Then mrstMain.MoveFirst

End If

End Sub

Public Sub CloseRecordset ()

'если Recordset открыт — закрываем

If mrstMain.State о adStateClosed Then mrstMain.Close

'уничтожаем Recordset

Set mrstMain = Nothing

'если Connection открыта — закрываем

If mcnnMain.State <> adStateClosed Then mcnnMain.Close

'уничтожаем Connection

Set mcnnMain = Nothing

End Sub

Замечание

В данном примере для простоты мы задали фиксированные параметры источника данных. Способы устранения подобных ограничений и придания гибкости ActiveX-компоненту будут рассмотрены ниже.

Объект Recordset осуществляет выборку из таблицы Customer и позволяет не только просматривать, но и редактировать записи (параметр adOpenKeyset). При открытии Recordset текущая позиция устанавливается перед первой записью. Естественно, что мы не получим при этом никаких данных. Для того чтобы выполнить перемещение на первую доступную запись, можно воспользоваться методом MoveFirst. Однако, если набор записей пуст, подобные действия приведут к ошибке. Проанализировать данную ситуацию можно с помощью свойств BOF и EOF объекта Recordset. Первое принимает значение True в том случае, если текущая позиция находится перед первой записью, второе истинно, если текущая позиция — за последней записью. Если они принимают значение True одновременно, значит Recordset не содержит ни одной записи. При закрытии источника данных осуществляется проверка, открыты ли они на данный момент, что позволяет гарантировать отсутствие ошибочной ситуации повторного закрытия.

Теперь рассмотрим действия, необходимые для перемещения по записям результирующего множества. Для этого напишем коды обработки событий при нажатии на соответствующие кнопки. По существу, каждая из кнопок будет просто вызывать соответствующие методы объекта Recordset.

Private Sub cmdFirst_Click()

mrstMain.MoveFirst

End Sub

Private Sub cmdPrev_Click()

mrstMain.MovePrevious

If mrstMain.BOF Then

inrstMain.MoveFirst

End If

End Sub

Private Sub cmdNext_Click()

mrstMain.MoveNext

If mrstMain.EOF Then

mrstMain.MoveLast

End If

End Sub

Private Sub cmdLast_Click()

mrstMain.MoveLast

End Sub

Заметим, что после перемещения на новую запись с помощью методов MovePrevious или MoveNext текущая позиция может оказаться за пределами выбранных записей. Для предотвращения этой ситуации осуществляется проверка с помощью свойств BOF и EOF.

Итак, создан ActiveX-компонент, который позволяет перемещаться по записям в таблице базы данных. Однако он не способен отображать их на экране. Для отображения данных в Visual Basic существует множество готовых элементов управления, например, TextBox. Для связывания элемента управления с результирующим множеством будем использовать стандартный механизма Data Binding, то есть для объекта TextBox зададим свойства DataSourse, DataMember И DataField. Чтобы создаваемый нами компонент мог выступать в роли объекта-источника, установим свойство DataSourceBehavior нашего объекта ownNavigator равным vbDataSource (рис. 17.37).

Рис. 17.37. Определение свойства DataSourceBehavior

Теперь необходимо определить действия, выполняемые при инициализации объекта и при его уничтожении:

Private Sub OserControl Initialize()

OpenRecordset

DataMembers.Add "Main"

End Sub

Private Sub UserControl_Terminate()

DataMembers.Clear

CloseRecordset

End Sub

В данном примере мы осуществляем доступ к одному объекту Recordset. Если их несколько в одном объекте-источнике, осуществлять выбор нужного позволит деление на несколько разделов DataMember. Для успешной работы этого механизма следует описать обработку события Get DataMember объекта userControl, которое происходит при попытке внешних объектов запросить содержимое раздела. Это событие передает параметр DataMember, где в виде строки задан требуемый раздел DataMember. Следует возвратить внешним объектам ссылку на соответствующий объект Recordset (или другой подобный источник) путем присвоения значения параметру Data данного события. В нашем случае это выглядит следующим образом:

Private Sub UserControl GetDataMember(DataMember As String, Data As Object)

If DataMember = "Main" Then

Set Data = mrstMain Else

MsgBox "DataMember " & DataMember & " не найден"

End If

End Sub

 

назад | содержание | вперед