Проблема с использованием транзакции в Delphi при обращении к MS SQL SERVER 2008 R2? - PullRequest
0 голосов
/ 30 августа 2010

Мне нужно вызвать некоторые хранимые процедуры из Delphi, и, поскольку они связаны, я должен использовать транзакции.
Но всегда вызывается ошибка при вызове:

'Транзакция не может иметь несколько наборов записейс этим типом курсора.Измените тип курсора, зафиксируйте транзакцию или закройте один из наборов записей. '

И эта ошибка возникает только для MS SQL SERVER 2008, когда я использую MS Access. Он работает нормально.
В чем проблема?

Заранее спасибо

ОБНОВЛЕНИЕ:

procedure TForm1.Button2Click(Sender: TObject);  
begin  
    if not DM.ADOConnection.InTransaction then  
        dm.ADOConnection.BeginTrans;  
    ADOQuery.LockType := ltBatchOptimistic;  
    ADOQuery.CursorType := ctUnspecified;  
    Try  
        with ADOQuery do  
        begin  
            Close;  
            SQL.Clear;  
            SQL.Text := 'INSERT INTO [UserAction] (UAct_Frm_ID,UAct_Type,UAct_Description'  
              +',UAct_Date,UAct_Time,UAct_Usr_ID)'
              +'VALUES(:UAct_Frm_ID'
              +',:UAct_Type,:UAct_Description,:UAct_Date,:UAct_Time'
              +',:UAct_Usr_ID)';
  Parameters.ParamByName('UAct_Frm_ID').Value := 1;
  Parameters.ParamByName('UAct_Type').Value := 1;
  Parameters.ParamByName('UAct_Description').Value := 'test by Q1';
  Parameters.ParamByName('UAct_Date').Value := completdate(datenow);
  Parameters.ParamByName('UAct_Time').Value := TimeToStr(Now);
  Parameters.ParamByName('UAct_Usr_ID').Value := 1;
  ExecSQL;
  end;
  Except
    DM.ADOConnection.RollbackTrans;
    ShowMessage('RollBack');
    Exit;
  End;
  dm.ADOConnection.CommitTrans;
  ShowMessage('Commite');
end; 

Ответы [ 2 ]

1 голос
/ 30 августа 2010

С здесь :

Разрешение :

Используйте другой тип курсора, измените местоположение курсора на adUseClient или закройтеПервый набор записей перед открытием другого в том же соединении / транзакции.

Причина :

SQL Server может одновременно открывать только один курсор ForwardOnly для подключения, поскольку SQL Server может обрабатывать только один активный оператор за один раз для подключения.

Когда вы пытаетесь открыть более одного набора записей ForwardOnly ADO одновременно на одном соединении, только первый набор записей ADO фактически открывается на объекте подключения.Новые отдельные соединения создаются для последующих курсоров ForwardOnly.

Транзакция выполняется на одном соединении.Когда вы пытаетесь открыть более одного набора записей ForwardOnly в одной транзакции, ADO пытается открыть более одного набора записей ForwardOnly при подключении транзакции.Произошла ошибка, поскольку SQL Server допускает только один набор записей ForwardOnly для одного подключения.Поскольку ошибка произошла в ручной транзакции, вы можете увидеть ошибку выше.Объекты доступа к данным Microsoft 2.1 с пакетом обновления 2 и более поздние версии MDAC содержат более информативные сообщения об ошибках.По этой причине вы можете увидеть более информативное второе или третье сообщение об ошибке выше.

0 голосов
/ 03 сентября 2010

Попробуйте включить [eoExecuteNoRecords] в ExecuteOptions .

...