Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Recordset aus Function übergeben

Forumthread: Recordset aus Function übergeben

Recordset aus Function übergeben
19.01.2009 17:37:00
Mike
Hallo zusammen,
weiß jemand, ob und wie ich ein Recordset aus einer Function zurückgeben kann?
Um das Problem klar zu machen: ich rufe mit bestimmten Parametern eine Function auf, in der ein rs erstellt wir. Jetzt soll dieses rs zurückgegeben werden, damit ich je nach Bedarf damit was machen kann. Wenn ich aber (noch innerhalb der Function) die Verbindung und das rs schließe, dann ist das ja dann leer.
Da muss es doch eine Möglichkeit geben, oder?
Der Vorteil wäre, dass die Verbindung zur DB usw nur einmal geschreiben werden müsste und über Functionsaufruf überall verfügbar wäre.
Gruß
Mike
Anzeige

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Recordset aus Function übergeben
19.01.2009 19:54:35
Roland
Hallo Mike,
Du kannst an zwei Stellen ansetzen: entweder definierst Du den RS als öffentliche Variable (geht am einfachsten) oder Du befasst dich mal mit connection pooling.
Gruß von
Roland Hochhäuser
AW: Recordset aus Function übergeben
19.01.2009 20:05:00
Mike
Hallo Roland,
du schon wieder :)
Eine öffentliche Variable ist nicht so gut: die Function soll ja die Daten ziehen und die Verbindung dann auch wieder schliessen. Mit dem Schließen wären die Daten ja auch nicht mhr da. Mit Übergabe hätte ich die Möglichkeit, die Funktion beliebig aufzurufen, Übergabe des Query uvm.
Ich hatte mehr daran gedacht, die Daten in eine statische Variable / Array zu packen und einfach zu übergeben. Zur Not muss ich die Daten in ein Sheet schreiben, das wäre aber die letzte, unelegante Möglichkeit.
Connection Pooling sagt mir nichts, google ich gleich mal. Hast du gute links?
Gruß
Mike
Anzeige
AW: Recordset aus Function übergeben
19.01.2009 20:29:00
Roland
Hallo Mike,
"Array" ist das Zauberwort, Variable ziehe ich zurück ;-) Connection pooling ist relativ aufwendig, hat aber den Vorteil, dass immer aktuelle Daten zur Verfügung stehen (ich unterstelle mal Mehrbenutzerbetrieb an einer Datebank) . Zur Begriffserklärung z.B. hier: http://books.google.de/books?id=YzjzbpUREA8C&pg=PA239&lpg=PA239&dq=Connection+pooling+begriff&source=bl&ots=M6KCzEGDQi&sig=6tTOyXZG0mETgJ-p9x2X-L_NB7o&hl=de&sa=X&oi=book_result&resnum=5&ct=result
Gruß
Roland Hochhäuser
Anzeige
AW: Recordset aus Function übergeben
20.01.2009 13:53:43
Mike
ok, hab hier mal was geschrieben, was auch läuft:

Sub TestADO()
Dim Frage As String, Ziel As Worksheet
Dim db As String
Dim conn As New ADODB.Connection
Dim server, Driver As String
Dim UID, PWD As String
Dim x, y As Long
Dim AnzahlZeilen, AnzahlSpalten As Long
Dim rs As ADODB.Recordset
Dim arrRs() As Variant
db = "db1"
Select Case db
Case "db1"
server = Server1
Driver = "SQL Server"
UID = UID1
PWD = PWD1
Case "db2"
server = Server2
Driver = "MySQL ODBC 5.1 Driver"
UID = UID2
PWD = PWD2
End Select
Frage = "Select * from db1.table"
Set conn = New ADODB.Connection
conn.Open _
"DRIVER={" & Driver & "}" & _
";SERVER=" & server & _
";UID=" & UID & _
";PWD=" & PWD
Set rs = New ADODB.Recordset
rs.Open Frage, conn, adOpenKeyset, adLockReadOnly
With rs
.MoveFirst
x = 1
'Anzahl Zeilen ermitteln / Recordcount geht nicht (?)
AnzahlZeilen = 1
While Not .EOF
.MoveNext
AnzahlZeilen = AnzahlZeilen + 1
Wend
AnzahlSpalten = rs.Fields.Count
ReDim arrRs(1 To AnzahlZeilen, 1 To AnzahlSpalten)
.MoveFirst
While Not .EOF
For y = 1 To AnzahlSpalten
Debug.Print rs(y - 1)
arrRs(x, y) = rs(y - 1).Value
Next y
.MoveNext
x = x + 1
Wend
End With
On Error Resume Next
rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing
On Error GoTo 0
End Sub


Soweit, so gut. Jetzt wollte ich das wie oben beschrieben aufteilen und über


Function aufrufen:


Sub abcd()
Dim arrRs() As Variant
arrRs = rs2Array("db1", "Select * from db1.table")
End Sub



