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