Announcement

Collapse
No announcement yet.

Zwei Datareader auf eine SQLConnection

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

  • Zwei Datareader auf eine SQLConnection

    Guten Tag,

    ich habe erst letzte Woche begonnen ein wenig mit .NET zu arbeiten. Ich verwende Visual Studio .NET aber ich denke für meine Frage ist das eher uinteressant.

    Ich habe eine SQL-Connection auf einen SQL-Server, die heißt "SQLConnection1".

    Um nun Daten aus der Datenbank zu holen, erzeuge ich eine SQLCommand "SQLCommand1" und gib diesem Objekt einen CommandText mit und sage auch mit SQLComand1.Connection = SQLConnection1, dass es mit der Connection arbeiten soll.

    Nun übergebe ich einem SQLDataReader "SQLDataREader1" ein Ergebnis mit SQLCommand1.ExcecuteReader ().

    Während ich mit "While SQLDataReader1.Read" die Daten auslesen, möchte ich mit dem Daten, die hier erhalte weitere Abfragen starten mit einem Weiteren Command und einem Weitren Reader. Zb.:

    SQLConnection1.Open ()

    SQLComand1.Connection = SQLConnection1
    SQLComand1.CommandText = "select irgendwas from irgendwas;"

    SQLReader1 = SQLComand1.ExecuteReader()

    While SQLReader1.Read
    DIm erg as String = SQLREader.getValue(0)
    SQLComand2.Connection=SQLConnection1
    SQLComand2.ComandText = "select irgendwas from irgendwo where irgendwas='" & erg & "';"
    SQLReader2 = SQLCommand2.EXcecuteReader ()

    'Auslesen der Daten usw
    ...
    'Schliessen der Verbindung
    SQLReader2.Close
    End While

    Mein Problem liegt aber darin, dass währen der Laufzeit ein Fehler auftritt: Ein DataReader ist zur Zeit dieser COnnection zugewiesen, es kann keine Weitere Verbidnung hergestellt werden.

    In anderen Umgebungen (Java, PHP) kann ich gleichzeitig mehrere Resultsets auf eine Connection offen haben.

    Bin ich hier nur zu blöd, oder geht das in .NET anders.

    Grüße

    Paule

  • #2
    Hallo,
    im Gegensatz zu ADO spaltet ADO.NET 1.x <b>nicht</b> mehr automatisch neue Verbindungen zur gleichen Datenbank ab, wenn die bestehende Datenbank-Sitzung noch eine aktive Abfrage offen hat. Somit muss in ADO.NET 1.x der SqlDataReader zuerst geschlossen werden, damit eine neue Abfrage starten kann.

    Erst in ADO.NET 2.0 in Verbindung mit dem MS SQL Server 2005 (Multiple Active Resultsets) entfällt diese Einschränkung, dort können mehrere DataReader gleichzeitig die gleiche Datenbank-Sitzung verwenden. Somit verhält sich erst ADO.NET 2.0 wieder so wie früher

    Comment


    • #3
      Dann würde mich aber interessieren, ob es eine Möglichkeit gibt, diese Einschränkung auf einem anderen Weg zu umgehen.

      Hat jeder Programmierer in der schönen neuen Welt .NET nur noch eine Abfrage zum Server gleichzeitig offen???

      Ich gehe auch schwer davon aus, dass nicht jedes mal eine neue Connection zum Server geöffnet wird, um eine neue Abfrage zu senden. Das wäre ja noch hirnrissiger.

      Grüße

      Lendrate

      Comment


      • #4
        Guten Tag,

        ich habe jetzt mal das .NET Framework 2.0 Beta installiert, aber leider hat sich das Verhalten im Bezug auf den SQL Server nicht verändert. Liegt dies dann daran, dass es nur auf dem SQL Server 2005 geht, oder muss ich, ähnlich wie bei Java, noch einen Pfad zum Framework setzen??

        Grüße

        Lendrate

        Comment


        • #5
          Hallo,
          &gt;... nur noch eine Abfrage zum Server gleichzeitig offen???
          In der Tat zielt .NET primär auf den Offline-Betrieb (Datenbankverbindung öffnen, SELECT ausführen, Ergebnismenge abholen, Datenverbindung schließen und wieder in den Datenbankverbindungs-Pool zurücklegen) ab. Anstelle über 2 SqlDataReader in einer Schleife Satz für Satz zu lesen, würde die Ergebnismenge der 1. Abfrage im DataSet abgelegt, so dass die Datenbankverbindung sofort wieder frei wird.
          <br>
          &gt;...dass es nur auf dem SQL Server 2005 geht...
          Ja, denn zur sauberen Transaktions-Kapselung sind auf der Server-Seite einige Erweiterungen notwendig

          Comment


          • #6
            >Mein Problem liegt aber darin, dass währen der Laufzeit ein Fehler auftritt:
            >Ein DataReader ist zur Zeit dieser COnnection zugewiesen, es kann keine Weitere Verbidnung hergestellt werden.
            >In anderen Umgebungen (Java, PHP) kann ich gleichzeitig mehrere Resultsets auf eine Connection offen haben.

            Diese Einschränkung ist mir auch schon unangenehm aufgefallen. Ich habe mehrere Provider ausprobiert (mssql, odbc, oledb) und das Problem besteht bei allen. In NET 2.0 ist es zwar gelöst - aber nur für SQL Server 2005.
            Es ist mir unverständlich warum MSFT nicht mehrere Datenströme innerhalb einer DB-Verbindung zuläßt. Mit ODBC war das ja schon immer möglich. Wie oben angemerkt hat JDBC diese Einschränkung nicht. Weder die JDBC-ODBC-Bridge noch die reinen JDBC-Treiber. Lustig ist daß auch die Mono-Implementierung von System.Data.Odbc mehrere aktive Resultsets zuläßt. Warum hat das Microsoft nicht hinbekommen?

            Wenn man mit dieser Einschränkung leben muß gibt es für den obigen Fall nur 2 (sehr ungünstige) Lösungen.
            -das ganze resultset der ersten Abfrage in den Hauptspeicher einlesen (DataSet) bevor man weitere Abfragen ausführt
            -Zwei DB-Verbindungen öffnen

            Comment

            Working...
            X