none
Access automatisieren RRS feed

  • Frage

  • Guten Morgen an Alle,

    so richtig was Passendes hab ich leider nicht gefunden, und das, was ich gefunden hab funktioniert leider nicht. Doch zum Thema...

    Ziel: Tabelle (nur Struktur) von QuellDB in ZielDB importieren.

    Problem: ...bekomme die Fehlermeldung, dass die DB nicht geöffnet werden kann, da sie entweder nicht existiert, oder bereits durch einen anderen Nutzer geöffnet wurde, bzw. dass sie keine *.adp Datei ist.

    Mein Versuch:

    Dieses Beispiel (unter VB.NET) hab ich mir entsprechend angepasst. Die jeweiligen 12er Bibliotheken eingebunden.... und so sieht es dann (exemplarisch) aus:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using Office = Microsoft.Office.Core;
    using Access = Microsoft.Office.Interop.Access;
    
    namespace Test
        {
        class Program
            {
            static void Main( string[] args )
                {
                string quellDB = @"C:\Test\Quelle\Quell.mdb";
                string zielDB = @"C:\Test\Ziel\Ziel.mdb";
                string tab = "tDaten";
                cAccessDirekt.exportTabStruct(quellDB, zielDB, tab);
                }
            }
    
            /// <summary>
        /// Automatisieren von Access
        /// Einbinden der Microsoft Access x.x Object Library
        /// Einbinden der Microsoft Office x.x Object Library
        /// </summary>
        internal static class cAccessDirekt
            {
            /// <summary>
            /// Importieren der übergebenen Tabelle (nur Struktur) mit vorherigem löschen
            /// Bsp.: http://support.microsoft.com/kb/317113/de
            /// </summary>
            /// <param name="QuellDB">HerkunftsDB der zu importierenden Tabelle inkl.Tabellenname</param>
            /// <param name="ZielDB">ZielDB mit Tabellenname</param>
            /// <param name="tabelle">Tabellenname der zu löschenden und zu importierenden Tabelle</param>
            internal static void exportTabStruct( string QuellDB, string ZielDB, string tabelle )
                {
                try
                    {
                    Access.Application objAc = new Access.Application();
                    objAc.OpenAccessProject(ZielDB, false);//ZielDB öffnen
                    objAc.DoCmd.Close(Access.AcObjectType.acTable, tabelle);
                    objAc.DoCmd.DeleteObject(Access.AcObjectType.acTable, tabelle);
                    objAc.DoCmd.TransferDatabase(Access.AcDataTransferType.acImport,
                        "Microsoft Access", QuellDB, Access.AcObjectType.acTable, tabelle, tabelle, true);
                    objAc.CloseCurrentDatabase();
                    }
                catch ( Exception avex )
                    {
                    Console.WriteLine(avex.ToString());
                    }
                }
            }
        }

    Frage: Wo liegt mein Fehler?

    Besten Dank für Eure Anteilnahme...:)

    Ralf


    • Bearbeitet Ralf A Dienstag, 4. März 2014 07:29
    Dienstag, 4. März 2014 07:28

Antworten

  • Hallo Ralf,

    wenn es dir wirklich nur darum geht, eine Tabellenstruktur (ginge auch mit Daten, ...) von einer mdb in eine andere mdb zu klonen, brauchst Du Access überhaupt nicht. Das geht auch rein über Jet (bzw. ggfs. auch über ACE, hab ich aber bisher nie probiert).

    Erstell mal eine OleDbConnection mit Jet 4.0 als Provider (siehe http://www.connectionstrings.com/access/, Abschnitt Microsoft Jet OLE DB 4.0 für einen ConnectionString) auf die Zieldatenbank und lass dort folgendes SQL Statement ausführen:

    SELECT *
    INTO   tDaten
    FROM   C:\Test\Quelle\Quell.mdb.tDaten
    WHERE  1 = 0

    Um auch die Daten zu kopieren, einfach die WHERE Klausel weglassen.

    Was bei SELECT * INTO FROM ... leider nicht kopiert wird, sind die Indizes und Schlüssel. Wenn Du die auch brauchst, wäre ADOX ggfs. eher was für dich, damit kannst Du sämtliche Elemente, die Du benötigst auslesen und dann die Objekte daraus an anderer Stelle fürs Einfügen nutzen.

      http://msdn.microsoft.com/en-us/library/windows/desktop/ms676514.aspx

      http://msdn.microsoft.com/en-us/library/windows/desktop/ms677529.aspx



    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community




    Mittwoch, 5. März 2014 21:34
    Moderator
  • Habe es eben selbst herausgefunden. was fehlte war ein Verweis auf:

    System.Runtime.InteropServices.ComTypes;

    Damit läuft es...;)

    Trotzdem Danke an Alle, die sich damit beschäftigt haben!

    Ralf

    • Als Antwort markiert Ralf A Mittwoch, 5. März 2014 21:31
    Mittwoch, 5. März 2014 21:31

