An geklontes Recordset Spalten anhängen
Alexander Ganz
- asp.net
0 Frank
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
Hi,
sollte das Recordset dazu nicht geschlossen sein, an das man anhängen will??
Gruß, Frank
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
Hallo Alexander,
Set rs = CreateObject("ADODB.Recordset")
rs.Fields.Append "Spalte1", adChar, 50 'adChar = 129
rs.Fields.Append "Spalte2", adChar, 50
rs.Openrs.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, 50rs.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 = NothingErgebnis:
Spalte3 - Dies ist Spalte3.1
Spalte4 - Dies ist Spalte4.1
Spalte3 - Dies ist Spalte3.2
Spalte4 - Dies ist Spalte4.2Es 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
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
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
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
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
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