Недавно я получил доступ к SQL Server 2012, чтобы проверить наши текущие веб-приложения, чтобы выявить любые проблемы, которые могут возникнуть при обновлении нашего текущего SQL-запроса Сервер 2008.ADODB.Recordset.Update возвращает ошибку после обновления с SQL Server 2008 до SQL Server 2012
Одна из наших систем - это решение стороннего поставщика, которое использует соединения ODBC и объекты ADO RecordSet для связи с базой данных.
Когда я соединил эти приложения к SQL Server 2012, я начал получать следующее сообщение об ошибке:
Query-based update failed because the row to update could not be found
Я работал с нашим АБДОМ получить трассировку файлов из той же процесса коды как на SQL Server 2008 и SQL Server 2012, и все выглядит точно так же. Я также убедился, что данные существуют в базе данных до того, как код будет выполнен. Установка базы данных на совместимость с SQL Server 2008 также не сработала.
К сожалению, у нас нет возможности изменить исходный код приложения для внесения любых изменений кода. Система очень устарела, и я считаю, что контракт на поддержку закончился.
В результате я ожидаю, что нам придется придерживаться SQL Server 2008, но я надеюсь, что у кого-то появятся идеи относительно того, почему SQL Server 2012 может привести к тому, что метод ADO RecordSet.Update()
будет вести себя по-другому.
Код абсолютный беспорядок, но вот суть метода, который я смог извлечь из DLL-файлов:
private void update(ADODB.Connection xConn)
{
ADODB.Recordset recordset = new RecordsetClass();
//simplified query, it's actually auto-generated based on configuration values
string query = "SELECT ID, DateModified, DateCreated FROM table WHERE ID = 1";
recordset.Open(query, xConn, CursorTypeEnum.adOpenForwardOnly, LockTypeEnum.adLockOptimistic, Convert.ToInt32(CommandTypeEnum.adCmdText));
try
{
if (recordset.EOF)
{
throw new Exception("Invalid/missing policy record for id " + id.ToString());
}
recordset.Fields["DateModified"].Value = value1;
recordset.Fields["DateCreated"].Value = value2;
//Other column updates
if (!HasOpenTransaction)
{
xConn.BeginTrans();
}
try
{
//Throws the exception with SQL2012
recordset.Update(Type.Missing, Type.Missing);
if (HasOpenTransaction)
{
xConn.CommitTrans();
flag2 = true;
}
}
finally
{
if (HasOpenTransaction && !flag2)
{
xConn.RollbackTrans();
}
}
}
finally
{
recordset.Close();
}
}
EDIT: я, наконец, перешел на следующее веб-приложение, которое использует Linq to SQL с файлами данных DBML. Это похоже на аналогичную проблему. Когда мы тянем вниз запись, обновить его, а затем вызвать db.SubmitChanges()
, генерируется исключение со следующим сообщением:
Row not found or changed
Вы пытались взять фактический сгенерированный запрос и запустить его в SSMS? – jac
@jac Мы вытащили запрос из SQL Profiler и выполнили его через SSMS, и он прошел нормально. Запись была правильно обновлена с указанными значениями. Полученный запрос завершил выполнение sp_prepexec с помощью строки запроса. –
Является ли дополнительное пространство внутри цитат преднамеренным для «DateCreated», или это просто опечатка? – tgolisch