Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben

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

Geschrieben (bearbeitet)

oder man verwendet im finally kein eventuell gar nicht instanziertes access objekt, dann klappts auch mit dem try-catch :rolleyes:

Also oben alles mit rein ins try-catch, und im finally halt noch prüfen, dann sollte es gehen.

Bearbeitet von 0815FIA
Geschrieben

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

Geschrieben

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

Geschrieben (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 von informatikerin86
Geschrieben

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?

Geschrieben

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

Geschrieben

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

Geschrieben

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

Geschrieben


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.

Geschrieben (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 von informatikerin86
Geschrieben

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.

Geschrieben

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.

Geschrieben
[...]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?

Geschrieben (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 von informatikerin86
Geschrieben

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.

Geschrieben

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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...