Access 2007 Ошибка 3151 из DAO.OpenRecordSet. Как исправить? - PullRequest
0 голосов
/ 14 сентября 2018

Ну, это увлекательно.Я использую MS-Access 2007, чтобы сделать из этого, что позволит пользователям вводить данные из лабораторных результатов.

Команда from использует кодовый вызов VBA:

DAO.OpenRecordset("{Sql query}" , DB_OPEN_DYNASET, dbSeeChanges)

Этот вызов обычно работает просто отлично, но я заметил, что когда эта форма закрыта изатем снова открывается, генерируется ошибка 3151 ODBC.

Для этой формы мы используем связанные таблицы через Access 2007, наша версия SQL-Server 2012 выглядит следующим образом.

Microsoft SQL Server Management Studio                      11.0.2100.60
Microsoft Analysis Services Client Tools                    11.0.2100.60
Microsoft Data Access Components (MDAC)                     6.1.7601.17514
Microsoft MSXML                                             3.0 6.0 
Microsoft Internet Explorer                                 8.0.7601.17514
Microsoft .NET Framework                                    4.0.30319.237
Operating System                                            6.1.7601

Вызов DAO.OpenRecordset используется в нескольких событиях.Вот список.

On_Current , _AfterUpdate , Form_Unload

Я обнаружил несколько зарегистрированных случаев подобных ошибок на Access 2007 со связанными таблицами с SQL-Server, но ни у одного, похоже, нет работоспособного решения этой проблемы.

Насколько я могу судить, 3151, похоже, никак не влияет на форму или данные.Я могу открыть форму, и все там, где она должна быть, насколько я могу судить.В этой таблице около 20 тысяч записей, поэтому я могу что-то упустить.

У кого-нибудь есть идеи?

9/14 В ответ на комментарии я добавляю дополнительный код.

Вот вызов Form_Unload.Он содержит ошибочную строку.

Private Sub Form_Unload(Cancel As Integer)
Dim ImportID
Dim rst As DAO.Recordset
Dim db As Database
Set db = CurrentDb
Set ImportID = Me.ImportID

#This is the failing line below. 
Set rst = db.OpenRecordset("SELECT [dbo_t_inspect].* FROM [dbo_t_inspect] WHERE [dbo_t_inspect].ImportID= " & ImportID & ";", DB_OPEN_DYNASET, dbSeeChanges)

Вот вызов On_Current.Этот вызов On_Current фактически выполняется с помощью подформы в главной форме.

Private Sub Form_Current()
Dim rst As DAO.Recordset
Dim strImportID As String
If IsNull(Me.ImportID) Then
    [Forms]![Inspection Receiving]![LabComplete].Visible = False
    [Forms]![Inspection Receiving]![LabPending].Visible = True
Else
strImportID = Me.ImportID

Dim db As Database
Set db = CurrentDb
    Set rst = db.OpenRecordset("SELECT [dbo_t_health].*, [dbo_t_health].ImportID FROM [dbo_t_health] WHERE ((([dbo_t_health].ImportID)=" & Me.ImportID & "));", DB_OPEN_DYNASET, dbSeeChanges)

Я не уверен, где DAO определено в этом решении.Я не могу найти это объявление в моей папке с названием Microsoft Office Access Class Objects Я открыт для предложений о том, где это может быть найдено.

Точное сообщение об ошибке выглядит следующим образом:

Не удалось подключиться к {Имя соединения ODBC} Ошибка 3151.

Затем я могу выбрать параметр отладкии отладчик выведет меня на линию, которая пыталась и не смогла подключиться к соединению ODBC, которое я использую.

Ошибка очень воспроизводима.Все, что мне нужно сделать, это включить VBA Макросы в предупреждении безопасности, а затем открыть соответствующую форму.Я закрываю форму после ее загрузки.Как только я пытаюсь снова открыть форму, я получаю сообщение об ошибке, описанное выше.Форма открывается в любом случае после того, как я нажму Ok об ошибке.

...