ADO-Recordset abtrennen (VB6)

19/09/2008 - 09:29 von Thomas Mersheimer | Report spam
Hi!

Ich habe eine kleine Funktion, die mir Recordsets aus der DB holt:

Public Function GetRecordsetDB(Byval Query as String) as
ADODB.Recordset
Dim Database As New ADODB.Connection

With Database
.Open "...

Set GetRecordsetDB = .Execute(Query)
End With
End Function

Diese Funktion öffnet die DB, holt das Recordset und liefert es an die
aufrufende Funktion zurück!

Problem dabei ist, ich darf die Connection in der GetRecordsetDB ja
nicht schliessen, sonst ist auch das Recordset zu. Aber genau das
möchte ich.

Wie könnte ich das machen?
 

Lesen sie die antworten

#1 Peter Götz
19/09/2008 - 12:06 | Warnen spam
Hallo Thomas,

Ich habe eine kleine Funktion, die mir Recordsets
aus der DB holt:

Public Function GetRecordsetDB(Byval Query as String)
as ADODB.Recordset
Dim Database As New ADODB.Connection

With Database
.Open "...

Set GetRecordsetDB = .Execute(Query)
End With
End Function

Diese Funktion öffnet die DB, holt das Recordset
und liefert es an die aufrufende Funktion zurück!

Problem dabei ist, ich darf die Connection in der
GetRecordsetDB ja nicht schliessen,



Grundsàtzlich darfst Du das schon, aber ...

sonst ist auch das Recordset zu.



... wenn es ein Recordset mit serverseitigem Cursor
ist, was man wenn immer möglich vermeiden sollte.

Aber genau das möchte ich.

Wie könnte ich das machen?



Du musst ein Recordset mit clientseitigem Cursor
erstellen. Ein solches RS wird beim Öffnen mit
allen Datensàtzen geladen und kann dann völlig
unabhàngig von einem Connectionobjekt weiter
am Leben gehalten werden. Bei Bedarf kann jederzeit
Recordset.ActiveConnection neu zugewiesen werden
um evtl. geànderte Daten wieder in die DB zurück
zu schreiben.


Public Function GetNewRS _
(Cnn As ADODB.Connection, _
Source As String, _
CursorLocation As ADODB.CursorLocationEnum, _
CursorType As ADODB.CursorTypeEnum, _
Optional LockType As ADODB.LockTypeEnum, _
Optional Options As ExecuteOptionEnum _
) As ADODB.Recordset

' Gibt ein neues ADODB.Recordset-Objekt zurück

Dim strDataSource As String
Dim rs As ADODB.Recordset

Set rs = New ADODB.Recordset

On Error GoTo Fehler

With rs
Set .ActiveConnection = Cnn
.Source = Source
.CursorType = CursorType
.CursorLocation = CursorLocation

If LockType Then
.LockType = LockType
End If
If Options Then
.Open , , , , Options
Else
.Open
End If
End With


Set GetNewRS = rs
Set rs = Nothing
On Error GoTo 0

Exit Function

Fehler:
If Not cnn Is Nothing Then
strDataSource = cnn.Properties("Data Source")
End If
Err.Raise Err.Number, _
Err.Source & "; " & "Klassen/ModulName" & _
".GetNewRS", _
Err.Description & vbCrLf & _
"DataSource: " & strDataSource & vbCrLf & _
"SQL: " & Source, _
Err.HelpFile, _
Err.HelpContext
End Function


Der Aufruf der Funktion würde dann z.B. so aussehen:

Dim RS As ADODB.Recordset
Dim SQL As String
SQL = "Select * From Tabelle"

Set RS = _
GetNewRS _
(CNN, SQL, _
adUseClient, _
adOpenStatic, _
adLockBatchOptimistic)

CNN ist dabei Dein geöffnetes Connection-Objekt.
Wenn Dein RS keine Verbindung mehr zur Datenbank
benötigt, kannst Du

Set RS.ActiveConnection = Nothing

setzen und Deine Connection schliessen.

Mehr dazu findest Du unter

www.gssg.de -> Visual Basic -> VBclassic
-> Datenbank

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

Ähnliche fragen