Ошибка: Строка не может быть найдена для обновления. Некоторые значения, возможно, были изменены с момента последнего прочтения. При смене поставщика с SQLOLEDB на MSOLEDBSQL

#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 в триггер помогло мне избежать этой ошибки.