Thomas: Mehrere RecordSet in SQL

Hallo!

Ich habe mal wieder ein kleines problem mit sql!

Und zwar gibt es eine Möglichkeit in einer FOR - Schleife mehrere Recordsets zu definieren.

Bsp:

For i = 1 To Anzahl
 Set (RS & i) = Server.CreateObject("ADODB.RecordSet")
Next

So oder so ähnlich sollte es aussehen, natürlich ist die Art der Schleife egal, hauptsache ich kann beliebig viele (Anzahl wird vom User eingegeben) deklarieren!

Vielen Dank für euere Hilfe!

Thomas

  1. Hallo Thomas,

    Und zwar gibt es eine Möglichkeit in einer FOR - Schleife mehrere Recordsets zu definieren.

    Bsp:
    For i = 1 To Anzahl
    Set (RS & i) = Server.CreateObject("ADODB.RecordSet")
    Next

    So oder so ähnlich sollte es aussehen, natürlich ist die Art der Schleife egal, hauptsache ich kann beliebig viele (Anzahl wird vom User eingegeben) deklarieren!

    keine Ahnung, wie viele Objektinstanzen dieser Klasse maximal nebeneinander bestehen können, aber theoretisch kann man so etwas machen (wie Du das mit der dynamischen Namensvergabe regeln willst, überblicke ich allerdings nicht). Grundsätzlich gefällt mir dieser Ansatz aber gar nicht, da auf jeden Fall der Server stark belastet wird.

    Ich gehe davon aus, daß jedes dieser Recordsets in Abhängigkeit vom Schleifenstand jeweils eine neue Recordquelle (source, 'SQL') haben soll. Dann schlage ich einen anderen Ansatz vor:

    Set RS = Server.CreateObject("ADODB.RecordSet")
    For i = 1 To Anzahl
      stSQL = Anweisung(i)
      RS.Open stSQL, Connection ...
      mach mit RS irgendwas
      RS.Close
    Next
    Set RS = nothing

    Damit hast Du nur _eine_ Objektvariable, der bei jedem Durchlauf neue Daten zugewiesen werden.

    Grüße
    Uwe Nohl

    1. Hallo Thomas,

      Und zwar gibt es eine Möglichkeit in einer FOR - Schleife mehrere Recordsets zu definieren.

      Bsp:
      For i = 1 To Anzahl
      Set (RS & i) = Server.CreateObject("ADODB.RecordSet")
      Next

      So oder so ähnlich sollte es aussehen, natürlich ist die Art der Schleife egal, hauptsache ich kann beliebig viele (Anzahl wird vom User eingegeben) deklarieren!

      keine Ahnung, wie viele Objektinstanzen dieser Klasse maximal nebeneinander bestehen können, aber theoretisch kann man so etwas machen (wie Du das mit der dynamischen Namensvergabe regeln willst, überblicke ich allerdings nicht). Grundsätzlich gefällt mir dieser Ansatz aber gar nicht, da auf jeden Fall der Server stark belastet wird.

      Das ist mir schon klar!

      Ich gehe davon aus, daß jedes dieser Recordsets in Abhängigkeit vom Schleifenstand jeweils eine neue Recordquelle (source, 'SQL') haben soll. Dann schlage ich einen anderen Ansatz vor:

      Set RS = Server.CreateObject("ADODB.RecordSet")
      For i = 1 To Anzahl
        stSQL = Anweisung(i)
        RS.Open stSQL, Connection ...
        mach mit RS irgendwas
        RS.Close
      Next
      Set RS = nothing

      Damit hast Du nur _eine_ Objektvariable, der bei jedem Durchlauf neue Daten zugewiesen werden.

      Grüße
      Uwe Nohl

      Hallo!

      ich erkläre dir meine grundlegende Aufgabe!

      ich habe eine Datenbank, dann soll ich eine Tabelle auswählen(bis hier hin noch kein Problem). Danach soll der User auswählen können nach wie vielen Spalten er diese Tablle sortieren will! Das heißt, das dann auf der folgenden Seite erstmal nur die erste Spalte zu sehen ist die er am Anfang als erste Spalte ausgewählt hat. Wenn er auf der aktuellen Seite nun auf einen Wert klickt, sollen unter diesem Punkt nun alle werte stehen aus der zweiten Spalte die er ausgewählt hat, und zwar nur die, die auch zu dem ersten Punkt passen, ich muss aber die Liste aus der ersten Spalte noch weiterführen, so das ich dem RS keinen neuen Wert zuweisen kann, sonst wird die Liste mit den falschen Werten weitergeführt!

      Ich hoffe ich hab das einigermaßen anschaulich erklärt!

      Aber du hast mich mit deinem Meitrag auf eine andere Idee gebracht, die probier ich gleich mal aus.

      Wenn du mir trotzdem nochmal helfen kannst, wäre das super!

      MfG
      Thomas

      1. Hallo Thomas,

        ich habe eine Datenbank, dann soll ich eine Tabelle auswählen(bis hier hin noch kein Problem). Danach soll der User auswählen können nach wie vielen Spalten er diese Tablle sortieren will! Das heißt, das dann auf der folgenden Seite erstmal nur die erste Spalte zu sehen ist die er am Anfang als erste Spalte ausgewählt hat. Wenn er auf der aktuellen Seite nun auf einen Wert klickt, sollen unter diesem Punkt nun alle werte stehen aus der zweiten Spalte die er ausgewählt hat, und zwar nur die, die auch zu dem ersten Punkt passen, ich muss aber die Liste aus der ersten Spalte noch weiterführen, so das ich dem RS keinen neuen Wert zuweisen kann, sonst wird die Liste mit den falschen Werten weitergeführt!

        Ich hoffe ich hab das einigermaßen anschaulich erklärt!

        so wie ich dies und Deine Beschreibungen Markus gegenüber nun zu verstehen glaube, willst Du Deine Tabellendaten benutzergesteuert in einer (hierarchischen) Baumstruktur ausgeben. Dazu sollen in einer Schleife verschiedene, von den vorherigen aber _abhängige_ Recordsets erzeugt werden (weswegen diesen keine neuen Daten zugewiesen weden dürfen).
        Vielleicht kommst Du aber dabei trotzdem mit nur einer Objektvariablen aus. Man kann nämlich mit dem MSShape Provider hierarchische Datenstrukturen in shaped recordsets erzeugen. Wie das geht, steht in

        http://www.aspheute.com/artikel/20000627.htm

        ob dieser Artikel auf Deine Aufgabe übertragen werden kann, mußt Du schauen, ich hoff's aber.

        Aber du hast mich mit deinem Meitrag auf eine andere Idee gebracht, die probier ich gleich mal aus.

        Wenn du mir trotzdem nochmal helfen kannst, wäre das super!

        Wenn ich es kann, gerne

        Gruß aus dem heute mal sonnigen Mainz
        Uwe

        1. Hallo Thomas,

          ich habe eine Datenbank, dann soll ich eine Tabelle auswählen(bis hier hin noch kein Problem). Danach soll der User auswählen können nach wie vielen Spalten er diese Tablle sortieren will! Das heißt, das dann auf der folgenden Seite erstmal nur die erste Spalte zu sehen ist die er am Anfang als erste Spalte ausgewählt hat. Wenn er auf der aktuellen Seite nun auf einen Wert klickt, sollen unter diesem Punkt nun alle werte stehen aus der zweiten Spalte die er ausgewählt hat, und zwar nur die, die auch zu dem ersten Punkt passen, ich muss aber die Liste aus der ersten Spalte noch weiterführen, so das ich dem RS keinen neuen Wert zuweisen kann, sonst wird die Liste mit den falschen Werten weitergeführt!

          Ich hoffe ich hab das einigermaßen anschaulich erklärt!

          so wie ich dies und Deine Beschreibungen Markus gegenüber nun zu verstehen glaube, willst Du Deine Tabellendaten benutzergesteuert in einer (hierarchischen) Baumstruktur ausgeben. Dazu sollen in einer Schleife verschiedene, von den vorherigen aber _abhängige_ Recordsets erzeugt werden (weswegen diesen keine neuen Daten zugewiesen weden dürfen).
          Vielleicht kommst Du aber dabei trotzdem mit nur einer Objektvariablen aus. Man kann nämlich mit dem MSShape Provider hierarchische Datenstrukturen in shaped recordsets erzeugen. Wie das geht, steht in

          Die Idee ist nicht schlecht, da werd ich mich mal ein bißchen einarbeiten!

          Gruß aus dem heute mal sonnigen Mainz

          tja in Kaiserslautern ist im moment auch noch sonnig *juhu*

          ich wünsch dir noch viel Spass bei der heutigen Tour-Etappe

          danke für deine Hilfe

          Thomas

  2. Hallo Thomas,

    Ich habe mal wieder ein kleines problem mit sql!

    Und zwar gibt es eine Möglichkeit in einer FOR - Schleife mehrere Recordsets zu definieren.

    For i = 1 To Anzahl
    Set (RS & i) = Server.CreateObject("ADODB.RecordSet")
    Next

    Zunächst, hat das mit SQL garnichts zu tun. Du setzt in VBScript eine Objektvariable.

    Das obige Konstrukt würde schon laufen (ohne es getestet zu haben), aber ich halte so etwas für grob fahrlässig, da Du mit jedem Durchlauf wichtige Serverressourcen bindest die Du so mit Sicherheit nicht brauchst.

    hauptsache ich kann beliebig viele (Anzahl wird vom User eingegeben) deklarieren!

    Ok, ich bin Dein nichtsahnender User und gebe mal sagen wir 9999 ein.
    Ich glaube das mach ich zweimal, dann hast Du Deinen Provider am Hals, weil sein Server zweimal abgeschmiert ist und Du suchst Dir einen neuen Provider. Wetten?

    Viele Grüße aus Köln
    Markus

    1. Hallo Thomas,

      Ich habe mal wieder ein kleines problem mit sql!

      Und zwar gibt es eine Möglichkeit in einer FOR - Schleife mehrere Recordsets zu definieren.

      For i = 1 To Anzahl
      Set (RS & i) = Server.CreateObject("ADODB.RecordSet")
      Next

      Zunächst, hat das mit SQL garnichts zu tun. Du setzt in VBScript eine Objektvariable.

      Die Frage ist doch, Wie ich diese Setze!

      Das obige Konstrukt würde schon laufen (ohne es getestet zu haben), aber ich halte so etwas für grob fahrlässig, da Du mit jedem Durchlauf wichtige Serverressourcen bindest die Du so mit Sicherheit nicht brauchst.

      hauptsache ich kann beliebig viele (Anzahl wird vom User eingegeben) deklarieren!

      Ok, ich bin Dein nichtsahnender User und gebe mal sagen wir 9999 ein.
      Ich glaube das mach ich zweimal, dann hast Du Deinen Provider am Hals, weil sein Server zweimal abgeschmiert ist und Du suchst Dir einen neuen Provider. Wetten?

      Sorry, hab mich falsch ausgedrückt, du hast sagen wir mal 10 Spalten, dann kannst du auch nur maximal 10 Spalten eingeben.

      Viele Grüße aus Köln
      Markus

      MfG
      Thomas

      1. Hallo Thomas,

        Sorry, hab mich falsch ausgedrückt, du hast sagen wir mal 10 Spalten, dann kannst du auch nur maximal 10 Spalten eingeben.

        irgendwie verstehe ich ehrlich gesagt Dein Problem nicht (erst recht nach Deiner Beschreibung an Uwe).

        Ok, versuchen wir mal was ich soweit verstanden habe:

        Du öffnest ein Recordset mit einem Datenfeld, liest das in einer ASP-Seite aus und schließt das Recordset wieder. Danach geht Dein User hin und entscheidet welche/wieviel Spalte(n) noch zusätzlich angezeigt werden soll(en).

        Dann kannst Du doch das zuvor benutze und geschlossene Recordset wieder verwenden, oder nicht?

        Viele Grüße aus Köln
        Markus

        1. Hallo Thomas,

          Sorry, hab mich falsch ausgedrückt, du hast sagen wir mal 10 Spalten, dann kannst du auch nur maximal 10 Spalten eingeben.

          irgendwie verstehe ich ehrlich gesagt Dein Problem nicht (erst recht nach Deiner Beschreibung an Uwe).

          Ok, versuchen wir mal was ich soweit verstanden habe:

          Du öffnest ein Recordset mit einem Datenfeld, liest das in einer ASP-Seite aus und schließt das Recordset wieder.

          Soweit richtig! Ich öffne es am Anfang nur um dem USer anzuzeigen, welche Spalten er auswählen kann.
          Jetzt kommt aber erst der interessante Teil, nachdem der User die Spalten ausgewählt hat, ich gehe jetzt mal von 2 aus, wird in einem Frame auf der folgenden Seite eine Liste dargestellt, in der alle Werte der ausgewählten Spalte zu finden sind. Wenn nun auf ein beliebiger Wert geklickt wird, erscheint leicht eingerückt eine weitere Liste (du musst dir das vorstellen wie im Explorer, sobald du auf einen Ordner klickst erscheinen alle darunterliegenden Ordner!) in der alle Werte der zweiten Spalte stehen, wo der Wert der ausgewählt ist zutrifft. Wenn man jetzt auf einen Wert der zweiten Spalte klickt, ercsheint rechts im Frame eine Tabelle, in der diese beiden Bedingungen zutreffen (Wie im Explorer).

          Da ich aber den ersten RS nicht schließen kann, weil die Liste nach dem einen Punkt weitergeführt werden soll, muss ich einen neuen machen!

          Jetzt soll das ganze aber Datenbankunabhängig sein, also muss das ganze mit Variablen geschrieben werden!

          Danach geht Dein User hin und entscheidet welche/wieviel Spalte(n) noch zusätzlich angezeigt werden soll(en).

          Dann kannst Du doch das zuvor benutze und geschlossene Recordset wieder verwenden, oder nicht?

          Viele Grüße aus Köln
          Markus

          Hoffe ihr habt das jetzt verstanden! Wenn nicht kann ich dir auch mal den Quelltext schicken, oder die fertigen Seiten!

          MfG
          Thomas

          1. Hallo Thomas,

            Hoffe ihr habt das jetzt verstanden!

            Wenn ich ehrlich bin nein, daß kann aber auch ohne weiteres an meiner heutigen Tagesform liegen.

            Wenn nicht kann ich dir auch mal den Quelltext schicken, oder die fertigen Seiten!

            Kannste machen, bitte gezippt incl. einer Miniversion Deiner DB.
            Aber vor heute Abend oder morgen früh kann ich mir das nicht anschauen, weil:

            1. noch andere Arbeit da ist
            2. ich die andere Arbeit heute nachmittag ruhen lassen werde und mir die Tour ansehen werde.

            Gruß
            Markus

            1. Hallo Thomas,

              Hoffe ihr habt das jetzt verstanden!

              Wenn ich ehrlich bin nein, daß kann aber auch ohne weiteres an meiner heutigen Tagesform liegen.

              Hoffe Nicht!

              Wenn nicht kann ich dir auch mal den Quelltext schicken, oder die fertigen Seiten!

              Kannste machen, bitte gezippt incl. einer Miniversion Deiner DB.
              Aber vor heute Abend oder morgen früh kann ich mir das nicht anschauen, weil:

              Mach ich heut noch!

              1. noch andere Arbeit da ist
              2. ich die andere Arbeit heute nachmittag ruhen lassen werde und mir die Tour ansehen werde.

              Du hast es gut ich muss sie mir über Radio bei Eurosport anhören!

              Oder weist du irgedeine Seite die das Live ins Netz stellt?

              Gruß
              Markus

              Wenn nicht, wünsch ich dir viel Spass bei dieser Hammeretappe (hoffentlich ist Ulrich so fir wie ich glaube)

              MfG
              Thomas

  3. Hallo Thomas

    Bsp:

    For i = 1 To Anzahl
    Set (RS & i) = Server.CreateObject("ADODB.RecordSet")
    Next

    Mal unbesehen der Warnungen der Vorredner kannst Du das Problem mit einem Array von Recordsets lösen.

    z.B.

    Dim RSets(Anzahl) as Recordset ' Initialisieren eines Arrays mit fester Grösse

    For i = 1 To Anzahl
          Set RSets[i-1]  = Server.CreateObject("ADODB.RecordSet")
       Next

    Trotzdem ist mir aus Deinen Anforderungen auch nicht klar wieso Du mehr als ein Recordset im Speicher brauchst.
    Da Du ja nur lesend auf das Recordset zugreifst und Dir die Informationen über die Datenstruktur bekannt sind, kannst Du eine Anwendungslogik aufbauen die mit einem grossen Recordset arbeitet, das alle möglichen Spalten und alle für die Anzeige der ersten Ebene notwendigen Datensätze enthält.
    Für die Anzeige der "untergeordneten" Elemente eines 1.-Ebene-Elementes erfolgt zwangsläufig ein neuer Request und somit eine neue DB-Abfrage.
    Oder wie meinst Du "datenbankunabhängige" Vearbeitung?
    Wenn nach dem ersten Laden der Daten in den/die Recordsets kein weiterer DB-Zugriff erfolgen darf, dann kannst Du ja alle Datensätze ins grosse Recordset laden.

    Ich hoffe, das hilft etwas weiter.

    Grüsse

    Eisbär