collapse

* Benutzer Info

 
 
Willkommen Gast. Bitte einloggen oder registrieren. Haben Sie Ihre Aktivierungs E-Mail übersehen?

* Wer ist Online

  • Punkt Gäste: 64
  • Punkt Versteckte: 1
  • Punkt Mitglieder: 2
  • Punkt Benutzer Online:

* Forenstatistik

  • stats Mitglieder insgesamt: 14038
  • stats Beiträge insgesamt: 67221
  • stats Themen insgesamt: 9067
  • stats Kategorien insgesamt: 5
  • stats Boards insgesamt: 17
  • stats Am meisten online: 415

Autor Thema: ID Spalte selbst finden? (ADO / SQL)  (Gelesen 638 mal)

Offline datekk

  • Access-Meister
  • ***
  • Beiträge: 709
ID Spalte selbst finden? (ADO / SQL)
« am: März 22, 2018, 15:47:21 »
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?
 

Offline PhilS

  • Administrator
  • Access-Profi
  • *****
  • Beiträge: 357
    • Tipps zu Access, VBA, SQL und Co.
Re: ID Spalte selbst finden? (ADO / SQL)
« Antwort #1 am: März 22, 2018, 16:03:18 »
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.
Neues Access 2019 Feature angekündigt: Modern Charts
 

Offline datekk

  • Access-Meister
  • ***
  • Beiträge: 709
Re: ID Spalte selbst finden? (ADO / SQL)
« Antwort #2 am: März 22, 2018, 18:46:11 »
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.
 

Offline Wurliwurm

  • Access-Profi
  • **
  • Beiträge: 376
Re: ID Spalte selbst finden? (ADO / SQL)
« Antwort #3 am: März 22, 2018, 19:21:04 »
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"
 

Offline datekk

  • Access-Meister
  • ***
  • Beiträge: 709
Re: ID Spalte selbst finden? (ADO / SQL)
« Antwort #4 am: März 22, 2018, 20:41:05 »
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
« Letzte Änderung: März 22, 2018, 21:16:13 von datekk »
 

Offline Wurliwurm

  • Access-Profi
  • **
  • Beiträge: 376
Re: ID Spalte selbst finden? (ADO / SQL)
« Antwort #5 am: März 22, 2018, 21:21:48 »
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.
 

Offline ebs17

  • Access-Meister
  • ***
  • Beiträge: 912
Re: ID Spalte selbst finden? (ADO / SQL)
« Antwort #6 am: März 22, 2018, 21:26:38 »
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.
Mit freundlichem Glück Auf!

Eberhard
 

Offline datekk

  • Access-Meister
  • ***
  • Beiträge: 709
Re: ID Spalte selbst finden? (ADO / SQL)
« Antwort #7 am: März 23, 2018, 07:48:35 »
ebs17: Es gibt nicht wenig Mädels die... naja, lassen wir das  ;D

Danke Euch dennoch.