Ошибка вызова ODBC - ошибка 3151 - PullRequest
4 голосов
/ 24 сентября 2010

У нас есть база данных Access, перенесенная из Access 97 в Acces 2007 с некоторыми связанными таблицами в базу данных SQL Server 2008. Мы используем File DSN в ODBC Administrator. Тесты соединения там работают нормально. Фактически, у нас есть основная форма в приложении Access 2007, которая всегда показывает данные правильно.

Проблема возникает, когда мы выполняем задачу, которая выполняет следующий вызов:

Dim dbs As Database<br> Dim rstAppend As Recordset<br> Set dbs = CurrentDb<br> Set rstAppend = dbs.OpenRecordset(strAccessTable, dbOpenDynaset, dbSeeChanges)

OpenRecordset выдает ошибку 3151 и возникает случайным образом, но встречается довольно часто. Это спорадический. Когда мы не получаем ошибку, задача отлично работает.

  1. Так бывает не всегда, в основном у нас все хорошо.
  2. Когда это происходит, это происходит для всех последующих задач. Мы должны закрыть и снова открыть базу данных Access и помолиться доброму Господу, чтобы она работала.
  3. Иногда обновление таблиц в менеджере связанных таблиц решает проблему, а другие - нет.
  4. Иногда при обновлении менеджера связанных таблиц мы получаем ошибку «ODBC - Call Failed». Удаление файла DSN и создание нового решает проблему.
  5. Мы пробовали использовать два разных драйвера (SQL Server и SQL Server Native Client 10), и в обоих случаях проблема остается.
  6. Также мы попытались поместить файл доступа на тот же компьютер, что и SQL Server, и проблема остается.
  7. Мы увеличили время ожидания ODBC для всех запросов с 60 до 180 секунд, но проблема все еще остается.
  8. Нам не нужно ждать, чтобы увидеть ошибку, она появляется менее чем за одну секунду после выполнения задачи.

Мы были бы очень рады, если бы кто-нибудь помог нам найти решение этой проблемы.

Ответы [ 4 ]

1 голос
/ 02 декабря 2010

После двух месяцев исследований мы нашли одно решение - перейти с DAO на ADO. Это ответ MS дал мне:

Я хотел бы сообщить вам, что реализация обходного пути (с использованием ADO вместо DAO) может занять меньше времени, чем попытка выяснить, почему DAO, похоже, не работает. Поэтому, возможно, было бы целесообразно использовать обходной путь вместо того, чтобы пытаться найти основную причину этой проблемы, тем более что она не кажется воспроизводимой.

Тем не менее, вот что я хотел бы, чтобы вы сделали дальше:

  1. Пожалуйста, замените файл DSN системным или пользовательским DSN.
  2. Используйте «обычный» драйвер ODBC для SQL-сервера вместо собственного драйвера.
  3. После создания пользовательского DSN заново свяжем все таблицы.
  4. В коде VBA используйте только явные объявления типов вместо неявных объявлений. Поэтому, пожалуйста, замените использование DAO. Перед объявлениями любых типов баз данных для явного создания объектов DAO. Например, замените следующее:

    Dim dbs As Database
    Dim rstAppend As Recordset
    К
    Dim dbs As DAO.Database
    Dim rstAppend As DAO.Recordset

1 голос
/ 24 мая 2012

Переключение с TCP / IP на именованные каналы в конфигурации клиента для драйвера ODBC для SQL Server помогло мне.

0 голосов
/ 29 августа 2018

У меня тоже была эта проблема. Я добавил DSN в базу данных SQL на вкладке User. Я заметил, что это работает на моей системе разработки, и это единственное отличие, которое я смог найти. После создания DSN на ПК пользователя все заработало.

0 голосов
/ 26 сентября 2010

Следует обратить внимание на настройку DNS (DNS не DSN!) В конфигурации сети для рабочих станций.

Пару лет назад у меня был клиент, который сталкивался со спорадическими отключениями ODBC, такими какнекоторых пользователей, и оказалось, что первичный DNS был настроен так, чтобы указывать на DNS интернет-провайдера.Это хорошо работало для Интернета, но интернет-провайдер ничего не знал о внутреннем IP-адресе клиента SQL Server.Изменение основного DNS для указания на локальный контроллер домена (который действовал как локальный DNS) навсегда решило проблему.

Возможно, это не является причиной вашей проблемы, но ее стоит посмотреть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...