Проблема с использованием транзакции в Delphi при вызове на MS SQL Server 2008 R2?

StackOverflow https://stackoverflow.com/questions/3599825

Вопрос

Мне нужно назвать несколько сохраненных процедур из 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; 
Это было полезно?

Решение

От здесь:

разрешение:

Используйте другой тип курсора, измените местоположение курсора в ADUSECLIND или закройте первую запись, прежде чем открывать другой в том же соединении / транзакциях.

Причина:

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

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

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

Другие советы

Попробуйте с включением EOEXECUTENORECORDS в ExecuteOptions..

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top