Затронутые записи объектов команд ADO повреждены при переходе на SQL Server 2008

Моя компания находится в процессе переноса базы данных с SQL 2000 на SQL 2008. Я тестирую некоторые из наших устаревших приложений и наткнулся на приложение VB6, в котором обнаружена ошибка. Код пытается запустить простое обновление для записи и проверить, затронул ли метод Execute более одной строки, используя параметр RecordsAffected.

Код VB6

cmd.ActiveConnection = gcnADODE
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "Wendy_OffshoreQC_UpdateQCRecord"

Set QCID = cmd.CreateParameter("@QCId", adInteger, adParamInput)
QCID.value = 1
cmd.Parameters.Append QCID

Set QCBatchFailurePercentage = cmd.CreateParameter("@QCBatchFailurePercentage", adDecimal, adParamInput)
QCBatchFailurePercentage.Precision = 18
QCBatchFailurePercentage.NumericScale = 2
QCBatchFailurePercentage.value = 1.11
cmd.Parameters.Append QCBatchFailurePercentage

Set QCBatchCompleteDate = cmd.CreateParameter("@QCBatchCompleteDate", adDate, adParamInput)
QCBatchCompleteDate.value = Format(Now, "yyyy-mm-dd hh:mm:ss")
cmd.Parameters.Append QCBatchCompleteDate  
cmd.Execute numRecordsUpdate

success = numRecordsUpdate > 0

Хранимая процедура создает код

ALTER proc [dbo].[Wendy_OffshoreQC_UpdateQCRecord]
  @QCId int
 ,@QCBatchFailurePercentage decimal (18,2)
 ,@QCBatchCompleteDate smalldatetime

AS

UPDATEtblQC
SET
  QCBatchFailurePercentage=@QCBatchFailurePercentage 
 ,QCBatchCompleteDate=@QCBatchCompleteDate
WHERE
 QCID=@QCId

Я не уверен, какое соединение ADO в конечном итоге использует. Внешний поставщик — это поставщик OLE DB для SQL Server, но в расширенных свойствах диска указан SQL Server. Я собираюсь попытаться исправить часть кода, чтобы он соответствовал используемому драйверу.

Provider=SQLOLEDB.1;Password=1234;Extended 
Properties="driver={SQL Server};uid=username;database=db;
server=server";Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;
Workstation ID=PICASWS186;Use Encryption for Data=False;Tag with column collation when 
possible=False

Однако numRecordsUpdate всегда возвращает -1 вместо 1, как это было в SQL 2000. Я знаю, что могу изменить хранимую процедуру, чтобы она возвращала @@rowcount, или просто удалить проверку на успех, но есть и другие части кода с этим шаблоном, которые имеют аналогичная проблема.


person Gariig    schedule 11.01.2010    source источник


Ответы (1)


Я не знаю, есть ли лучший ответ, чем использовать SET NOCOUNT ON в хранимой процедуре и использовать параметр OUTPUT для возврата @@ROWCOUNT.

Возможно, вы могли бы попробовать использовать другого поставщика — вы в настоящее время используете ADO.net, OLEDB или SQL Native Client? Смена провайдера может помочь, так как я знаю, что SET NOCOUNT ON раньше вызывал проблемы с ADO.net.

person Aaron Bertrand    schedule 11.01.2010
comment
Я использую собственный клиент SQL Server. - person Gariig; 12.01.2010
comment
Итак, вы пытались изменить хранимую процедуру, включив в нее SET NOCOUNT ON; перед выполнением обновления? Это кажется неинтуитивным, но я думаю, что может быть дело в том, что сообщение, на которое влияет 1 строка (строки), мешает. - person Aaron Bertrand; 13.01.2010