Announcement

Collapse
No announcement yet.

Transaktion "ODBC-Aufruf fehlgeschlagen"

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

  • Transaktion "ODBC-Aufruf fehlgeschlagen"

    Hallo,
    folgende Situation:

    MSDE Server

    ODBC Datenquelle--> System DNS auf MSDE

    Access 2000 MDB

    verknüpfte Tabellen zum ODBC Treiber


    Bei der unten stehenden Routine wird das 1. Execute ausgeführt und bei der
    2. kommt ein Fehler. "ODBC-Aufruf fehlgeschlagen"
    Außerdem ist die gesamte Tabelle dbo_TblXXX gesperrt.(kein öffnen möglich)

    Das Phänomen ist wenn ich das Formular mit dieser Routine
    allein Aufrufe dann klappt es.
    Wenn ich jedoch noch ein paar andere gebundene Formulare
    offen habe dann klappt es nicht.

    Ich bin total verzweifelt, habe alles ausprobiert.
    An die maximalen Verbindungen kann es doch nicht liegen oder?



    Public cnnAktuDB As New ADODB.Connection
    Private SQL As String


    If cnnAktuDB.State <> adStateOpen Then

    Set cnnAktuDB = CurrentProject.Connection

    End If


    cnnAktuDB.BeginTrans


    SQL = "UPDATE dbo_TblXXX " & _
    "Set Kosten = '10',Kennzeichen = 0 " & _
    "WHERE AusIDSKost <> 0 AND Kennzeichen = 999"

    ' SQL ausführen
    cnnAktuDB.Execute SQL, , adExecuteNoRecords

    SQL = "UPDATE dbo_TblXXX " & _
    "Set Kosten = '-10',Kennzeichen = 0 " & _
    "WHERE InIDSKost <> 0 AND Kennzeichen = 999"

    ' SQL ausführen
    cnnAktuDB.Execute SQL, , adExecuteNoRecords

    cnnAktuDB.CommitTrans

  • #2
    Hallo,

    Außerdem ist die gesamte Tabelle dbo_TblXXX gesperrt.
    bei den ADO-Objekten hat Microsoft den Komfort in den Vordergrund gestellt, da ADO damals für die Zielgruppe der "ASP-Entwickler" (Webseiten) passen sollte. Anstelle den Entwickler mit einer Fehlermeldung "zu nerven", korrigiert ADO bestimmte Probleme automatisch im Hintergrund. Ein Beispiel ist das automatische Öffnen einer zusätzlichen Datenbankverbindung (2. Instanz des Connection-Objekts von ADO), wenn die bestehende Datenbankverbindung bereits von einer anderen SQL-Anweisung belegt ist. Dieser Komfort führt im Worst Case dazu, dass im Programm verschiedene Transaktionen gleichzeitig aktiv sind, die sich gegenseitig behindern.

    Über die Leistungsanzeige von Windows kann dieses Verhalten (das automatische Öffnen von zusätzlichen Datenbankverbindungen) gut beobachtet werden, wenn dort der entsprechende Leistungsindikator ausgewählt wird.

    Erst mit ADO.NET hat Microsoft dieses (gut gemeinte, aber in der Summe nachteilige) Verhalten korrigiert. In ADO.NET wird sofort eine Exception ausgelöst, wenn die bestehende Leitung belegt ist und die MARS-Option nicht eingeschaltet wurde.

    Um das Problem in der ADO-Anwendung zu lösen, sollte jedes Formular seine eigene Datenbankverbindung öffnen und nach Gebrauch wieder schließen. Auch mit ADO steht im Fall der OLE DB-Provider der automatische Datenbankverbindungs-Pool zur Verfügung, so dass mit dem ständigen Öffnen/Schließen des Connection-Objekts von ADO keine zeitlichen Nachteile verbunden sind.

    Comment


    • #3
      Hallo,
      danke ersteinmal für die Antwort.
      Also ich habe gestern in meiner Verzweifelung den MSDE deinstalliert und mal den MS SQL Server 2005 Express installiert. Das Resultat war das plötzlich alles funktionierte. Das würde bedeuten das tatsächlich das maximale Verbindungslimit überschritten wurde oder ? Um nochmal ein wenig auf meine Datenbank einzugehen. Also die Formulare sind teilweise direkt an den Tabellen gebunden und werden mit einen Filter geöffnet. An bestimmten Stellen wird im Code auch noch DAO verwendet um Sachen abzuspeichern bzw ein Recordset zu durchlaufen. Da ich persönlich mehr Wert auf ungebundene Formulare lege, laufen alle meine Weiterentwicklungen über DAO. Als ich dann aber eine Funktion geschrieben habe, die sehr viele SQL Befehle ausführt, wollte ich sicherstellen das diese auch alle ausgeführt werden. Somit kam ich auf Transaktionen. Beim testen kam dann aber heraus das im Multiuserbetrieb Transaktionen nicht wirklich brauchbar sind, da diese nicht getrennt ablaufen. Also der Weg zum ADO.

      Ich habe eine öffentliche ADO Verbindung sowie ein Recordset deklariert.
      Recordsets werden und sollten auch immer geschlossen werden nach gebrauch.
      Was die Verbindung angeht die bleibt die ganze Zeit offen. Die Verbindung jedesmal zuvor aufbauen dauert immer ein klein wenig, womit ich "keine zeitlichen Nachteile verbunden" nicht bestätigen kann.

      "OLE DB-Provider der automatische Datenbankverbindungs-Pool zur Verfügung" ?
      Könntest Du mir das mal ein wenig genauer erklären.

      Um jetzt nochmal auf das eigentliche Problem zurück zu kommen.
      Der Code soll in Verbindung mit dem MS SQL Server 2000 laufen.
      Ich hatte daher den MSDE 2000 als Testumgebung wo jedoch das Problem zu stande kam. Wie kann ich das jetzt aber interpretieren das auf dem Express alles funktioniert ? Wird das auf dem 2000 Server dann auch der Fall sein ?


      Gruß Micha

      Comment

      Working...
      X