В общем, все, на первый взгляд, просто.
Имеем VB6, базу MDB/Jet2.0 (да-да, старую! ибо должна также открываться Access-97 из-под Windows-98SE).
Прога написана как MDI, при этом родительское окно включает меню (выбор БД + открытие дочерних окон + Help), статусбар (для вывода имени активной базы, "рабочей" даты с возможностью изменения и т.п.), и некоторые общие функции (в т.ч. процедуры подключения к БД, выбираемой юзверем через cdlFileOpen, и ее проверка "на вшивость", оптимизация, бэкап и т.п.), а дочерние формочки реализуют необходимый рабочий функционал проги (каждое - свой набор функций, потому и сделано как MDI)
Трабла:
создаю экземпляр adodb.connection в родительском окне и открываю его.
Теперича создаем и показываем к-л дочернее окно, пытаемся создать adodb.recordset на базе уже существующего в родительской форме adodb.connection и... фиг вам!
Вопрос:
Как решить траблу - ну очень не хочется создавать для каждой дочки свой конектион, тем более, что в процессе работы возможна смена ДБ из MDIForm - и (теоретически и сугубо IMHO) сменить рекордсет (он все равно обновляется в процедуре активации дочерней формы) проще, чем обновлять все открытые коннекты...
Или я зря напрягаюсь???
В общем, подскажите, а... а то я новичек по работе с ADO (раньше все текстовыми файлами с упорядоченной структурой баловался, но тут есть нужда "подвязываться" к работающей на одном из других компов БД в Access'е)
1.VB6 предлагает выбор из Jet 2.0 и Jet 7.0 - потому и выбрал 2.0 (нормально цепляет базы - и это главное)
2.Код (фрагменты):
Главная форма:
Public WithEvents adoBase As ADODB.Connection
Private Sub MDIForm_Load() 'ОК (работает, проверено)
Set adoBase = New ADODB.Connection 'инициализируем коннект
'здесь были процедуры открытия базы по умолчанию или bStartUp = True
mnuFileOpen_Click 'кроме прочего, тут процедура открытия коннекта и файл-чекер
bStartUp = False
End Sub
Private Sub mnuFileOpen_Click()
On Error Resume Next
'в StatusBar.Panels.Item(1).Text хранится путь и имя активной БД
If Len(Me.StatusBar.Panels.Item(1).Text) < 8 Then Me.cdlOpenBase.InitDir = App.Path
If Not bStartUp Then Me.cdlOpenBase.ShowOpen
StatusBar.Panels.Item(1).Text = Me.cdlOpenBase.FileName
'Теперь цепляемся к Базе данных.
If adoBase.State = adStateOpen Then adoBase.Close 'доигрались...
adoBase.CursorLocation = adUseClient
Me.adoBase.open "Provider=Microsoft.Jet.OLEDB.3.51;Persist Security Info=Falseata Source=" & Trim(StatusBar.Panels.Item(1).Text)
mnuBase.Enabled = True 'разрешим меню работы с базой
On Error GoTo 0
'здесь чекер, проверяющий структуру базы на соответствие "правильной" и закрывающий коннект при несоответствии
End Sub
Попытка открыть рекордсет в дочерней форме:
Dim WithEvents adoPrimaryRS As ADODB.Recordset
Private Sub Form_Load()
Set adoPrimaryRS = New ADODB.Recordset
adoPrimaryRS.open "select ID,Name,Contact,Car from Owners", frmMain.adoBase, , adLockOptimistic
'дальше прочие инициализации и т.п
End Sub
Собственно, все работает, если открывать adodb.connection в дочерней форме
если adoPrimaryRS Is Nothing, то дело вообще не в подключении. лови багу в своем проекте.
и как он интересно вообще пытается открыться если он nothing.
или ты что-то не договариваешь.
Результат - всегда ОК. пробовал умышленно "ломать" состояние базы в дочерней форме (менял тип курсора) - проверка честно выдает "ХХХ"
Ну и самое главное - если открывать adodb.connection в дочерней форме - все работает.
Если рекордсет делать в MDI-форме - он РАБОТАЕТ в родительской, нормально проверяется в дочерней, но тип курсора - строго ForvardOnly (как будто прямое подключение использую, а не навороченный ADO)