Hallo,
ich möchte gern ein ADO Recordset von einer Funktion erstellen lassen. Dieser Funktion möchte ich nur den Namen der Tabelle und den Wert der ID übermitteln z.B. Angebote, 10.
Die Funktion soll dann selbst die ID-Spalte suchen und alle Spalten (*) der Tabelle für Datensatz 10 in Form eines Recordsets zurück geben.
Ist dies Realisierbar?
Zitat von: datekk am März 22, 2018, 15:47:21
Die Funktion soll dann selbst die ID-Spalte suchen und alle Spalten (*) der Tabelle für Datensatz 10 in Form eines Recordsets zurück geben.
Definiere bitte
ID-Spalte genauer. Du meinst vermutlich nicht die Spalte mit Namen
ID, dass wäre wohl zu einfach.
Ja, das wäre zu einfach ;D
Meine Tabellen haben alle in der ersten Spalte die ID Spalte (Schlüsselspalte/Autowert). Diese hat aber pro Tabelle immer unterschiedliche Namen. In C# geht das über das Zugriffsmodell LinqtoEntitys. Da reicht ein find(id) und die Id Spalte muss nicht gesondert aufgeführt werden.
Es ist jetzt nicht wo wichtig, aber ich könnte es mir dadurch sparen die Where Klausel immer zu formulieren und den Namen der ID Spalte rauszusuchen.
Ich hatte Dir doch vor einiger Zeit ein paar Basics zu ADO beigebracht, etwa wie man ungebundene Recordsets erstellt und wie man sie als freie Datenstruktur verwenden kann. Wenn Du solch fortgeschrittene Sachen verwendest, wirst Du doch mit Hilfe von Google und der Kontexthilfe (einfach nach dem ADO-Objekt den Punkt eingeben und dann erscheinen die Parameter und Methoden) zurechtkommen.
Das ADO-Modell ist doch überschaubar, es gibt vor allem das connection-Objekt und das recordset-Objekt. Das rs-Objekt hat fields, die man so anspricht:
for i = 0 to rs.fields.count -1
debug.print "Feld " & i & " heisst " & rs.fields(i).name
next i
Ich hab Dir auch was gegoogelt:
https://docs.microsoft.com/de-de/sql/ado/guide/data/the-fields-collection
https://www.w3schools.com/asp/ado_ref_recordset.asp
Die Links waren unter den ersten Treffern für die Suche "adodb recordset fields"
Ja, Wurliwurm, in ADO habe ich mich recht "tief" eingearbeitet und ich verstehe was du schreibst. Aber ich habe ja das Recordset noch gar nicht. Ein Recordset entsteht doch erst nachdem ich via .open "SELECT * FROM TBL WHERE IDFELD=123" den Recordset aus der Tabelle gezogen habe. Ist dies erfolgreich, erst dann hat ja z.B. rcs.fields auch einen Inhalt den ich abgreifen kann.
Die Frage zielte darauf ab ob es eine Möglichkeit gibt die SELECT Anweisung OHNE Benennung des ID Felds hinzubekommen - also wie mit Linq.
Ich habe es jetzt irgendwie Dirty hinbekommen. Die Funktion erfordert damit zwei Zugriffe auf die DB. Vielleicht gibt es ja sauberere Methoden:
Private Function GetRecordset(Tabellenname As String, Id As Long) As ADODB.Recordset
Dim strNameIdSpalte As String
Dim rcs As New ADODB.Recordset
Set GetRecordset = New ADODB.Recordset
With rcs
.Source = "SELECT Top 0 * From " & Tabellenname
.ActiveConnection = p_ADOConnection
.LockType = adLockReadOnly
.Open
strNameIdSpalte = .Fields(0).Name
.Close
.Source = "SELECT * From " & Tabellenname & " WHERE " & strNameIdSpalte & "=" & Id
.ActiveConnection = p_ADOConnection
.LockType = adLockReadOnly
.Open
Set GetRecordset = rcs
.Close
Set rcs = Nothing
End With
End Function
In Access zuviel generische Funktionalität nachzubauen ist eher nicht zielführend, sondern Zeitverschwendung. Dafür ist es schlicht nicht gemacht.
Hilfsweise für das konkrete Problem kann man vielleicht vorab ein rs mit SELECT * aufmachen um die Spaltennamen in Erfahrung zu bringen. Oder im Client eine Tabelle führen. Es gibt auch ADOX oder so für Data Dictionary Themen, aber da schießt man auch mit Kanonen auf Spatzen. die Erzeugung von solchen Objekten zur Laufzeit ist sicher auch teuer.
Es ist schon mal schlechter Stil, mit "SELECT *" in der Praxis zu arbeiten. So wie ein Mädel nicht immer alle ihre Schuhschränke mit sich herumträgt (warum wohl?), so wird der DB-Entwickler auch Wert auf flache und schlanke Recordsets legen, also nur die benötigten Datensätze und die benötigten Felder mitführen ... und schon wirst Du eine konkrete Feldliste verwenden müssen statt des faulen Sternchens.
ebs17: Es gibt nicht wenig Mädels die... naja, lassen wir das ;D
Danke Euch dennoch.