Boro Geschrieben 12. Juni 2002 Geschrieben 12. Juni 2002 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 Zitieren
fireworker Geschrieben 12. Juni 2002 Geschrieben 12. Juni 2002 Du mußt das Recordset mit Nothing setzen, danach kannst Du es schliessen. Probier's doch einfach mal aus. Zitieren
BlearSun Geschrieben 12. Juni 2002 Geschrieben 12. Juni 2002 Nein. Wenn er sein Recordset auf Nothing setzt, kann er doch nicht mehr close aufrufen! Zitieren
BlearSun Geschrieben 12. Juni 2002 Geschrieben 12. Juni 2002 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 Zitieren
BlearSun Geschrieben 12. Juni 2002 Geschrieben 12. Juni 2002 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 Zitieren
Boro Geschrieben 12. Juni 2002 Autor Geschrieben 12. Juni 2002 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 Zitieren
Empfohlene Beiträge
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.