Announcement

Collapse
No announcement yet.

AdoDataset Verlorene Transaktion

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • AdoDataset Verlorene Transaktion

    habe ein Problem mit TAdoDataset. Erhalte beim Speichern oder Löschen die Fehlermeldung: "ITransaction::Commit oder ITransaction::Abbruch wurde aufgerufen und das Objekt ist stillgelegt."

    TAdoDataset.cursorlocation steht auf clUseServer

    wenn es auf clUseCLient steht entstehen andere Probleme insbesondere bei Joins.

    Kennt jemand diese Problem und kann mir helfen?

  • #2
    Hallo,

    um welche Datenbank handelt es sich um welcher OLE DB-Provider wird für den Zugriff auf diese Datenbank genutzt?

    Wie sieht ein kurzes Beispiel aus, mit dem dieser Effekt jederzeit reproduziert werden kann? Wurden die TADODataSet-Instanzen inklusive der Parameter bereits zur Entwicklungszeit im Objektinspektor konfiguriert

    Comment


    • #3
      Die Datenbank ist MS-SQL Version 8.0, zum OLE-DB Provider konnte ich keine Info finden. Die AdoDataset-Komponente wird dynamisch zur Laufzeit erzeugt - Wahrscheinlich liegt es daran - wenn nicht, schreibe ich ein kurzes Beispiel

      Comment


      • #4
        Hallo Thorsten,<br>
        das gleiche/selbe Problem habe ich auch. Es muss definitiv an der dyn. Erzeugung liegen, da ich dieses Problem mit den visuellen Komp. nicht reproduzieren kann. Es muss demnach eine Einstellungssache sein, aber welche Einstellungen? Konfiguriert ist das Ding wie im visuellen Bereich auch.<br>
        <br>
        Gruss,<br>
        Christia

        Comment


        • #5
          Hallo Herr Kosch,

          Mit folgendem Beispielprogramm läßt sich der Fehler reproduzieren. Wenn ich

          TAdoConnection(DB).Attributes := [xaCommitRetaining, xaAbortRetaining];

          mit

          TAdoConnection(DB).Attributes := [];

          ersetze und keine explizite Commits oder BeginTrans absetze, funktioniert alles bis auf das Löschen des letzten Datensatzes. Die Fehlermeldung lautet:

          "Entweder BOF oder EOF ist True, oder der aktuelle Datensatz wurde gelöscht. Der angeforderte Vorgang benötigt einen aktuellen Datensatz"

          Wir benötigen explizite Transaktionssteuerung aber in diesem Fall entsteht die anfangs beschriebene Problematik (verloren gegangene Transaktion beim Löschen).

          unit Unit1;

          interface

          uses
          Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
          ExtCtrls, DBCtrls, Grids, DBGrids, Db, Adodb;

          type
          TForm1 = class(TForm)
          DataSource1: TDataSource;
          DBGrid1: TDBGrid;
          DBNavigator1: TDBNavigator;
          procedure FormShow(Sender: TObject);
          private
          { Private-Deklarationen }
          public

          DB:TComponent;
          DSet:TDataset;
          lastInsertId:integer;

          { Public-Deklarationen }
          procedure ADOConBeforeDisconnect(Sender: TObject);
          procedure BPDSetAnredenAfterPost(DataSet: TDataSet);
          procedure BPDSetAfterDelete(DataSet: TDataSet);
          end;

          var
          Form1: TForm1;

          implementation

          {$R *.DFM}

          procedure TForm1.ADOConBeforeDisconnect(Sender: TObject);
          begin
          TAdoConnection(DB).Attributes:=[];
          //TAdoConnection(DB).CommitTrans;
          end;

          procedure TForm1.BPDSetAnredenAfterPost(DataSet: TDataSet);
          begin
          lastInsertId:=Dset.fieldByName('id').asInteger;
          //TAdoDataSet(DSet).connection.CommitTrans;
          end;

          procedure TForm1.BPDSetAfterDelete(DataSet: TDataSet);
          begin
          //TAdoDataSet(DSet).connection.CommitTrans;
          end;

          procedure TForm1.FormShow(Sender: TObject);
          var
          sql: TStringList;
          sqlHead,sqlOrderBy:string;
          begin
          sql := TStringList.Create;

          DB := TAdoConnection.Create(self);
          TAdoConnection(DB).ConnectionString :='Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=HADES;Data Source=IRIS';
          TAdoConnection(DB).Name := 'HadesDatenbankAdo';
          TAdoConnection(DB).LoginPrompt := false;
          //TAdoConnection(DB).Attributes := [xaCommitRetaining, xaAbortRetaining];

          TAdoConnection(DB).BeforeDisconnect := ADOConBeforeDisconnect;

          TAdoConnection(DB).connected:=true;

          //TAdoConnection(DB).BeginTrans;

          DSet:=TAdoDataSet.create(self);
          with TAdoDataSet(DSet) do
          begin
          connection:=TAdoConnection(DB);
          lockType:=ltOptimistic;
          cacheSize:=100;
          CursorLocation := clUseServer;
          end;

          DSet.AfterPost := BPDSetAnredenAfterPost;
          DSet.AfterDelete :=BPDSetAfterDelete;

          SQLhead := 'select id, bezeichnung, sys_delete, sys_locked, sys_insert, sys_update from anreden';
          SQLorderBy := 'bezeichnung';
          sql.add(sqlHead+' order by '+SQLOrderBy);

          TAdoDataset(DSet).commandType:=cmdText;
          TAdoDataset(DSet).commandText:=sql.text;

          Dset.Open;

          dataSource1.dataset:=Dset;

          sql.free;
          end

          Comment

          Working...
          X