Я уже писал о двух БД, во второй 14500 записей, она статическая (справочник), нет смысла отдельной таблицей раздувать первую БД.
В HELP'е нашел код, который использую для прилинковки таблицы db2 к db1 (на форме присутствует Data1 и DBGrid, в пропертях которого DBGrid.DataSource = Data1), в модуле проекта имеем - Public dbBase as DAO.Database, в заголовке кода формы, после Option Explicit - Dim tbLink As TableDef.
Далее:
- Код: Выделить всё
Private Sub Form_Load()
On Error Resume Next 'на случай, если прилинкованная таблица уже существует
dbName = App.Path & "\db1.mdb"
Set dbBase = DAO.OpenDatabase(dbName)
Set tbLink = dbBase.CreateTableDef("tbTemp")
tbLink.Connect = ";DATABASE=" & App.Path & "\db2.mdb"
tbLink.SourceTableName = "tbSprav" 'справочная таблица в db2
dbBase.TableDefs.Append tbLink
********** 'см. далее по тексту
Data1.DatabaseName = dbName
sSQL = "SELECT Pasp.Fam, tbTemp.Kod FROM Pasp, tbTemp"
Data1.RecordSource = sSQL
End Sub
Private Sub MDIForm_Unload(Cancel As Integer)
On Error Resume Next 'на случай, если прилинкованной таблицы уже нет
dbBase.TableDefs.Delete "tbTemp"
Me.WindowState = 1: End
End Sub
И вроде все бы работало, да вот только два дня назад начались глюки:
При запуске проекта на исполнение [F5] VB мне выдает, что "Ядро базы данных Microsoft Jet не может найти входную таблицу или запрос "tbTemp"" и т.д., и, соответственно, на форме выводится пустой грид. Если я трассирую проект [F8], то все без проблем - грид заполняется. Доводя трассировку до выхода из проекта, вижу, что dbBase.TableDefs.Delete "tbTemp" в MDIForm_Unload - отрабатывается без ошибки, т.е., таблица tbTemp СУЩЕСТВУЕТ! Если я из MDIForm_Unload убираю строку [dbBase.TableDefs.Delete "tbTemp"], то все тоже без проблем заполняется. Если я закомментирую строку On Error Resume Next в MDIForm_Unload, то команда работает без ошибки, т.е. удаляет СУЩЕСТВУЮЩУЮ таблицу! Но тогда при выходе из проекта в db1 остается ссылка, а мне бы ее убрать надобно. Такое впечатление, что все дело в MDIForm_Unload - dbBase.TableDefs.Delete "tbTemp"! Но так не должно быть!
Когда я вынес приведенный код в отдельный проект, все работает на ура, вместе со строкой в MDIForm_Unload.
Свой проект упростил до минимума (в смысле убрал все навороты с загрузкой и SQL-запросом) - VB все равно выеживается. Когда из SQL-запроса убираю все о tbTemp - ("SELECT * FROM Pasp"), код работает. Когда оставляю только "SELECT * FROM tbTemp" - такие же глюки! И на фиг мне такой код?
Если после строки [dbBase.TableDefs.Append tbLink] я нахально прерываю работу проекта, открываю db1 Access'ом - там ЕСТЬ (!) таблица tbTemp.
Экспериментально пришел к тому, что если вместо строки звездочек в программе вставить две строки -
- Код: Выделить всё
dbBase.Close
Set dbBase = DAO.OpenDatabase(dbName)
то код снова начинает работать без вопросов. Причем код работает независимо от того, присутствуют ли обе строки, либо по отдельности. Правда при отдельной dbBase.Close возникает ошибка в строке dbBase.TableDefs.Delete "tbTemp" - Объект более не задан. Ну это понятно - если я закрыл БД, какая же с ней работа? Но ведь в отдельном проекте этот код работает БЕЗ этих двух строк. И потом, если БД уже открыта (Set dbBase = DAO.OpenDatabase(dbName) в начале Form_Load), какой смысл ее закрывать и открывать снова?
Вот такие гладиолусы!


P.S. Приведенный код один к одному идентичен в обоих проектах, кроме добавляемых двух строк вместо звездочек.