Announcement

Collapse
No announcement yet.

TAdoConnection.BeginTrans -> TOleException

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

  • TAdoConnection.BeginTrans -> TOleException

    Hallo - habe folgendes Problem:

    Beim Versuch eine Transaktion zu starten (AdoConnection.BeginTrans) erhalte ich in meinem Projekt grundsätzlich eine EOleException
    (ErrorCode -2147168227 "Es kann keine neue Transaktion erstellt werden, da die Kapazität ausgeschöpft ist.")

    Vor dem Auftruf von BeginTrans hat das Attribut "InTransaction" den Wert false - IsolationLevel der TAdoConnection ist ilIsolated.

    Ich verwende Delphi5 Enterp. mit AdoUpdates, Win2k und MS SQL Server 2K.

    Was mache ich falsch?
    Für Hilfe wäre ich sehr dankbar - bisher konnte mir in keiner Newsgroup geholfen werden.

    Gruss Patrick

  • #2
    Hallo,

    >..bisher konnte mir in keiner Newsgroup geholfen werden.

    das wundert mich nicht, denn das ist ein sehr außergewöhnlicher Fehler - es sei denn, es sind so genannte <i>Nested Transactions</i> im Spiel. Was wird über ADO aufrufen? Ist das eine Stored Procedure, die selbst mit Transaktionen hantiert und/oder auf externe Datenbanken zugreift? Sind Trigger im Spiel, die in die Transaktionsverwaltung eingreifen?

    Was passiert, wenn eine INSERT-Anweisung auf eine frisch in der Datenbank <i>tempdb</i> angelegte Tabelle abgeschickt wird, tritt das Problem auch dann auf?

    P.S: Zur Fehlernummer <i>-2147168227</i> gehört laut <i>Winerror.h</i> der Fehlertext "<i>Eine Anforderung zum Herstellen einer Verbindung zum Transaktions-Manager wurde abgelehnt.</i>". Hat eventuell ein Scherzbold den DTC (Districuted Transaction Manager) als Dienst auf diesem Rechner angehalten?
    &#10

    Comment


    • #3
      Hallo,

      vielen Dank für die Antwort.

      -> ...es sei denn, es sind so genannte Nested Transactions im Spiel.

      Wir verwenden keine expliziten Nested Transactions. Beim ersten Aufruf von BeginTrans dürfte das aber ja sowieso noch unerheblich sein, oder? Und genau beim Auftruf von BeginTrans erhalten wir die EOleException.

      Kann es evtl. sein, dass ein zuvor abgeschicktes Kommando noch nicht vollständig abgearbeitet ist. Mir ist mal zu Ohren gekommen, dass ADO in Verbindung mit MS SQL 2K grundsätzlich asynchron arbeitet.

      Das ist die einzigste Stelle in unserer Anwendung an der explizit eine Transaktion mit BeginTrans geöffnet wird. Ich gehe davon aus, dass ADO automatisch erzeugte Transaktionen auch wieder korrekt beendet!?

      -> Hat eventuell ein Scherzbold den DTC (Districuted Transaction Manager) als Dienst auf diesem Rechner angehalten?

      Nein, hab' ich überprüft - der DTC läuft

      Comment


      • #4
        Hallo,

        was passiert bei dem folgenden Test:

        <b>A) MS SQL Server 2000-Datenbank tempdb</b>
        <pre>
        USE tempdb
        GO
        CREATE TABLE AutoIncTest (
        RecID INTEGER NOT NULL IDENTITY PRIMARY KEY,
        Info VARCHAR(20) NOT NULL,
        Datum DATETIME)
        GO
        </pre>
        <b>B) Aufruf im Delphi-Programm</b>
        <pre>
        uses ADOInt;

        resourcestring
        cConnStr = 'Provider=SQLOLEDB.1;Persist Security Info=False;' +
        'Integrated Security=SSPI;Initial Catalog=tempdb;Data Source=(local)';
        cSQLStr = 'INSERT INTO AutoIncTest (Info, Datum) VALUES (''%s'',''%s'')';

        procedure TForm1.Button1Click(Sender: TObject);
        var
        aConnection : _Connection;
        sSQL : WideString;
        vRecordsAffected : OleVariant;
        begin
        aConnection := CoConnection.Create;
        MemoLog.Lines.Add('CoConnection.Create');
        aConnection.CursorLocation := adUseClient;
        aConnection.Open(cConnStr, '', '', 0);
        MemoLog.Lines.Add('CoConnection.Open');
        aConnection.BeginTrans;
        MemoLog.Lines.Add('Connection.BeginTrans');
        sSQL := Format(cSQLStr,['Test','14.01.2003']);
        aConnection.Execute(sSQL, vRecordsAffected, adExecuteNoRecords);
        MemoLog.Lines.Add(Format('CoConnection.Execute -> %s Rows Affected',
        [vRecordsAffected]));
        aConnection.CommitTrans;
        MemoLog.Lines.Add('Connection.CommitTrans');
        aConnection := nil;
        MemoLog.Lines.Add('... Connection getrennt.');
        end;
        </pre>
        &#10

        Comment


        • #5
          Hallo,

          -> ...was passiert bei dem folgenden Test:

          Der Test läuft fehlerfrei!

          Könnte es sein, dass in unserem Projekt zuvor implizit gestartete Transaktionen von ADO nicht korrekt beendet wurden

          Comment


          • #6
            Hallo,

            in diesem Fall würde ich zuerst vom Profiler mitprotollieren lassen, welche Anweisungen in welcher Reihenfolge beim SQL Server eintreffen. Speziell geht es darum, ob dort <i>SET IMPLICIT_TRANSACTIONS ON</i>-Anweisungen (mit der Server-Quittierung <i>implicit_transaction</i>) und <i>IF @@TRANCOUNT > COMMIT TRAN</i>-Anweisungen erscheinen. Im Profiler würde ich mir auch die <b>TransaktionID</b>- und <b>NestLevel</b>-Daten (siehe Dialog <i>Ablaufverfolgungseigenschaften</i> | Registerseite <i>Ereignisse</i> und Registerseite <i>Datenspalten</i>) mit auflisten lassen. Anhand dieser beiden Werte lässt sich klären, ob da was offen bleibt

            Comment

            Working...
            X