| |  | 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

 Beiträge: 55 Registriert: 15.06.2004 Win 7; Map2012
|
erstellt am: 18. Aug. 2010 13:51 <-- editieren / zitieren --> Unities abgeben:         
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 Funktion1Dim 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 LongDim 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 / zitieren -->
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

 Beiträge: 55 Registriert: 15.06.2004 Win 7; Map2012
|
erstellt am: 19. Aug. 2010 08:28 <-- editieren / zitieren --> Unities abgeben:         
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
   
 Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 19. Aug. 2010 12:30 <-- editieren / zitieren --> Unities abgeben:          Nur für Karl01
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 >>)
 |