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.