Alle Antworten

  • Hallo Ionut,

    Danke für den Link! Weitestgehend entspricht er ja meinem Code. Allerdings bekomme ich, wenn ich

    objAc = new Access.ApplicationClass();

    verwende, die Fehlermeldung, dass ApplicationClass nicht eingebunden werden kann. Deshalb hatte ich ja

    objAc = newAccess.Application();

    also ohne Class verwendet. Ob da der Wurm drin steckt? Kann ich mir kaum vorstellen, da ich die notwendigen Bibliotheken (allerdings die 12er und nicht die 10er) eingebunden habe.

    Das Beispiel klemmt also irgendwo. Jedoch habe ich keine Ahnung wo genau.

    Für Alternativen eine Tabellenstruktur(!) aus Access, auch ohne Access Bordmittel, zu importieren bin ich nach wie vor offen.

    Danke für neue Vorschläge und Ideen!

    Ralf

    Mittwoch, 5. März 2014 21:01
  • Habe es eben selbst herausgefunden. was fehlte war ein Verweis auf:

    System.Runtime.InteropServices.ComTypes;

    Damit läuft es...;)

    Trotzdem Danke an Alle, die sich damit beschäftigt haben!

    Ralf

    • Als Antwort markiert Ralf A Mittwoch, 5. März 2014 21:31
    Mittwoch, 5. März 2014 21:31
  • Hallo Ralf,

    wenn es dir wirklich nur darum geht, eine Tabellenstruktur (ginge auch mit Daten, ...) von einer mdb in eine andere mdb zu klonen, brauchst Du Access überhaupt nicht. Das geht auch rein über Jet (bzw. ggfs. auch über ACE, hab ich aber bisher nie probiert).

    Erstell mal eine OleDbConnection mit Jet 4.0 als Provider (siehe http://www.connectionstrings.com/access/, Abschnitt Microsoft Jet OLE DB 4.0 für einen ConnectionString) auf die Zieldatenbank und lass dort folgendes SQL Statement ausführen:

    SELECT *
    INTO   tDaten
    FROM   C:\Test\Quelle\Quell.mdb.tDaten
    WHERE  1 = 0

    Um auch die Daten zu kopieren, einfach die WHERE Klausel weglassen.

    Was bei SELECT * INTO FROM ... leider nicht kopiert wird, sind die Indizes und Schlüssel. Wenn Du die auch brauchst, wäre ADOX ggfs. eher was für dich, damit kannst Du sämtliche Elemente, die Du benötigst auslesen und dann die Objekte daraus an anderer Stelle fürs Einfügen nutzen.

      http://msdn.microsoft.com/en-us/library/windows/desktop/ms676514.aspx

      http://msdn.microsoft.com/en-us/library/windows/desktop/ms677529.aspx



    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community




    Mittwoch, 5. März 2014 21:34
    Moderator
  • Hallo Stephan,

    Danke für Deine Rückmeldung! Mir ging es ja vorallem um die Indizies und Schlüssel, deshalb ja das ganze 'Gezaubere'. Schaue mir aber dennoch mal Deine Links an. Klingt interessant!

    Zu den o.g. Links: Die bezogen sich auf Office 2003 und VS 2005. Ich brauchte aber was für Office 2007 (von daher fällt Jet als Provider wahrscheinlich sowieso aus) unter VS 2012.

    Viele Grüße

    Ralf


    • Bearbeitet Ralf A Mittwoch, 5. März 2014 22:07
    Mittwoch, 5. März 2014 22:05
  • Hallo Ralf,

    in dem Fall nimm die Access Database Engine.

      http://www.microsoft.com/de-de/download/details.aspx?id=13255

    Du musst allerdings aufpassen, wenn schon eine Officeversion installiert ist (man braucht die nicht, wenn sie aber da ist, muss die Access Database Engine bzgl. der Prozessorarchitektur dazu passen. Also wenn Office 32 Bit, dann auch ACE 32 Bit. Office 64 Bit -> ACE 64 Bit)

    Letztendlich ändert sich in deinem Programm nur der ConnectionString. Wie gesagt, ich habs noch nicht probiert, mit Jet 4 ging das früher schon problemlos, bei ACE bin ich mir nicht ganz sicher, ich denke aber, es sollte laufen.

    ADOX sollte auch mit ACE nutzbar sein. Meine letzten Berührungspunkte liegen aber schon ein wenig zurück, daher kann ich das nicht 100%ig sagen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Donnerstag, 6. März 2014 09:47
    Moderator
  • Hi Stephan,

    bezüglich der Connectionstrings kann ich Dir (und allen anderen natürlich auch) diese Seite empfehlen. Da bleiben fast keine Wünsche offen.

    Gruß

    Ralf

    Donnerstag, 6. März 2014 11:10