2010-08-30 17 views
0

J'ai besoin d'appeler certaines procédures stockées de Delphi et parce qu'ils sont liés, je dois utiliser des transactions.
Mais elle retourne toujours une erreur lorsqu'il est appelé:Problème lors de l'utilisation de la transaction dans Delphi lors de l'appel à MS SQL Server 2008 R2?

« Transaction ne peut pas avoir plusieurs enregistrements avec ce type de curseur. Modifiez le type de curseur, validez la transaction ou fermez l'un des jeux d'enregistrements.

Et cette erreur se produit uniquement pour MS SQL Server 2008, lorsque j'utilise MS Access Cela fonctionne très bien.
Quel est le problème?

Merci à l'avance

MISE À JOUR:

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; 
+0

pouvez-vous poster le code incriminé? –

Répondre

1

De here:

Résolution:

Utilisez un autre type de curseur, modifier l'emplacement du curseur à adUseClient ou fermez le premier jeu d'enregistrements avant en ouvrant un autre sur le même connexion/transaction.

cause:

SQL Server ne peut ouvrir un curseur ForwardOnly à la fois sur une connexion , parce que SQL Server peut traiter qu'une seule instruction active à un moment par connexion.

Lorsque vous essayez d'ouvrir plus d'un ForwardOnly ADO d'enregistrements à la fois sur une seule connexion, seule la première ADO d'enregistrements est réellement ouvert sur l'objet de connexion. De nouvelles connexions séparées sont créées pour les curseurs ForwardOnly suivants. Une transaction est effectuée sur une connexion unique. Lorsque vous tentez d'ouvrir plus d'un jeu d'enregistrements ForwardOnly dans une transaction unique, ADO tente d'ouvrir plus d'un jeu d'enregistrements ForwardOnly sur la connexion de la transaction. Une erreur se produit car SQL Server uniquement autorise un jeu d'enregistrements ForwardOnly sur une connexion unique . Parce que l'erreur est dans une transaction manuelle, vous pouvez voir l'erreur ci-dessus. Microsoft Data Access Objects 2.1 Service Pack 2 et les versions ultérieures de MDAC contiennent messages d'erreur plus informatifs. Pour cette raison, vous pouvez voir le message informatif deuxième ou troisième erreur , ci-dessus.

+0

je tous les types de Curser, mais aucun d'entre eux travaillaient: Non spécifié, OpenForwardOnly, keyset, dynamique, statique – Scarlet