2014-09-16 1 views
0

Недавно я получил доступ к 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

+1

Вы пытались взять фактический сгенерированный запрос и запустить его в SSMS? – jac

+0

@jac Мы вытащили запрос из SQL Profiler и выполнили его через SSMS, и он прошел нормально. Запись была правильно обновлена ​​с указанными значениями. Полученный запрос завершил выполнение sp_prepexec с помощью строки запроса. –

+0

Является ли дополнительное пространство внутри цитат преднамеренным для «DateCreated», или это просто опечатка? – tgolisch

ответ

0

Я нашел проблему в настройках подключения по умолчанию сервера.

Когда SQL Server 2012 был установлен на новом оборудовании, NO COUNT, QUOTED IDENTIFIER и ANSI NULL Default On были включены в качестве параметров подключения по умолчанию. NO COUNT вызывал проблемы для моделей доступа к данным ADO и Linq to SQL. Как только этот параметр по умолчанию был удален, все стало нормально работать.

Так что это не проблема обновления ADO или SQL Server 2012, это может произойти при любой новой установке SQL Server.

В качестве побочного примечания третья система, в которой я тестировалась, которая использует Entity Framework, не обнаружила проблем с включенным NO COUNT и запускалась нормально.

 Смежные вопросы

  • Нет связанных вопросов^_^