Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

MS SQL-Server - Tabellen mit Identitätsspezifikation / Übernahme aus MDB per VBA

Begonnen von Schwabe-LA, April 21, 2015, 13:59:05

⏪ vorheriges - nächstes ⏩

Schwabe-LA

Hallo,

ich habe folgendes Problem: auf dem MS-SQL-Server sind für eine Access-Anwendung alle Tabellen und Views angelegt. Nun sollen in diese bestehende SQL-Server-DB alle Daten, die noch in lokalen Access-Tabellen liegen, eingespielt werden. In den Access-Tabellen werden Autowerte verwendet, auf dem SQL-Server entsprechende "Identitätsspezifikationen". Ich brauche ja nicht zu erwähnen, dass diese IDs identisch bleiben müssen :-). Ich habe nun schon alles Mögliche und Unmögliche probiert, um die Daten aller Tabellen per VBA 1:1 auf den SQL-Server zu bekommen. Das Hauptproblem ist, dass es manchmal geht, aber meistens nicht.

Hier ein Beispiel, wie ich es verucht habe:

Public Sub SQL_IDENTITY_ADODB()
'
   Dim cnn As ADODB.Connection
   Dim SQL As String
   
   Set cnn = New ADODB.Connection
   cnn.Open DB_Connection_String
   cnn.Execute "SET IDENTITY_INSERT Buchung_Pos ON", , adCmdText
   
   SQL = "INSERT INTO Buchung_Pos SELECT Buchung_Pos_lokal.* FROM Buchung_Pos_lokal;"
   CurrentDb.Execute SQL, dbFailOnError
   
   cnn.Execute "SET IDENTITY_INSERT Buchung_Pos OFF", , adCmdText
   cnn.Close
End Sub


Hinweis: bei der Tabelle "Buchung_Pos" handelt es sich um die eingebundene Tabelle auf dem SQL-Server; bei "Buchung_Pos_lokal" um die lokale Tabelle in der MDB.

Habt ihr eine Idee, wie ich dieses Problem in den Griff bekomme?


Viele Grüße und schon mal vielen Dank

Jochen


Schwabe-LA

Hallo,

herzlichen Dank für deine Antwort. Ich habe das so wie dort beschrieben nun auch probiert. Das Ergebnis ist das Gleiche: hin und wieder klappt es, meistens aber nicht. Ich bin völlig ratlos ...


Viele Grüße

Jochen

Wurliwurm

Wenn der SQL-Server einen Fehler zurückgibt, kann man den mit cnn.errors oder cnn.nativeerror auslesen und die Fehlernummer googeln. Wenn es gelegentlich klappt, könnte das mit einer Sperrsituation zusammenhängen, aber das ist nur geraten.

  SQL = "INSERT INTO Buchung_Pos SELECT Buchung_Pos_lokal.* FROM Buchung_Pos_lokal;"
   CurrentDb.Execute SQL, dbFailOnError

Das Currentdb irritiert mich, weil es ein DAO.Befehl ist. Mit dem Server solltest Du nur mit ADO kommunizieren.

Ein SQL-Befehl über 2 Datenbanken hinweg, als INSERT INTO <ServerTabelle> SELECT * FROM <AccessTabelle> ist vielleicht nicht so gut. Kann sein, daß es diese Funktionalität gibt von MS, da bin ich kein Fachmann. Woher hast Du den geposteten Code?

Ich übertrage Daten vom Access auf den Server immer mit einer Schleife im Access, konkateniere einen INSERT-String und rufe dann einen ADODB.Command auf in jeder Zeile. Wenn Du willst, kann ich Dir ein Beispiel posten.