Zum Inhalt springen

VB.NET : Kann einzelnes Recordset nicht schliessen, warum ?


Boro

Empfohlene Beiträge

Hallo,

ich hab ein Problem bei dem ich nicht mehr weiter komme und auch nicht weiß woran es liegen könnte.

Also, ich habe ca. 16 Formulare habe, für (fast) jedes Formular habe ich ein Recordset.

Die werden während des Form_load -Ereignis initialisiert, beim .open wird dass SQL-Statement abgesetzt.

Da der User die Formulare immer wieder öffnen und schliessen kann habe ich eine Prüfung eingebaut. Diese Prüfung verhindert den Laufzeitfehler wenn dass zu öffnene Recordset schon offen ist, indem es ein offenes Recordset vorher einfach schliesst.

Das Problem ist nun dass ein einzelnes Recordset zwar als geöffnet registiert wird, aber beim .close einen Laufzeitfehler erzeugt. Fehlernummer : 3129, Fehlertext : Der Vorgang ist in diesem Zusammenhang nicht zugelassen.

Und dass komische ist dass es nur bei diesem einem Recordset passiert, alle anderen funktionieren ohne Probleme.

Aufgrund des Errorhandlers wird ein ResumeNext durchgeführt, da dass Recordset aber nicht geschlossen ist kommt der nächste Fehler sofort.

Der Code :

'Deklaration ist in einem Basis-Modul

Public rstadressen As New ADODB.Recordset()

'Das steht im Formload-Ereignis

Datenbankverbindung_prüfen(rstadressen)

rstadressen.Open("select * from SP_Anschriften where SP_Anschr_Kdnr = '" & rstKunden.Fields("Sp_kd_nr").Value & "' order by SP_Anschr_KzAnschr", Verbindung, ADODB.CursorTypeEnum.adOpenDynamic, ADODB.LockTypeEnum.adLockOptimistic)

'Die Prüfroutine die den Laufzeitfehler abfangen soll

Public Function Datenbankverbindung_prüfen(ByRef rstObjekt As Object)

On Error GoTo errorhandler

If (rstObjekt.activeconnection Is Nothing) = False Then

rstObjekt.close()

End If

Exit Function

errorhandler:

MsgBox("Es wurde leider festgestellt dass ein Fehler aufgetreten ist, das Programm wird fortgesetzt." _

& vbNewLine & "Es wird jedoch dringend empfohlen dass Sie das Programm neu starten. Sollte der Fehler erneut auftreten verständigen Sie bitte den Administrator." _

& "Fehlernummer " & Err.Number & vbNewLine & "Fehlerbeschreibung: " & Err.Description, MsgBoxStyle.Critical + vbYes)

Resume Next

End Function

Das Datenbanksystem ist Access XP (DB in Access 2000 erstellt).

Der Laufzeitfehler deutet auf einen Datenbankfehler hin, aber welchen und warum ? Hab schon versucht die Prüfrountine an anderer Stelle aufzurufen, aber das klappt auch nicht.

Vielleicht hat jemand von euch dass Problem ja schon mal gehabt, denn ich weiß nicht weiter.

Danke im vorraus !

Gruß

Feivel

Link zu diesem Kommentar
Auf anderen Seiten teilen

warum prüfst du dein ActiveConnection auf Nothing, wenn du das nirgendwo auf Nothing gesetzt hast?

Darfst du ja auch nicht, weil das nicht geht. Nothing kannst du es erst dann setzten, wenn du einen ReadOnly oder Batchoptimistischen Recordset hast! Du hast ja auch LockOptimistic und das würde bedeuten, dass dein Recordset eine Permanente Verbindung zur Datenbank braucht. Dazu natürlich auch einen gültigen Connection-Objekt!

So in etwa.

blear

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die Reihenfolge gefällt mir nicht ganz:

1. FormLoad:

Set poConn as new adodb.connection

Set poRS as new Adodb.Reocrdsett

----------------------------------------------------------

// AUCH DIEN CONNECTIONEinstellungen.

----------------------------------------------------------

Verbindung aufbauen.

poConn.Open bla bla blaa... hast du ja wahrscheinlich.

-----------------------------------------------------------

//HIER MACHST DU DEINE RS-Einstellungen.

//Cursortype, cursorlocation,Locktyp

----------------------------------------------------------

Recordset öffnen.

pors.open bla bla bla.

---------------------------------------------------------

Und was mir aufgefallen ist...

Warum prüfst du den Recordset auf Nothing, vor dem Open?

brauchst du doch nicht?

und wenn dann musst du den STATE property abfragen und nicht activeconnection.

if pors.State <> adstateclosed then // nur wenn nicht zu.....

pors.close

set pors = new adodb.recordset

else

set pors = new adodb.recordset

end if

schau, ob du das soweit sauber hinkriegst.

mfg

blear

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von BlearSun

Und was mir aufgefallen ist...

Warum prüfst du den Recordset auf Nothing, vor dem Open?

brauchst du doch nicht?

und wenn dann musst du den STATE property abfragen und nicht activeconnection.

if pors.State <> adstateclosed then // nur wenn nicht zu.....

pors.close

set pors = new adodb.recordset

else

set pors = new adodb.recordset

end if

schau, ob du das soweit sauber hinkriegst.

mfg

blear

Hallo Blear,

erstmal Danke ! Deine Frage ist echt berechtigt, ich hab dass Recordset vor jedem Open geschlossen weil ich durc h dass erneute öffen ein neues Absetzen des SQL-Statements erreichen wollte. Das hab ich so in der Schule gelernt um die Laufzeitfehler zu umgehen.

Jetzt ist mir erstmal klar geworden dass ich dass ja gar nicht brauche, ein einfaches Requery reicht völlig. In dem Fall fällt dass Problem mit dem Recordset natürlich weg, da es nicht mehr geschlossen werden muss.

Die Reihenfolge hatte ich vorher schon wie oben, ich hatte sie nur nicht in der der Reihenfolge & ohne Connection gepostet.

Ich hab die Eigenschaft .ActiveConnection eigentlich nur zufällig genommen, da ich eine Eigenschaft gesucht habe die sich erst beim öffnen des Recordsets initialisiert und somit auf Nothing abgefragt werden konnte.

NeeNee, wie kompliziert man es sich eigentlich machen kann und dabei war´s so einfach, aber dass Problem ist mehr als gelöst, danke nochmal !

:bimei

Gruß

Feivel

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...