Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Работа с данными

Страница: 1 |

 

  Вопрос: ADODB + MDI Добавлено: 21.08.06 02:06  

Автор вопроса:  ailcat | Web-сайт: ailcat.narod.ru
В общем, все, на первый взгляд, просто.
Имеем VB6, базу MDB/Jet2.0 (да-да, старую! ибо должна также открываться Access-97 из-под Windows-98SE).

Прога написана как MDI, при этом родительское окно включает меню (выбор БД + открытие дочерних окон + Help), статусбар (для вывода имени активной базы, "рабочей" даты с возможностью изменения и т.п.), и некоторые общие функции (в т.ч. процедуры подключения к БД, выбираемой юзверем через cdlFileOpen, и ее проверка "на вшивость", оптимизация, бэкап и т.п.), а дочерние формочки реализуют необходимый рабочий функционал проги (каждое - свой набор функций, потому и сделано как MDI)

Трабла:
создаю экземпляр adodb.connection в родительском окне и открываю его.
Теперича создаем и показываем к-л дочернее окно, пытаемся создать adodb.recordset на базе уже существующего в родительской форме adodb.connection и... фиг вам!

Вопрос:
Как решить траблу - ну очень не хочется создавать для каждой дочки свой конектион, тем более, что в процессе работы возможна смена ДБ из MDIForm - и (теоретически и сугубо IMHO) сменить рекордсет (он все равно обновляется в процедуре активации дочерней формы) проще, чем обновлять все открытые коннекты...
Или я зря напрягаюсь???

В общем, подскажите, а... а то я новичек по работе с ADO (раньше все текстовыми файлами с упорядоченной структурой баловался, но тут есть нужда "подвязываться" к работающей на одном из других компов БД в Access'е)

Ответить

  Ответы Всего ответов: 8  

Номер ответа: 1
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #1 Добавлено: 21.08.06 02:52
1. Access 97 - это jet 3.x
2. Хотелось бы увидеть неработающий код.

Ответить

Номер ответа: 2
Автор ответа:
 ailcat



Вопросов: 1
Ответов: 6
 Web-сайт: ailcat.narod.ru
 Профиль | | #2
Добавлено: 21.08.06 03:16
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=False;Data 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 в дочерней форме

Ответить

Номер ответа: 3
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #3 Добавлено: 21.08.06 11:36
А так что получается?

Ответить

Номер ответа: 4
Автор ответа:
 ailcat



Вопросов: 1
Ответов: 6
 Web-сайт: ailcat.narod.ru
 Профиль | | #4
Добавлено: 21.08.06 21:34
А так - рекордсет не создается...
adoBase вроде есть, но рекордсет создается пустой (вообще пустой - "Nothing";)...

Ответить

Номер ответа: 5
Автор ответа:
 ailcat



Вопросов: 1
Ответов: 6
 Web-сайт: ailcat.narod.ru
 Профиль | | #5
Добавлено: 22.08.06 20:02
итак, ответа нет, и, похоже, не будет...

Кажется, я задал вопрос не на том форуме...
БОЛЬШОЕ СПАСИБО ЗА ОТВЕТЫ

Ответить

Номер ответа: 6
Автор ответа:
 Nash Bridges



Вопросов: 5
Ответов: 139
 Профиль | | #6 Добавлено: 23.08.06 01:42
рекордсет создается пустой (вообще пустой - "Nothing";)


если adoPrimaryRS Is Nothing, то дело вообще не в подключении. лови багу в своем проекте.
и как он интересно вообще пытается открыться если он nothing.
или ты что-то не договариваешь.

Ответить

Номер ответа: 7
Автор ответа:
 ailcat



Вопросов: 1
Ответов: 6
 Web-сайт: ailcat.narod.ru
 Профиль | | #7
Добавлено: 26.08.06 00:57
Багу... не нашел :(
Уже даже копию отладочную создал, откуда нафиг все, кроме этого чертового рекордсета убрал.

В общем, по отладке:
В MDI-форме:
Public vrem1 as adodb.connection
vrem1=adoBase
В дочерней:
lblVrem2 = select(adoBase = vrem1, "OK", "XXX";)

Результат - всегда ОК. пробовал умышленно "ломать" состояние базы в дочерней форме (менял тип курсора) - проверка честно выдает "ХХХ"

Ну и самое главное - если открывать adodb.connection в дочерней форме - все работает.
Если рекордсет делать в MDI-форме - он РАБОТАЕТ в родительской, нормально проверяется в дочерней, но тип курсора - строго ForvardOnly (как будто прямое подключение использую, а не навороченный ADO) :(

Ответить

Номер ответа: 8
Автор ответа:
 Nash Bridges



Вопросов: 5
Ответов: 139
 Профиль | | #8 Добавлено: 26.08.06 14:22
Не понял. чего-то ерунда какая-то написана. выложи тестовый проект где-нибудь.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам