назад | содержание | вперед
Осуществление доступа к данным
Теперь надо определить средства доступа к данным. Для этих целей будем использовать технологию 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
назад | содержание | вперед