#sql-server #vba #ms-access #adodb #sqloledb
#sql-сервер #vba #ms-доступ #adodb #sqloledb
Вопрос:
При смене поставщика с SQLOLEDB на MSOLEDBSQL в строке подключения ADODB мы получаем ошибку:
-2147217864 Строка не может быть найдена для обновления. Некоторые значения, возможно, были изменены с момента последнего прочтения.
Строка подключения является:
Provider=MSOLEDBSQL;SERVER=servername;APP=Applicationname;DATABASE=databasename;WSID=id;Trusted_Connection=yes;MARS Connection=True;DataTypeCompatibility=80
И код выглядит так:
Dim rs As ADODB.Recordset Set rs = New ADODB.Recordset rs.CursorLocation = adUseClient rs.Open("SELECT * FROM tableName WHERE 1 = 2", Adoconnection, adOpenStatic, adLockBatchOptimistic, CommandTypeEnum.adCmdText) rs.AddNew 'Add the fields ... ... rs.UpdateBatch ''this line throws error
Теперь, когда в строке подключения поставщика изменяется на SQLOLEDB, с тем же кодом он отлично работает без каких-либо проблем.
Комментарии:
1. Тогда зачем использовать MSOLEDBSQL?
2. Как говорит Microsoft, «SQLOLEDB больше не поддерживается, и не рекомендуется использовать этот драйвер для новой разработки». и MSOLEDBSQL предоставляет обновления для системы безопасности, совместимость с типами данных, функции mars и многие другие
Ответ №1:
Попробуйте добавить в таблицу метку времени или так называемый столбец «rowversion». (используйте метку времени типа, которая имеет НУЛЕВОЕ отношение ко времени).
Кроме того, если у вас есть какие-либо битовые столбцы в этой таблице, убедитесь, что они не являются нулевыми, и убедитесь, что для этого битового столбца установлено значение по умолчанию (0).
И если приложение имеет связанные таблицы, то повторно свяжите свои таблицы после того, как вы сделали вышеуказанное изменение на стороне сервера.
Комментарии:
1. У нас уже есть метка времени или так называемый столбец «rowversion»:), и ни один из битовых столбцов не имеет значения null, все имеют значение по умолчанию.
2. Если это вызывается из формы, то прямо перед приведенным выше кодом выполните меня. Dirty = false, а затем запустите свой код.
Ответ №2:
Я обнаружил проблему, она была в триггерах SQL.
В соответствующей таблице были некоторые инструкции по обновлению триггера. Добавление SET NOCOUNT ON
непосредственно перед инструкцией update в триггер помогло мне избежать этой ошибки.