Function rs2Array(db As String, Frage As String)
' unter Extras - Verweise muss Microsoft Active X Data Objects 2.x library aktiviert werden!
Dim conn As New ADODB.Connection
Dim server, Driver As String
Dim UID, PWD As String
Dim x, y As Long
Dim AnzahlZeilen, AnzahlSpalten As Long
Dim rs As ADODB.Recordset
Select Case db
Case "db1"
server = Server1
Driver = "SQL Server"
UID = UID1
PWD = PWD1
Case "db2"
server = Server2
Driver = "MySQL ODBC 5.1 Driver"
UID = UID2
PWD = PWD2
End Select
Set conn = New ADODB.Connection
conn.Open _
"DRIVER={" & Driver & "}" & _
";SERVER=" & server & _
";UID=" & UID & _
";PWD=" & PWD & _
Set rs = New ADODB.Recordset
rs.Open Frage, conn, adOpenStatic
With rs
.MoveFirst
'Anzahl Zeilen ermitteln / Recordcount geht nicht (?)
AnzahlZeilen = 1
While Not .EOF
.MoveNext
AnzahlZeilen = AnzahlZeilen + 1
Wend
AnzahlSpalten = rs.Fields.Count
ReDim rs2Array(1 To AnzahlZeilen, 1 To AnzahlSpalten)
.MoveFirst
x = 1
While Not .EOF
For y = 1 To AnzahlSpalten
Debug.Print rs(y - 1)
rs2Array(x, y) = rs(y - 1).Value
Next y
.MoveNext
x = x + 1
Wend
End With
'Close connections
On Error Resume Next
rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing
On Error GoTo 0
End Function


Das gibts dann ja einen Fehler beim Redim des Array.
Ich brauch einfach neuen Input, so komm ich nicht weiter. Wär toll, wenn jemand eine Anregung hat.
Cheers
Mike

Anzeige
AW: Recordset aus Function übergeben
20.01.2009 15:42:17
Mike
dann bin ich mal raus ...
und nutzt wieder meine old-school odbc-verbindung.
;
Anzeige

Infobox / Tutorial

Recordset aus einer Funktion übergeben


Schritt-für-Schritt-Anleitung

Um ein Recordset aus einer Funktion in VBA zurückzugeben, befolge diese Schritte:

  1. Verbindung zur Datenbank herstellen: Du musst zuerst eine Verbindung zur Datenbank herstellen. Verwende dazu die ADODB.Connection-Klasse.

    Dim conn As New ADODB.Connection
  2. Recordset deklarieren: Erstelle ein neues ADODB.Recordset-Objekt.

    Dim rs As ADODB.Recordset
  3. Daten abfragen: Öffne das Recordset mit einer SQL-Abfrage.

    Set rs = New ADODB.Recordset
    rs.Open "SELECT * FROM deine_tabelle", conn
  4. Daten in ein Array umwandeln (optional): Wenn du die Daten in ein Array speichern möchtest, kannst du dies wie folgt tun:

    Dim arrRs() As Variant
    ' Benötigte Logik hier um arrRs zu befüllen
  5. Funktion erstellen: Definiere eine Funktion, die das Recordset zurückgibt.

    Function rs2Array(db As String, Frage As String) As Variant
       ' Logik zur Erstellung des Recordsets
       ' Rückgabe des Arrays
    End Function

Häufige Fehler und Lösungen

  • Fehler beim Redim des Arrays:
    Wenn du versuchst, das Array zu redimensionieren, stelle sicher, dass du es korrekt deklarierst. Verwende ReDim innerhalb der Funktion, um die Dimensionen festzulegen.

  • Verbindung wird geschlossen:
    Achte darauf, dass die Verbindung zum Recordset erst nach der Verwendung geschlossen wird. Wenn du die Verbindung während der Verarbeitung schließt, wird das Recordset leer.


Alternative Methoden

Falls die oben beschriebenen Methoden nicht funktionieren, kannst du auch folgende Alternativen in Betracht ziehen:

  • Öffentliche Variablen: Du kannst das Recordset als öffentliche Variable deklarieren, um es in anderen Subroutinen oder Funktionen zugänglich zu machen.

  • Connection Pooling: Diese Technik kann nützlich sein, um mehrere Benutzeranfragen effizient zu verwalten.


Praktische Beispiele

Hier ist ein einfaches Beispiel, wie du ein Recordset in ein Array umwandeln kannst:

Function rs2Array(db As String, Frage As String) As Variant
    Dim conn As New ADODB.Connection
    Dim rs As ADODB.Recordset
    ' Verbindung öffnen und Recordset abfragen...
    ' Logik zum Befüllen des Arrays
    Return rs2Array
End Function

Die Verwendung von excel vba recordset ermöglicht dir, auf verschiedene Datenquellen zuzugreifen und sie in Excel zu verarbeiten.


Tipps für Profis

  • Optimierung der SQL-Abfragen: Stelle sicher, dass deine SQL-Abfragen so optimiert sind, dass sie nur die benötigten Daten zurückgeben. Das kann die Performance erheblich verbessern.

  • Fehlerbehandlung einbauen: Implementiere eine robuste Fehlerbehandlung, um Laufzeitfehler zu vermeiden, die während der Datenbankoperationen auftreten können.


FAQ: Häufige Fragen

1. Wie kann ich ein Recordset in eine Excel-Tabelle einfügen?
Du kannst die Daten aus dem Recordset in eine Excel-Tabelle einfügen, indem du durch das Recordset iterierst und die Werte in die Zellen schreibst.

2. Was ist der Unterschied zwischen einem statischen und einem dynamischen Recordset?
Ein statisches Recordset speichert die Daten zum Zeitpunkt der Abfrage, während ein dynamisches Recordset die Daten in Echtzeit aktualisiert, wenn sich die zugrunde liegenden Daten ändern.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige