#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 исправляет это.