PDA

Vollständige Version anzeigen : lfz 3704 Ado Recordset kann nicht geschlossen werden


KarMulholand
23.01.2008, 22:54
Ich möcht Recodsets künftig per Klasse füllen.
Gefüllt wird es auch, aber rs.close macht diesen Lfz.
Wieso? Das Öffen in der Klasse geht sauber durch, dann soll er mich doch schliessen lassen ?



Sub OLEDB_Trusted()

Dim Cnn As Object
Dim rs As Object
Dim myClass As New ClsRecord

Set Cnn = CreateObject("ADODB.Connection")

Cnn.ConnectionString = ""
Cnn.Open

strSQL = "SELECT * FROM tbl_test"

Set rs = myClass.MyRsKeyset(strSQL, Cnn)
rs.Close

End Sub

'Beginn Klasse-----------------------------------------------------------------------------------------------------
Option Compare Database
Option Explicit

Private myRs As New ADODB.Recordset
'--------------------------------------------------------------------------------------------------------------
Public Function MyRsKeyset(ByRef strSQL As String, _
ByRef cn As ADODB.Connection) As ADODB.Recordset


With myRs
.CursorType = adOpenKeyset
.LockType = adLockOptimistic
.Open strSQL, cn
End With

Set MyRsKeyset = myRs

End Function

Josef P.
23.01.2008, 23:41
Komisch, ich hätte erwartet, dass bereits bei cnn.open ein Fehler auftritt, da kein Connectionstring übergeben wurde.
Mit rs.State kannst du prüfen, ob das Recordset noch offen ist, falls dein Original-Code anders aussieht und ein RS geöffnet werden konnte.

KarMulholand
24.01.2008, 15:37
Tja, der String hat sich irgendwi verflüchtigt, nachträglich biete ich diesen an.

Cnn.ConnectionString = "Password=Karl;" & _
"Persist Security Info=True;" & _
"User ID=Kurt;" & _
"Initial Catalog=KarlsDB;" & _
"Data Source=Karl"

Ich hab das noch weiter abgeklopft und dieser Fehler tritt nur auf wenn ich einen 'Update' String übergebe, nehm ich einen 'Select' gehts

KarMulholand
24.01.2008, 16:27
wenn ich mir den myRs.State nach dem withblock anzeigen lasse, kommt '0'
Da heisst ja wohl es wurde gar nicht geöffnet.
Aber wenn Open nicht geht, warum kommt keine Error Message ?

With myRs
.CursorType = adOpenKeyset
.LockType = adLockOptimistic
.Open strSQL, cn
End With

Msgbox "" & myRs.State

Josef P.
24.01.2008, 19:24
Ich hab das noch weiter abgeklopft und dieser Fehler tritt nur auf wenn ich einen 'Update' String übergebe, nehm ich einen 'Select' gehts
Und was für einen Recordset-Inhalt hättest du nach Update erwartet?

Aber wenn Open nicht geht, warum kommt keine Error Message ?
Die Fehlermeldungen werden aber nicht unterdrückt? (On Error resume next o.ä.)

KarMulholand
24.01.2008, 19:46
mhh, Ok, Inhalt bei einem Update-String kommt nicht gut.

Ich hab das ganze Prozedere mal als little DB eingehängt.
Die Irrsinnigkeiten nehmen keine Ende.
Denn es wird sogar upgedatet, ganz ohne Cnn.Execute und ohne öffnen des Recordset

Einhängen geht leider nicht, bin hier im Kaffe, und kann nicht zippen

Option Compare Database
Option Explicit

Private strSQL As String

Sub test()

Dim Cnn As Object
Dim rs As Object
Dim myClass As New ClsRec


Set Cnn = CreateObject("ADODB.Connection")

Cnn.Provider = "SQLOLEDB.1"
Cnn.ConnectionString = "Password=Karl1;" & _
"Persist Security Info=True;" & _
"User ID=Karl;" & _
"Initial Catalog=KarlDB;" & _
"Data Source=KarlsServer"

Cnn.Open

strSQL = "UPDATE tbl_test " & _
" SET AnzArt = 3"

Set rs = myClass.GetMyRsKeyset(strSQL, Cnn)
MsgBox "GetMyRsKeyset" & " " & Cnn.State & " " & rs.State
rs.Close

If Cnn.State = 1 Then
Cnn.Close
End If

End Sub


------------------------------------------------------
'Beginn Klasse
Option Compare Database
Option Explicit

Private myRs As New ADODB.Recordset
'---------------------------------------

Public Function MyRsKeyset(ByRef strSQL As String, _
ByRef cn As ADODB.Connection) As ADODB.Recordset

On Error GoTo CatchError

With myRs
.CursorType = adOpenKeyset
.LockType = adLockOptimistic
.Open strSQL, cn
End With


Set MyRsKeyset = myRs

ExitFunc:
Exit Function

CatchError:
MsgBox "MyRsKeyset " & Error & " " & Err.Description
Resume ExitFunc

End Function


Private Sub Class_Terminate()
If Not myRs Is Nothing Then Set myRs = Nothing
End Sub

KarMulholand
25.01.2008, 16:02
hier das Problem als MiniDB,

Wegen einem Updatestring macht sich das Recordset wohl keine Mühe, sich zu öffnen, gut .

Aber wieso wird das Update ausgeführt, wenn nicht mal
ein Execute irgendwo steht.

Josef P.
25.01.2008, 16:59
Ich stelle auch mal eine Frage: ;)
Warum erwartest du ein gefülltest Recordset, wenn du eine Update-Anweisung ausführst?

Aber wieso wird das Update ausgeführt, wenn nicht mal
ein Execute irgendwo steht.
Warum nicht? Per Open wird die SQL-Anweisung an den Server weitergegeben. Was ist so schlimm daran?
Du bekommst übrigens beim ADODBConnection.Execute auch ein Recordset zurück.

KarMulholand
26.01.2008, 13:02
Hi Joseph,

das mit dem Update und dem Record, dass da nichts rauskommen kann, ist schon OK so.

Und dass, das Update trotzdem stattfindet, ist natürlich nicht schlimm.

Es war eben Zufall, bisher ist mir das nie untergekommen.
Ich hab immer gerne Gewissheit, ich möchte nicht annehmen dass...

Also , ich dank dir.