informatikerin86 Geschrieben 12. November 2009 Geschrieben 12. November 2009 Hallo, ich habe eine VB.net Anwendung. Diese soll beim Beenden eine Access-DB aufrufen um ein Makro auszufĂŒhren. Danach wird die vom Makro gespeicherte Datei auf dem Server gesichert. An sich funktioniert das ganze auch mit folgendem Code: -- Imports Access = Microsoft.Office.Interop.Access Dim oAccess As Access.ApplicationClass oAccess = CreateObject("Access.Application") Try oAccess.OpenCurrentDatabase("D:\Datenbank.mdb") Timer1.Start() Catch ex As Exception 'MsgBox("Fehler") wf.beenden() Finally oAccess.CloseCurrentDatabase() End Try Mein Problem ist, das nicht jeder Rechner auf dem das Programm ausgefĂŒhrt werden soll Access drauf hat. Bei denen stĂŒrtzt das Programm sofort ab weil es den Import nicht hinbekommt. Was kann ich nun mit dem Import machen? Geht der auch an einer andere Stelle oder gibt es eine Möglichkeit den Import zu ignorieren und das Programm beim beenden einfach normal zu beenden ohne Access zu öffnen? GrĂŒĂe Informatikerin Zitieren
Guybrush Threepwood Geschrieben 12. November 2009 Geschrieben 12. November 2009 Warum nimmst du Dim oAccess As Access.ApplicationClass oAccess = CreateObject("Access.Application") [/PHP] nicht einfach mit ins try catch:confused: Zitieren
informatikerin86 Geschrieben 12. November 2009 Autor Geschrieben 12. November 2009 Danke fĂŒr deine Antwort. Das hatte ich schon im try catch Block drin, ich hatte auch schon 2 Blöcke drum rum gemacht. Allerdings ist das nicht das Problem. Auch völlig ohne Aufruf stĂŒrtzt das Programm ab sobald ich den Import drin stehen habe. Ohne kann ich dann aber das Access nicht aufrufen.... Zitieren
Guybrush Threepwood Geschrieben 12. November 2009 Geschrieben 12. November 2009 Achso dann wĂŒrde ich sagen darfst du die Access sachen nicht statisch importieren sondern dynamisch zur Laufzeit laden wenn vorhanden. Zitieren
TDM Geschrieben 13. November 2009 Geschrieben 13. November 2009 Oder man deklariert alle Variablen als Object und benutzt Reflection. Zitieren
0815FIA Geschrieben 16. November 2009 Geschrieben 16. November 2009 (bearbeitet) oder man verwendet im finally kein eventuell gar nicht instanziertes access objekt, dann klappts auch mit dem try-catch Also oben alles mit rein ins try-catch, und im finally halt noch prĂŒfen, dann sollte es gehen. Bearbeitet 16. November 2009 von 0815FIA Zitieren
informatikerin86 Geschrieben 17. November 2009 Autor Geschrieben 17. November 2009 Hallo Leute, danke fĂŒr eure Antworten! Es tut mir Leid, dass ich erst so spĂ€t antworte, ich habe mich zu sehr darauf verlassen das eine Mail ankommt bei neuen Nachrichten. Und vielen Dank fĂŒr den Hinweis mit dem Finallay!! Vollkommen logisch das ich nicht etwas beenden kann was nicht sicher geöffnet wurde... ich hatte vorher zwei try catch blöcke drum. Da ich mich nicht erinnern konnte wofĂŒr habe ich den einen gelöscht :upps Jetzt habe ich drei try-catch-Blöcke, aber das Programm stĂŒrtzt immernoch mit einem Fehler ab. NatĂŒrlich nur an dem Rechner der kein Access drauf hat... Ich habe nach Import zur Laufzeit gesucht aber leider nichts gefunden. Vielleicht kann mir noch mal jemand helfen. GrĂŒĂe Informatikerin Zitieren
informatikerin86 Geschrieben 17. November 2009 Autor Geschrieben 17. November 2009 Okay, Import scheint es wirklich nicht zu sein... Hier mal mein Code: Try Dim oAccess As Access.ApplicationClass oAccess = CreateObject("Access.Application") Try oAccess.OpenCurrentDatabase("D:\Prozessdatenbank.mdb") Timer2.Start() Catch ex As Exception wf.beenden() 'Finally ' Try ' oAccess.CloseCurrentDatabase() ' Catch ex As Exception ' wf.beenden() ' End Try End Try Catch ex As Exception wf.beenden() End Try Das Programm steigt immer mit der Fehlermeldung fĂŒr einen unbekannten Fehler aus. Allerdings wird trotzdem der Timer 2 gestartet. Das verstehe ich nicht. Eine MsgBox schreibt er nicht raus, nur eben der Timer startet und nach 2 Sekunden werden meine Dos-Fenster geöffnet... Warum funktioniert das und warum ist er ĂŒberhaupt in dem Block drin?? Zitieren
0815FIA Geschrieben 17. November 2009 Geschrieben 17. November 2009 Steht in der Inner Exception was drin? Zitieren
informatikerin86 Geschrieben 17. November 2009 Autor Geschrieben 17. November 2009 ja, da wird die Funktion beenden() aufgerufen. Der ganze Code wird beim beenden ausgefĂŒhrt. Wenn ein Teil nicht funktioniert soll also einfach immer die Anwendung normal beendet werden. Zitieren
0815FIA Geschrieben 17. November 2009 Geschrieben 17. November 2009 Ich meinte die Exception die geworfen wird, da gibt es den Punkt "Inner Exception". Meist stehen da genauere Infos. Am besten machst du alle Exceptions an (auch die "grĂŒnen") Zitieren
informatikerin86 Geschrieben 17. November 2009 Autor Geschrieben 17. November 2009 (bearbeitet) Achso. Das geht nicht, auf dem Rechner mit dem Debugger ist Access installiert. Ich kann also nur ĂŒber erstellen die Anwendung erstellen und dann den Release-Ordner auf den anderen Rechner kopieren und testen... ich habs eben mal mit: If File.Exists("C:\Program Files\Microsoft Office\OFFICE11\msaccess.exe") Then probiert. Das geht funktioniert leider auch nicht. Jedenfalls kommt der Fehler wieder und der Timer wird gestartet Bearbeitet 17. November 2009 von informatikerin86 Zitieren
0815FIA Geschrieben 17. November 2009 Geschrieben 17. November 2009 Naja, das hat ja wenig Sinn, da kann man ja nur spekulieren... Ich wĂŒrde an deiner stelle Access einfach mal deinstallieren, dauert ja nun auch nicht soo lange e: was passiert eigentlich in wf.beenden() genau? Nur ein Application.Exit(), oder noch mehr? Zitieren
TDM Geschrieben 17. November 2009 Geschrieben 17. November 2009 FĂŒr den Ohne-Access-Rechner kannst du auch einfach ein Log der Exceptions ausgeben lassen. Zitieren
informatikerin86 Geschrieben 17. November 2009 Autor Geschrieben 17. November 2009 Access deinstallieren klingt stressig, vor allem da wir nur ne image-dvd haben auf der access mit drauf ist... wie mache ich denn eine log der exeptions? in wf.beenden() passiert einiges, das lÀuft auch schon seit wochen richtig. da werden 7 temporÀre Textfiles gelöscht, dann wird eine Batch-Datei aufgerufen, ein Ordner gelöscht und der Zeitpunkt in einer neuen Txt-Datei abgespeichert wenn ich das rausnehme (nur als test) und einfach nur App.exit mache kommt derselbe fehler wie eben schon Zitieren
informatikerin86 Geschrieben 17. November 2009 Autor Geschrieben 17. November 2009 ich habe herausgefunden warum der Timer gestartet wird... bzw. er wird nicht gestartet sondern nur das was er macht... das steht auch in ApplicationShutdown drin... da ich das vor monaten programmiert habe habe ich daran leider nicht mehr gedacht... d.h. der timer startet nicht, aber der fehler beendet die anwendung... Zitieren
informatikerin86 Geschrieben 17. November 2009 Autor Geschrieben 17. November 2009 das verstehe ich nicht! If File.Exists("C:\Program Files\Microsoft Office\OFFICE11\msaccess.exe") = True Then MsgBox("Da") wf.beenden() Else MsgBox("nicht da") wf.beenden() End If das funktioniert, der ohne-access rechner merkt das er kein access hat und beendet das programm. wenn ich aber anstatt MsgBox("Da") meinen Code reinschreibe: Try Dim oAccess As Access.ApplicationClass oAccess = CreateObject("Access.Application") oAccess.OpenCurrentDatabase("P:\ProzessdatenblĂ€tter\Dateien fĂŒr Prozessdatenverwaltung\Prozessdatenbank.mdb") Timer2.Start() Catch ex As Exception 'MsgBox("Fehler") wf.beenden() End Try dann steigt er wieder mit einem fehler aus. warum macht er das??? Zitieren
0815FIA Geschrieben 17. November 2009 Geschrieben 17. November 2009 Try Dim oAccess As Access.ApplicationClass oAccess = CreateObject("Access.Application") oAccess.OpenCurrentDatabase("P:\ProzessdatenblĂ€tter\Dateien fĂŒr Prozessdatenverwaltung\Prozessdatenbank.mdb") Timer2.Start() Catch ex As Exception MsgBox("Fehler: {0}", ex.InnerException) wf.beenden() End Try Versuch mal ob er dir hiermit was ausspuckt. Zitieren
informatikerin86 Geschrieben 18. November 2009 Autor Geschrieben 18. November 2009 (bearbeitet) Guten Morgen, da ich gestern mittag dem vorherigen Rat gefolgt bin und Access deinstalliert habe steht mir nun eine schöne groĂe fehlerliste zur verfĂŒgung. Das alte Release stĂŒrtzt nun an dem Rechner an derselben Stelle ab, ein neues kann ich wegen den Fehlern im Code nicht erstellen. Vielleicht helfen die ja auch schon weiter: 1. Warnung 1 Der in Imports "Microsoft.Office.Interop.Access" angegebene Namespace oder Typ enthĂ€lt keine öffentlichen Member oder kann nicht gefunden werden. Stellen Sie sicher, dass der Namespace oder der Typ definiert ist und mindestens einen öffentlichen Member enthĂ€lt und dass der importierte Elementname keine weiteren Aliase enthĂ€lt. Fehler 3 Der Typ "Access.ApplicationClass" ist nicht definiert. Warnung 6 Eine Wrapperassembly fĂŒr die Access-Typbibliothek kann nicht gefunden werden. Warnung 7 Eine Wrapperassembly fĂŒr die DAO-Typbibliothek kann nicht gefunden werden. Warnung 8 Die Komponente "Access", auf die verwiesen wird, wurde nicht gefunden. Warnung 9 Die Komponente "DAO", auf die verwiesen wird, wurde nicht gefunden. Den Verweis auf Access 11 habe ich drin. Bearbeitet 18. November 2009 von informatikerin86 Zitieren
athlet1 Geschrieben 18. November 2009 Geschrieben 18. November 2009 So nun geb ich auch mal meinen Senf dazu, auch ohne von VB ne Ahnung zu haben:-) Schau dir mal den folgenden Link an: Using the CreateObject and GetObject Functions Hier sind zwei wichtige Dinge zu finden. 1. The CreateObject function is also useful when you are not sure if the Office application you want to automate will be installed on the computer that runs your code. The following example illustrates how to use the CreateObject function to make sure an application is available for automation: Sub CreateObjectExample() Dim objApp As Object Const ERR_APP_NOTFOUND As Long = 429 On Error Resume Next ' Attempt to create late-bound instance of Access application. Set objApp = CreateObject("Access.Application") If Err = ERR_APP_NOTFOUND Then MsgBox "Access isn't installed on this computer. " _ & "Could not automate Access." Exit Sub End If With objApp ' Code to automate Access here. .Quit End With Set objApp = Nothing End Sub 2. Note The Application object variable in this procedure is declared by using the Object data type and is late-bound to the application by using the CreateObject function. The code must be written this way, because, if an object variable is declared as a specific Application object type and that application is not present, the code will break. Achja, das deine Applikation sofort abstĂŒrzt, hĂ€ngt wohl damit zusammen, dass du da mit COM Objekten rumhantierst und die FehlerfĂ€lle wohl nicht in einer .NET Exception resultieren. Und noch was zum Klug******ern:-) If File.Exists("C:\Program Files\Microsoft Office\OFFICE11\msaccess.exe") = True Den Vergleich kannst du weglassen (Das Ergebnis von File.Exists() reicht völlig) bzw. wenn du ihn schon machst, dann nimm bitte nicht den Zuweisungsoperator, sondern den Vergleichsoperator. Zitieren
informatikerin86 Geschrieben 18. November 2009 Autor Geschrieben 18. November 2009 Vielen Dank fĂŒr deine Antwort. Der Codeausschnitt funktioniert leider nicht: Fehler 3 Der =-Operator ist fĂŒr die Typen "Microsoft.VisualBasic.ErrObject" und "Long" nicht definiert. Dern DAO-Verweis habe ich gelöscht da ich nicht mit DAO arbeite. Nun kommen noch diese beiden Fehler. Die verschwinden wenn ich den Access-Verweis rausnehme, dann habe ich aber immer noch nichts gewonnen. Warnung 1 Eine Wrapperassembly fĂŒr die Access-Typbibliothek kann nicht gefunden werden. Prozessdatenblattverwaltung Warnung 2 Die Komponente "Access", auf die verwiesen wird, wurde nicht gefunden. AuĂerdem erscheint immer noch der Fehler: Warnung 3 Der in Imports "Microsoft.Office.Interop.Access" angegebene Namespace oder Typ enthĂ€lt keine öffentlichen Member oder kann nicht gefunden werden. Stellen Sie sicher, dass der Namespace oder der Typ definiert ist und mindestens einen öffentlichen Member enthĂ€lt und dass der importierte Elementname keine weiteren Aliase enthĂ€lt. wenn ich den Import nicht ausklammere. Was ich natĂŒrlich auch nicht machen möchte... Ist das was ich machen will möglich? Wenn nicht einmal die Anwendung im Visual Studio lauffĂ€hig ist ohne das Access drauf ist, egal was ich danach fĂŒr einen Code schreibe?! PS: den letzten Codeabschnitt mit = true: den hatte ich auch erst weggelassen, da es nicht funktoniert hat habe ich eben = true dahinter gesetzt ohne eine wirkliche Logik darin zu erkennen. danach habe ich es nicht weggemacht weil es funktioniert hat. Also solange ich kein Access im Spiel hatte. Zitieren
0815FIA Geschrieben 18. November 2009 Geschrieben 18. November 2009 [...]auch ohne von VB ne Ahnung zu haben:-)[...] [...]dann nimm bitte nicht den Zuweisungsoperator, sondern den Vergleichsoperator. In VB wird sowohl die Zuweisung als auch der Vergleich mit einem einfachen "=" gemacht @topic: Hast du eigentlich eine Referenz auf die Access Interop in deinem Projekt? Zitieren
informatikerin86 Geschrieben 18. November 2009 Autor Geschrieben 18. November 2009 (bearbeitet) Was meinst du mit der Referenz auf die Access Interop im Projekt? Den Verweis Microsoft Access 11.0 Object Library? Ich habe in meinem Projekt auf demselben Weg Excel eingebunden, ohne Probleme, allerdings gibt es auch keinen PC im Werk der kein Excel drauf hÀtte... ... wenn ich Access wieder installiere (Wiederherstellungspunkt) dann funktioniert die Anwendung auf meinem PC wieder und auf dem anderen wieder nicht... hat sich ja auch nichts geÀndert... Bearbeitet 18. November 2009 von informatikerin86 Zitieren
athlet1 Geschrieben 18. November 2009 Geschrieben 18. November 2009 Wenn mich nicht alles tĂ€uscht, brauchst du sehr wohl DAO. Data Access Objects ? Wikipedia Ich weiĂ aus der hohlen Hand nicht, welche Verweise fĂŒr den Interop Zugriff auf Access notwendig sind, aber das rauszufinden, ist wohl kein Problem. Wegen dem = true: Ich habe mich in dem Punkt leider geirrt. In VB ist es wohl tatsĂ€chlich so, dass dies der Vergleichsoperator und Zuweisungsoperator in einer "Person" ist. (Noch ein Grund VB nicht zu mögen:-) ) Zur Not installierst du Access wieder und bringst den MSDN Code zum laufen. Dann sollte alles funktionieren, auch wenn kein Access installiert ist. Achja, zum testen bieten sich virtuelle Maschinen an. Die kann man konfigurieren wie man mag und der eigene (Entwicklungs-)Rechner bleibt wie er ist;) Hmm zu spĂ€t. Der Kollege hat auch schon die fehlende Referenz(en) im Blick. Zitieren
0815FIA Geschrieben 18. November 2009 Geschrieben 18. November 2009 Ok, wahrscheinlich liegt es an der Interop. Google mal nach Interop.Access.dll, die kann man frei herunterladen. Dann schmeiss die .dll irgendwo in einen Ordner in deinem Projekt, und fĂŒge eine Referenz darauf in VS hinzu. Dann kannst du dir nĂ€mlich glaube ich auch den Import sparen. 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.