Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de
  AutoCAD VBA
  DAO Problem

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
  
NVIDIA GTC Paris und ISC High Performance-Konferenz 2025, eine Pressemitteilung
Autor Thema:  DAO Problem (1397 mal gelesen)
Karl01
Mitglied



Sehen Sie sich das Profil von Karl01 an!   Senden Sie eine Private Message an Karl01  Schreiben Sie einen Gästebucheintrag für Karl01

Beiträge: 55
Registriert: 15.06.2004

Win 7; Map2012

erstellt am: 18. Aug. 2010 13:51    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo!

Ich habe eine Funktion1 von der die Funktion2 aufgeruft wird. Wenn ich in der Funktion2 vor dem verlassen die Variablen db und ws auf Nothing setze, dann ist nach dem Rücksprung in die Funktion1 dort die Variable rstTest nicht mehr gültig. Wenn ich db und ws nicht auf Nothing setze dann funktioniert alles Problemlos.
Die Variablen ws und db sind zwar in beiden Funktionen vorhanden aber das müsste doch egal sein oder doch nicht?

Code:
Private Sub Funktion1

Dim ws As Workspace
Dim db As Database
Dim rstTest As Recordset

DBEngine.SystemDB = "C:\Temp\Test.mdw"
DBEngine.DefaultUser = "User1"
Set ws = DBEngine.Workspaces(0)
Set db = ws.OpenDatabase(Test.mdb)
Set rstTest = db.OpenRecordset(SQL)

...

Funktion2 (Anzahl)

....

If Not rstTest Is Nothing Then rstTest.Close: Set rstTest = Nothing
If Not db Is Nothing Then db.Close: Set db = Nothing
If Not ws Is Nothing Then ws.Close: Set ws = Nothing

End Sub



Code:
Private Function Funktion2 (anzahl as Long) as Long

Dim ws As Workspace
Dim db As Database
Dim rst As Recordset

DBEngine.SystemDB = "C:\Temp\Test.mdw"
DBEngine.DefaultUser = "User1"
Set ws = DBEngine.Workspaces(0)
Set db = ws.OpenDatabase(Test.mdb)
Set rst = db.OpenRecordset(SQL)

...

If Not rst Is Nothing Then rst.Close: Set rst = Nothing
If Not db Is Nothing Then db.Close: Set db = Nothing
If Not ws Is Nothing Then ws.Close: Set ws = Nothing

End Function


Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP


Ex-Mitglied

erstellt am: 18. Aug. 2010 16:39    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

hat gar nix mit AutoCAD zu tun, oder 

Den Code jetzt nachzubauen hab ich nicht genug Zeit, daher mal nur die Vermutung: DBEngine erzeugt bei mehrfachem Verbindungsaufbau (einmal in Funktion1 und dann nochmals in Funktion2) zu der gleichen MDB nur eine Referenzierung auf, und das erste .Close schliesst die Verbindung.

Was ich machen würde: gibt das Database-Objekt (db) oder wenn möglich das Recordset als Parameter von der Funktion1 an die Funktion2 als Parameter mit, das erspart Dir jede Menge unnötige Zugriffe und auch die Möglichkeit, dass Records vielleicht sogar gelockt sind, weil Du die gleichen Records in 2 Funktionen getrennt abfragst.

- alfred -

------------------
www.hollaus.at

Karl01
Mitglied



Sehen Sie sich das Profil von Karl01 an!   Senden Sie eine Private Message an Karl01  Schreiben Sie einen Gästebucheintrag für Karl01

Beiträge: 55
Registriert: 15.06.2004

Win 7; Map2012

erstellt am: 19. Aug. 2010 08:28    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Alfred!

Zitat:
hat gar nix mit AutoCAD zu tun, oder

ist richtig, ist aber nur ein Ausschnitt vom Programmcode der in der Autocad VBA läuft.
Da Du aber sehr aktiv in diesen Forum bist, kann man auch rasch mit einer Lösung rechnen, auch wenn es sich nicht nur um ein spezielles Autocad Problem handelt. Vielen Dank!

Der Tipp mit der Parameterübergabe funktioniert

Zitat:
dass Records vielleicht sogar gelockt sind, weil Du die gleichen Records in 2 Funktionen getrennt abfragst

Ja das müßte auch funktionieren. In meinem Fall sind aber die Records mit unterschiedlichen Daten

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

fuchsi
Mitglied
Programmierer c#.net Datawarehouse


Sehen Sie sich das Profil von fuchsi an!   Senden Sie eine Private Message an fuchsi  Schreiben Sie einen Gästebucheintrag für fuchsi

Beiträge: 1201
Registriert: 14.10.2003

AutoCad Version 2012 deu/enu
<P>Windows 7 64bit

erstellt am: 19. Aug. 2010 12:30    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Karl01 10 Unities + Antwort hilfreich

Du zerstörst ja in Funktion2 den Workspace der DBEngine, da du ja die gleiche DBENgine in Funktion1 und Funktion2 verwendest.

Besser ist es, den Workspace bzw. DatabaseObjekt der Funktion 2 zu übergeben, hier einen Recordset öffnen, und diesen wieder ebednen


Code:
Private Sub Funktion1

    Dim ws As Workspace
    Dim db As Database
    Dim rstTest As Recordset

    DBEngine.SystemDB = "C:\Temp\Test.mdw"
    DBEngine.DefaultUser = "User1"
    Set ws = DBEngine.Workspaces(0)
    Set db = ws.OpenDatabase(Test.mdb)
    Set rstTest = db.OpenRecordset(SQL)

    ...

    Funktion2 (Anzahl, db)

    ....

    rstTest.close
    db.close
    ws.close
End Sub


Private Function Funktion2 (anzahl as Long, db as Database) as Long

    Dim rst As Recordset
    Set rst = db.OpenRecordset(SQL)

    ...
   
    rst.close
End Function


Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2025 CAD.de | Impressum | Datenschutz