Announcement

Collapse
No announcement yet.

Von Access nach MSSQL kopieren

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Von Access nach MSSQL kopieren

    Guten Abend zusammen,

    ich bin zurzeit an einem Projekt dran und habe dazu eine Frage.
    Ich möchte gerne mithilfe von C# eine Access Tabelle auf MSSQL kopieren.

    Leider funktioniert es nicht ich bekomme den Fehler falsche FROM Syntax angezeigt. Wäre um jede Hilfe Dankbar, falls es andere Möglichkeiten gibt die Daten zu kopieren immer her damit

    Hier mal mein Quelltext:

    [highlight=c#]
    SqlConnection con = new SqlConnection();
    con.ConnectionString = @"Data Source = MSSQL Server;" +
    "Initial Catalog = MSSQL Datenbank;" +
    "Integrated Security = true";

    string access= @"INSERT INTO [tabelle] (Value1,Value2,Value3,Value4,Value5,Value6,Value7, Value8,Value9,Value10,Value11)"
    + "FROM OPENROWSET("
    + "'Microsoft.JET.OLEDB.4.0',"
    + @"'Data Source=d:\Mein Ordner\test.mdb',"
    + @"'SELECT * FROM [test]')";

    SqlCommand zoneCmd = new SqlCommand(access, con);

    try
    {
    con.Open();
    SqlDataReader zoneDr = zoneCmd.ExecuteReader();
    zoneDr.Read();
    Parameter.Items.Add(zoneDr.GetString(0));
    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.Message.ToString());
    }
    [/highlight]
    Zuletzt editiert von Hans#; 24.10.2012, 14:33.

  • #2
    OpenRowset verwendest du wie eine Tabelle

    Also etwa

    Code:
    INSERT INTO Tabelle(Spalten)
    SELECT Spalten
      FROM OpenRowSet(ConnectionDaten)
    Bei dir fehlt mindestens das 'SELECT Spalten'.

    Comment


    • #3
      Originally posted by Hans# View Post

      Code:
                  string access= @"INSERT INTO [tabelle] (Value1,Value2,Value3,Value4,Value5,Value6,Value7,Value8,Value9,Value10,Value11)"
                                      + "FROM OPENROWSET("
                                      + "'Microsoft.JET.OLEDB.4.0',"
                                      + @"'Data Source=d:\Mein Ordner\test.mdb',"
                                      + @"'SELECT * FROM [test]')";
      Also die INsert Select Syntax lautet allgemein
      [HIGHLIGHT=SQL]
      INSERT INTO <DestTable> (<n werte>)
      SELECT <n werte> from <SourceTable/View>
      [where ..]
      [/HIGHLIGHT]

      Demnach ist bei Dir ein From zuviel. Ich kenne aber OPENROWSET Syntax nicht, mein Hinweis ist also etwas wackelig.

      BTW: Ohne Programmierung geht's auch gleich von ACCESS nach MSSQL. Ist von Fall zu Fall individuell leicht gemacht. Bei weiderkehrenden Aufgaben lohnt sich ein Programm schon eher.

      P.S: Oder so rum wie Ralf Jansen (kurz) vor mir schrieb.
      Gruß, defo

      Comment


      • #4
        Guten Morgen,

        danke für die schnelle Antworten. Habe die Syntax des SQL Statements insoweit angepasst bekomme aber nun eine andere Fehlermeldung.

        [highlight=c#]
        string access= @"INSERT INTO [tabelle] (Value1,Value2,Value3,Value4,Value5,Value6,Value7, Value8,Value9,Value10,Value11)"
        + "SELECT * FROM OPENROWSET("
        + "'Microsoft.JET.OLEDB.4.0',"
        + @"'Data Source=d:\Mein Ordner\test.mdb',"
        + @"'SELECT * FROM [test]')";
        [/highlight]

        Fehlermeldung lautet:

        Der Ole DB-Anbieter ' Microsoft.JET.OLEDB.4.0' kann für verteilte Abfragen nicht verwendet werden, da der Anbieter so konfiguriert ist, dass er im STA-Modus ausgeführt wird.
        Kurz noch mal zu den Systemen:
        Mein System Win 7 64Bit

        MSSQL ist ein 2008 Server
        Access mdb ist mit Access 95 erstellt worden.
        Zuletzt editiert von Hans#; 24.10.2012, 14:32.

        Comment


        • #5
          Falls keiner eine Lösung für das Problem kennt wäre es auch hilfreich eventuell eine Alternative mir zu nennen womit ich die Daten der Access mdb in MSSQL überführen kann.

          Comment


          • #6
            Originally posted by Hans# View Post
            Falls keiner eine Lösung für das Problem kennt wäre es auch hilfreich eventuell eine Alternative mir zu nennen womit ich die Daten der Access mdb in MSSQL überführen kann.
            STA=Single-Threaded Apartment

            Vielleicht hilft Dir das beim Suchen.

            Ich habe Dir oben geschrieben, dass Du Deine Daten auch von ACCESS direkt nach MS SQL schieben kannst. Per Insert Abfrage mit linked Tables, interaktiv.
            Gruß, defo

            Comment


            • #7
              Hi defo,

              also nach STA habe ich natürlich auch gegoogelt und nur gefunden das ich vor der methode [STAThread] einfügen soll. Dies führt aber weiterhin zur selben Fehlermeldung.

              Was meinst du mit der Insert Abfrage mit linked Tables?
              Das einfügen der Werte aus den Tabellen sollte als Quellcode erstellt werden da es mehrere Hundert stück sind.

              Es wäre schön wenn du mir eventuell ein code beispi

              Comment


              • #8
                also nach STA habe ich natürlich auch gegoogelt und nur gefunden das ich vor der methode [STAThread] einfügen soll. Dies führt aber weiterhin zur selben Fehlermeldung.
                Dein Prozess macht da auch nix es ist ja SQL das auf dem SQL Server ausgeführt wird. Welches Thread Apartment dein eigener Prozess hat ist dem SQL Server völlig egal. Dessen Apartment (besser das Apartment des Threads/Fibers des SQL Servers in dem die OleDB Connection zu Access geöffnet wird) müsstest du ändern wenn es denn ginge. Ich vermute mal der SQL Server will für einen Insert ... Select from OpenRowSet mehrere gleichzeitige Connections Richtung Access aufmachen wollen was Access als Single User Desktop System einfach nicht kann.

                Vielleicht kannst du bei OpenRowset irgendwo angeben das intern bitte immer nur ein Connection verwendet werden soll. Wenn nicht solltest du wenn, wie ich vermute, der Select * from OpenRowSet funktioniert, nur nicht die Kombination mit einen Insert, dir behelfen in dem du ein kleines T-SQL Script (oder Stored Procedure) schreibst den Select * from OpenRowset als Cursor öffnen und du dann einzelne Inserts aus der Cursor-Schleife absetzt. Ist langsamer als dein gewünschter Konstrukt aber bestimmt schneller als sich eine DataPump mit ADO.Net zu schreiben und die Daten durch deinen Prozess zu schleusen.

                Comment


                • #9
                  Originally posted by Hans# View Post
                  Was meinst du mit der Insert Abfrage mit linked Tables?
                  Das einfügen der Werte aus den Tabellen sollte als Quellcode erstellt werden da es mehrere Hundert stück sind.
                  Es wäre schön wenn du mir eventuell ein code beispi
                  Ein Code Beispiel kann ich Dir nicht liefern, es ist zunächst interaktiv. Wenn wäre es vermutlich VB.
                  Die Plattform (driving site) ist access, das System mit den Quelldaten. Was folgt, kannst Du für eine Tabelle mal manuell ausprobieren.
                  Hier werden per Tabellenverknüpfung alle zu befüllenden MS SQL Tabellen eingelinkt.
                  Nun interaktiv eine Insert Abfrage erstellen, von Access Quelltabelle nach MSSQL (verknüpfte Tabelle ).
                  Die Abfrage starten.
                  Fertig.

                  Wenn das zufriedenstellend funktioniert, kann man sich Gedanken machen ob es per Access Makro, autmatisiert erstellten Makros oder VB Modul automatisierbar ist.
                  Gruß, defo

                  Comment

                  Working...
                  X