Почему не удается получить доступ к таблице обновлений?

#sql-server #ms-access #odbc

Вопрос:

Доступ к интерфейсной части, серверной части SQL Server.

Простой запрос на обновление

 PARAMETERS ParamTransactionID Long, ParamVoidFlag Short; UPDATE tblTransaction  SET tblTransaction.VoidInProgressFlag = [ParamVoidFlag] WHERE (tblTransaction.TransactionID=[ParamTransactionID]);  

используя запрос здесь

 Set qdef = CurrentDb.QueryDefs("qUPD-tblTransaction_VoidInProgress") qdef.Parameters![ParamVoidFlag] = VoidFlag qdef.Parameters![ParamTransactionID] = TransactionID  qdef.Execute dbFailOnError   dbSeeChanges  qdef.Close  

дает

 [Microsoft][ODBC SQL Server Driver]Query timeout expired ODBC--update on a linked table 'tblTransaction' failed.  

Редактирование таблицы напрямую работает.
Открытие запроса и предоставление параметров работает.
Из приложения по-прежнему нет.

ОБНОВЛЕНИЕ
Удалило представление, не повлияло.
В старой версии теперь происходит тот же сбой, поэтому кажется, что это не проблема с кодом.
Единственное, что у нас общего, — это таблица, так что это может быть незначительное изменение, которое я там внес.
Я проверю и посмотрю, только ли это та таблица или вся база данных.
Но кажется странным, что я могу внести изменения, выполнив запрос напрямую, но получить другие результаты, выполнив его из кода.

ОБНОВЛЕНИЕ 2 Я подумал, что, возможно, это как-то связано с тем, что вся база данных каким-то образом доступна только для чтения, и это только первое место, куда она попадает. Но нет. Другие формы могут обновлять свои таблицы без проблем.
Таким образом, это выглядит связанным с конкретной таблицей. Но все равно кажется странным, что я могу прекрасно обновиться, просто выполнив запрос на обновление.

ОБНОВЛЕНИЕ 3 Чтобы упростить тестирование, я запускаю запрос из формы главного меню, а не просматриваю все формы, чтобы добраться до точки, где он завершается неудачей.
Работа с исходной схемой БД работала. Снова внес те же изменения, заменив NTEXT на VARCHAR(MAX), и он по-прежнему работает.
Вернемся к исходному столу, все еще работает.
Вернитесь ко всем формам, потерпите неудачу.
Таким образом, проблема, похоже, связана с одной из открытых форм.
Я еще раз пройдусь по этой последовательности.
Кроме того, это объясняет, почему он работает из запроса, а не из формы.
К сожалению, я не могу перейти к запросу, чтобы запустить его, пока форма открыта.

Комментарии:

1. У меня нет большого опыта работы с SQLServer. У меня есть SQLServer Express, просто чтобы посмотреть, смогу ли я заставить его работать. Оно делает. Я не использую запросы для обновления таблицы. Просто объект запроса или в VBA CurrentDb.Execute.

2. Он работал с ВЫБОРОМ и обновлял результаты. Это перестало работать, когда я добавил представление. Я переключил это на текущее заявление об ОБНОВЛЕНИИ. Все равно не работает. Я попробую удалить представление сегодня вечером и посмотрю, не изменит ли это что-нибудь.

3. Возможно ли, что VoidInProgressFlag на нем может быть ограничение на проверку, и значение, которое вы передаете через VoidFlag , не соответствует требованиям?

4. Вы не должны указывать параметр в качестве имени поля (идентификатор транзакции).

5. @Gustav исправил это.

Ответ №1:

Хорошо, первый вопрос: почему/как вы выбрали «Короткий» тип данных для параметра?

Это должно быть:

 PARAMETERS ParamTransactionID Long, ParamVoidFlag Bit; UPDATE tblTransaction  SET tblTransaction.VoidInProgressFlag = [ParamVoidFlag] WHERE (tblTransaction.TransactionID=[ParamTransactionID]);  

Вы также указываете, что этот запрос работает, когда вы запускаете его из пользовательского интерфейса.

Итак, в коде, тогда у вас есть это:

Убедитесь, что ВСЕ модули кода имеют явную опцию в начале, как это:

 Option Compare Database Option Explicit  

Итак, теперь ваш код должен быть:

 Dim qdef as DAO.QueryDef  Set qdef = CurrentDb.QueryDefs("qUPD-tblTransaction_VoidInProgress") qdef.Parameters![ParamVoidFlag] = VoidFlag qdef.Parameters![ParamTransactionID] = TransactionID  qdef.Execute dbFailOnError   dbSeeChanges  

Поэтому исправьте тип данных, который у вас есть для ParmaVoidFlag.

Кроме того, проверьте имя таблицы в левой панели нефа — это

 dbo_tblTransaction  

или

 tblTransaction.  

Кроме того, ОТКРОЙТЕ связанную таблицу в режиме конструктора — (игнорировать сообщение только для чтения). Посмотрите на типы данных. У вас ДОЛЖЕН быть определен PK — поэтому проверьте наличие PK.

Далее, на стороне sql server поля true/false НЕ ДОЛЖНЫ иметь значение по умолчанию null. Если они это сделают, то обновления завершатся неудачно. Поэтому в sql server убедитесь, что для рассматриваемой таблицы по умолчанию установлено значение 0.

И последнее, но не менее важное? Если запрос по-прежнему выдает ошибку, вам необходимо добавить метку времени (не дату и время) в таблицу sql server и повторно связать. Это потребуется/требуется, если какие-либо столбцы имеют плавающую точку.

После того, как вы добавите опцию явно в начало модуля кода, затем также в меню выполните отладку-gt;компиляция — убедитесь, что код компилируется.

Комментарии:

1. Спасибо за отличный список. Я справлюсь с этим. Очевидно, после Дня Благодарения.

Ответ №2:

Оказалось, что запрос не удался, если была открыта конкретная форма. Эта форма запрашивала ту же таблицу, но с моментальным снимком вместо динамического набора. Я не знаю, почему это блокирует стол. У него есть правильный ключ и индекс. Но Dynaset исправляет это.