0

Delphi からいくつかのストアド プロシージャを呼び出す必要があります。これらは関連しているため、トランザクションを使用する必要があります。
ただし、呼び出されると常にエラーが返されます。

'トランザクションは、このカーソル タイプの複数のレコードセットを持つことはできません。カーソルの種類を変更するか、トランザクションをコミットするか、レコードセットの 1 つを閉じてください。

このエラーは、MS Access を使用している場合、MS SQL SERVER 2008 でのみ発生します。正常に動作します。
どうしたの ?

前もって感謝します

アップデート :

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; 
4

2 に答える 2

1

ここから:

解像度:

別の種類のカーソルを使用するか、カーソル位置を adUseClient に変更するか、最初のレコードセットを閉じてから、同じ接続/トランザクションで別のレコードセットを開きます。

原因:

SQL Server は接続ごとに一度に 1 つのアクティブなステートメントしか処理できないため、SQL Server は 1 つの接続で一度に 1 つの ForwardOnly カーソルしか開くことができません。

1 つの Connection で一度に複数の ForwardOnly ADO レコードセットを開こうとすると、最初の ADO レコードセットだけが Connection オブジェクトで実際に開かれます。後続の ForwardOnly カーソルに対して、新しい個別の接続が作成されます。

トランザクションは単一の接続上にあります。1 つのトランザクション内で複数の ForwardOnly レコードセットを開こうとすると、ADO はトランザクションの接続で複数の ForwardOnly レコードセットを開こうとします。SQL Server では、1 つの接続で 1 つの ForwardOnly レコードセットしか許可されないため、エラーが発生します。エラーは手動トランザクション内にあるため、上記のエラーが表示される場合があります。Microsoft Data Access Objects 2.1 Service Pack 2 以降のバージョンの MDAC には、より詳細なエラー メッセージが含まれています。そのため、上記の 2 番目または 3 番目のより有益なエラー メッセージが表示される場合があります。

于 2010-08-30T11:20:46.550 に答える
-1

[eoExecuteNoRecords]ExecuteOptionsに含めてみてください。

于 2010-09-02T23:42:38.707 に答える