Alexander Ganz: An geklontes Recordset Spalten anhängen

Hallo Allerseits,

im Moment experimentiere ich gerade mit geklonten Recordsets.
Ich möchte gerne an ein bestehendes Recordset zusätzliche Spalten hängen. Dabei ist mir aufgefallen, daß die Append Methode dabei anscheinend nicht greift. Ich versuche das so:

Set cRS = DBRS.Clone ' Das Recordset aus Der DB in Recordset cRS schieben
DBRS.Close ' RecordSet aus DB schliessen
Set DBRS = Nothing ' und zerstören
cRS.Fields.Append "MeineSpalte", adVarChar, 50 'Neue Spalte anhängen
cRS.Open
cRS.AddNew ' Jetzt will ich das ding mit nem Wert füllen
cRS("MeineSpalte") = "huhu" ' Fehler! Die Spalte kann nicht gefunden werden :-(

Mache ich irgendwas falsch oder ist es schlichtweg nicht möglich an ein bereits erstelltes Recordset noch zusätzliche Spalten anzuhängen?
Besonders verwirrt mich, daß die Append Methode keinen Fehler wirft. Also müsste der Fehler ja woanders liegen.
Weiss jemand was?

Viele Grüße
Alex

  1. Hi,

    sollte das Recordset dazu nicht geschlossen sein, an das man anhängen will??

    Gruß, Frank

    1. Hallo Frank,

      sollte das Recordset dazu nicht geschlossen sein, an das man anhängen will??

      Jepp, ist es auch - hatte nur vergessen diese Stelle mit einzufügen.
      Mir ist dann nochwas interessantes aufgefallen. Dieses Mal habe ich ein einzelnes nicht geklontes Recordset benutzt.

      Set rs = CreateObject("ADODB.Recordset")
      rs.Fields.Append "Spalte1", adChar, 50 'adChar = 129
      rs.Fields.Append "Spalte2", adChar, 50
      rs.Open

      rs.AddNew
      rs("Spalte1").Value = "Dies ist Spalte1.1"
      rs("Spalte2").Value = "Dies ist Spalte2.1"

      rs.AddNew
      rs("Spalte1").Value = "Dies ist Spalte1.2"
      rs("Spalte2").Value = "Dies ist Spalte2.2"

      RS.Close

      rs.Fields.Append "Spalte3", adChar, 50
      rs.Fields.Append "Spalte4", adChar, 50

      rs.Open

      rs.AddNew
      rs("Spalte3").Value = "Dies ist Spalte3.1"
      rs("Spalte4").Value = "Dies ist Spalte4.1"

      rs.AddNew
      rs("Spalte3").Value = "Dies ist Spalte3.2"
      rs("Spalte4").Value = "Dies ist Spalte4.2"

      rs.MoveFirst
      While Not rs.EOF
       For i = 0 To rs.Fields.Count-1
         Response.Write RS(i).Name & " - " & RS(i).Value & "<br>"
       Next
       rs.MoveNext
      Wend
      rs.close
      Set rs = Nothing

      Ergebnis:
      Spalte3 - Dies ist Spalte3.1
      Spalte4 - Dies ist Spalte4.1
      Spalte3 - Dies ist Spalte3.2
      Spalte4 - Dies ist Spalte4.2

      Es fehlen also Spalte1 und Spalte2 und 4 Datensätze. Wo sind die hin?
      Das kann doch nicht der Sinn von Append sein oder?
      Die vorherigen Einträge sind einfach nicht mehr vorhanden - das Recordset wurde aber nicht gelöscht (eigentlich)
      ?

      Viele Grüße
      Alex

      1. Hallo Alexander,

        Set rs = CreateObject("ADODB.Recordset")
        rs.Fields.Append "Spalte1", adChar, 50 'adChar = 129
        rs.Fields.Append "Spalte2", adChar, 50
        rs.Open

        rs.AddNew
        rs("Spalte1").Value = "Dies ist Spalte1.1"
        rs("Spalte2").Value = "Dies ist Spalte2.1"

        rs.AddNew
        rs("Spalte1").Value = "Dies ist Spalte1.2"
        rs("Spalte2").Value = "Dies ist Spalte2.2"

        RS.Close

        rs.Fields.Append "Spalte3", adChar, 50
        rs.Fields.Append "Spalte4", adChar, 50

        rs.Open

        rs.AddNew
        rs("Spalte3").Value = "Dies ist Spalte3.1"
        rs("Spalte4").Value = "Dies ist Spalte4.1"

        rs.AddNew
        rs("Spalte3").Value = "Dies ist Spalte3.2"
        rs("Spalte4").Value = "Dies ist Spalte4.2"

        rs.MoveFirst
        While Not rs.EOF
         For i = 0 To rs.Fields.Count-1
           Response.Write RS(i).Name & " - " & RS(i).Value & "<br>"
         Next
         rs.MoveNext
        Wend
        rs.close
        Set rs = Nothing

        Ergebnis:
        Spalte3 - Dies ist Spalte3.1
        Spalte4 - Dies ist Spalte4.1
        Spalte3 - Dies ist Spalte3.2
        Spalte4 - Dies ist Spalte4.2

        Es fehlen also Spalte1 und Spalte2 und 4 Datensätze. Wo sind die hin?
        Das kann doch nicht der Sinn von Append sein oder?
        Die vorherigen Einträge sind einfach nicht mehr vorhanden - das Recordset wurde aber nicht gelöscht (eigentlich)

        Joho. AddNew ohne Update ist wie Wasser in ein Sieb gießen ;-))

        http://msdn.microsoft.com/library/en-us/ado270/htm/mdmthaddnew.asp?frame=true

        Remarks
        Use the AddNew method to create and initialize a new record. Use the Supports method with adAddNew (a CursorOptionEnum value) to verify whether you can add records to the current Recordset object.

        After you call the AddNew method, the new record becomes the current record and remains current after you call the Update method. Since the new record is appended to the Recordset, a call to MoveNext following the Update will move past the end of the Recordset, making EOF True. If the Recordset object does not support bookmarks, you may not be able to access the new record once you move to another record. Depending on your cursor type, you may need to call the Requery method to make the new record accessible.

        Gruß

        Axel

        1. Hallo Axel!

          Joho. AddNew ohne Update ist wie Wasser in ein Sieb gießen ;-))

          Eigentlich hast du Recht - aber....

          das würde dann so aussehen:

          rs.AddNew
          rs("Spalte1").Value = "Dies ist Spalte1.1"
          rs("Spalte2").Value = "Dies ist Spalte2.1"
          rs.Update

          Und das bringt genauso viel wie vorher - nämlich nix :-(
          Ein Update ist nicht zwingend erforderlich, auch wenn es da steht - es wird trotzdem upgedatet, denn sonst könnten die neuen Datensätze nicht vorhanden sein - und wenn man das vor dem ersten .close die Daten abfragt ist auch noch alles da. Nur nach dem zweiten Append-Block nicht mehr.... Also immernoch ein grosses ?

          Viele Grüße
          Alex

        2. Hallo Alexander,

          'Mit welcher Datenbank ist das verbunden?
              ' open connection
              Set Cnn = Server.CreateObject("ADODB.Connection")
              strCnn = "....;"
              Cnn.Open strCnn

          Set rs = CreateObject("ADODB.Recordset")

          'Mit welcher Tabelle ist das verbunden?
              rs.ActiveConnection = Cnn
              rsCursorLocation = adUseClient
              rs.CursorType = adOpenKeyset
              rs.LockType = adLockOptimistic
              rs.Source = "Tabellenname"

          rs.Fields.Append "Spalte1", adChar, 50 'adChar = 129
          rs.Fields.Append "Spalte2", adChar, 50

          rs.Fields.Update

          rs.Open

          rs.AddNew
          rs("Spalte1").Value = "Dies ist Spalte1.1"
          rs("Spalte2").Value = "Dies ist Spalte2.1"

          rs.Update

          Irgendwo müssen die Änderungen vor dem Close ja gespeichert werden.

          Gruß

          Axel

          1. Hi,

            es braucht nicht immer eine Verbindung zu einer DB oder eine Tabelle um Recordsets zu erzeugen.

            In Offline-Recordsets kann man wunderbar mehrdimensionale Daten speichern ohne sich der umständlichen mehrdimensionalen Arrays bedienen zu müssen.

            Gruß, Frank

          2. Hallo Axel,

            'Mit welcher Datenbank ist das verbunden?
                ' open connection
                Set Cnn = Server.CreateObject("ADODB.Connection")
                strCnn = "....;"
                Cnn.Open strCnn

            Es ist mit keiner Datenbank verbunden. Recordsets kann man ja auch ohne Datenbank erstellen und benutzen. Deshalb gibt es in diesem Falle keine Connection.

            'Mit welcher Tabelle ist das verbunden?

            Auch keine Tabelle - diese versuche ich selber zu erstellen.

            rs.Fields.Append "Spalte1", adChar, 50 'adChar = 129
            rs.Fields.Append "Spalte2", adChar, 50
                  rs.Fields.Update
            rs.Open

            rs.Fields.Update bringt diese Fehlermeldung: "Nicht implementiert"
            Also da ist irgendwas nicht richtig oder es gehört kein Update an diese Stelle.

            Status nach diesem Block (ohne rs.Fields.Update): Spalten sind vorhanden.

            rs.AddNew
            rs("Spalte1").Value = "Dies ist Spalte1.1"
            rs("Spalte2").Value = "Dies ist Spalte2.1"
                  rs.Update
            Irgendwo müssen die Änderungen vor dem Close ja gespeichert werden.

            Tja, fragt sich nur "wie" - denn - wie schon unten geschrieben - rs.Update tut´s nicht.

            ...immernoch ratlos

            Viele Grüße
            Alex

            1. Hallo Alexander,

              Es ist mit keiner Datenbank verbunden. Recordsets kann man ja auch ohne Datenbank erstellen und benutzen. Deshalb gibt es in diesem Falle keine Connection.

              Aha.

              rs.Fields.Update bringt diese Fehlermeldung: "Nicht implementiert"
              Also da ist irgendwas nicht richtig oder es gehört kein Update an diese Stelle.

              Ja, war mein Fehler. Wenn, dann Refresh, und auch nur mit Connection.

              Status nach diesem Block (ohne rs.Fields.Update): Spalten sind vorhanden.

              rs.AddNew
              rs("Spalte1").Value = "Dies ist Spalte1.1"
              rs("Spalte2").Value = "Dies ist Spalte2.1"
                    rs.Update
              Irgendwo müssen die Änderungen vor dem Close ja gespeichert werden.

              Tja, fragt sich nur "wie" - denn - wie schon unten geschrieben - rs.Update tut´s nicht.

              Ja, Update speichert in eine Connection.

              Ohne Connection habe ich noch nie mit Recordsets gearbeitet. Ich kann nur vermuten, dass Du sie dann halt nicht schließen darfst ;-))

              Eventuell weiß ja noch jemand mehr.

              Gruß

              Axel