Сводка
В базе данных Microsoft Access 2010 (accdb) у меня есть форма, которая динамически загружает другие формы в объект подчиненной формы в главной форме. Формы, используемые в объекте подчиненной формы, привязаны к сквозным запросам ODB C, которые выполняют хранимые процедуры для возврата наборов записей. Я не могу понять, почему я могу использовать одно spro c, и оно прекрасно работает, но если я привяжу форму к другому spro c, она не сможет загрузить подчиненную форму.
Техническое руководство
У меня есть два сквозных запроса ODB C. qryGood
и qryBad
. Они используют идентичные строки подключения ODB C (ODBC;DRIVER=SQL Server;SERVER=MyServer;UID=MyUser;Trusted_Connection=Yes;DATABASE=MyDatabase
), а SQL за ними идентичны, но указывают на две разные хранимые процедуры SQL на сервере базы данных SQL 2012.
Источник qryGood: exec spGoodProc 123456
Источник qryBad: exec spBadProc 123456
SQL за спро c очень просто. Возврат записей из одной таблицы с фильтрацией по идентификатору, переданному в качестве параметра. (Некоторые будут делать более сложные вещи, но я просто остановлюсь на упрощенном примере, который демонстрирует проблему.)
Свойство RecordSource
frmMySubform
установлено в qryBad
.
Субформа SourceObject
устанавливается с помощью кода VBA: sfrmMain.SourceObject = "frmMySubform"
На этом этапе ошибки не выдаются. В то время как свойство SourceObject
теперь возвращает frmMySubform
, объект .Form
, похоже, не установлен.
Затем я пытаюсь сослаться на свойство в подчиненной форме: Debug.Print sfrmMain.Form.Name
Сбой с ошибкой 2467: Введенное вами выражение относится к объекту, который закрыт или не существует.
Затем я могу открыть frmMySubform
в режиме конструктора, изменив свойство RecordSource
на qryGood
и это работает просто отлично. Кажется, это указывает на проблему с spBadProc
, которая проявляется только при использовании в качестве RecordSource
в подчиненной форме.
Что я пытался
В попытке устранить эту проблему, Я использовал процесс исключения, чтобы сузить это, насколько я могу, но я все еще не понимаю, почему один spro c работает, а другой нет. Обе записи возвращаются просто отлично в SQL и при непосредственном выполнении сквозного запроса. Оба работают нормально при открытии формы напрямую. Это становится проблемой только тогда, когда форма установлена как SourceObject
в элементе управления подчиненной формы.
Я использовал sp_procedure_params_rowset
для сравнения параметров в sprocs, и они идентичны. Я сравнил типы данных столбцов в SQL, и нет ничего нового или отличного в tblBad
, которого нет в tblGood
. Я также попытался профилировать сервер SQL при настройке формы, и кажется, что spro c вызывает нормально. Я не видел никаких подсказок при сравнении трассировки между плохими и хорошими звонками.
Установка RecordSet
напрямую на ODB C ссылка на tblBad
работает просто отлично (и я предполагаю, что представление также будет в порядке), но наличие простой оболочки хранимых процедур каким-то образом вызывает ошибку.
Я также сравнил безопасность, свойства и расширенные свойства для spGoodProc
и spBadProc
, и они идентичны.
Мой вопрос
Что я могу сделать на стороне устранения неполадок, чтобы еще больше уменьшить это? Кто-нибудь сталкивался с подобными проблемами со связанными sprocs на подчиненных формах? Я работаю над очень сложной базой данных с сотнями форм, таблиц и запросов, поэтому мне бы очень хотелось понять, почему это происходит, прежде чем я go слишком далеко по этому пути.
Заранее благодарим вас за любые идеи, которыми вы можете поделиться по этой озадачивающей проблеме. :-)