Thomas Schulz
2005-11-19 16:43:35 UTC
Moin,
ich möchte für ein neues .NET-Projekt, bei dem ich den SQL-Server 2000 als Datenbank verwende, Daten einer früheren
ACCESS-Implementierung dieser Applikation weiterverwenden. Komfortablerweise soll der Import programmgesteuert aus einem
Updater-Modul der Anwendung geschehen.
Ich scheitere momentan an der Umsetzung des Imports von Daten aus Tabellen mit Identitätsspalten.
Natürlich benötige ich die ursprünglichen ID's.
Bisher - 'händisch' - verwende ich folgende Strategie:
- Import aus ACCESS per Enterprise Manager über Variante 'Abfrage'. (Dabei werden keinen Identitätseigenschaften erzeugt)
- Nachträgliches Setzen der Identitätseigenschaft mit dem Manager
Nun möchte ich das gerne per Code bewerkstelligen.
Mein erstes Problem, hier aber nur nebenher thematisiert:
Gerne würde ich eine INSERT INTO Konstruktion anwenden, mir ist aber nicht klar, wie ich das über zwei unterschiedliche Connections
hin (SQL-Server/ACCESS) durchführen kann.
Bliebe ja noch die Variante, ein Dataset als Puffer zwischenzuschalten und nach dem Füllen aus ACCESS notfalls auch zeilenweise an
die SQL-Server-Tabellen auszugeben.
Aber spätestens hier kommt mein zweites und ernsthaftes Problem:
Wie schaffe ich es bei dieser Konstellation, die Original-ID's in die 'frischen' SQL-Server-Tabellen mit Identity-Spalten zu
bekommen?
Meine erste Idee: Setzen der Identity-Eigenschaft erst nach dem INSERT
Da scheint es aber keine T-SQL-Syntax für zu geben... ??
Zweite Variante: Anwenden von SET IDENTITY_INSERT 'meineTabelle' ON vor dem Import
Das scheint aber schon beim Simulieren mit dem QUERY-Analyser nicht zu funktionieren.
Der INSERT-Aufruf schlägt wegen Verletzuung der Identity-Bedingung fehl.
Außerdem weiß ich nicht, ob SET Statements überhaupt über die .ExecuteNonQuery() Methode ausgeführt werden können.
Und möglicherweise bekomme ich da auch noch Rechte-Probleme auf dem SQL-Server...
Irgendwie muss es der Enterprise Manager ja aber auch können, denn damit geht's ja.
Wie macht der das bloß?
Für guten Rat bedankt sich
Thomas Schulz
ich möchte für ein neues .NET-Projekt, bei dem ich den SQL-Server 2000 als Datenbank verwende, Daten einer früheren
ACCESS-Implementierung dieser Applikation weiterverwenden. Komfortablerweise soll der Import programmgesteuert aus einem
Updater-Modul der Anwendung geschehen.
Ich scheitere momentan an der Umsetzung des Imports von Daten aus Tabellen mit Identitätsspalten.
Natürlich benötige ich die ursprünglichen ID's.
Bisher - 'händisch' - verwende ich folgende Strategie:
- Import aus ACCESS per Enterprise Manager über Variante 'Abfrage'. (Dabei werden keinen Identitätseigenschaften erzeugt)
- Nachträgliches Setzen der Identitätseigenschaft mit dem Manager
Nun möchte ich das gerne per Code bewerkstelligen.
Mein erstes Problem, hier aber nur nebenher thematisiert:
Gerne würde ich eine INSERT INTO Konstruktion anwenden, mir ist aber nicht klar, wie ich das über zwei unterschiedliche Connections
hin (SQL-Server/ACCESS) durchführen kann.
Bliebe ja noch die Variante, ein Dataset als Puffer zwischenzuschalten und nach dem Füllen aus ACCESS notfalls auch zeilenweise an
die SQL-Server-Tabellen auszugeben.
Aber spätestens hier kommt mein zweites und ernsthaftes Problem:
Wie schaffe ich es bei dieser Konstellation, die Original-ID's in die 'frischen' SQL-Server-Tabellen mit Identity-Spalten zu
bekommen?
Meine erste Idee: Setzen der Identity-Eigenschaft erst nach dem INSERT
Da scheint es aber keine T-SQL-Syntax für zu geben... ??
Zweite Variante: Anwenden von SET IDENTITY_INSERT 'meineTabelle' ON vor dem Import
Das scheint aber schon beim Simulieren mit dem QUERY-Analyser nicht zu funktionieren.
Der INSERT-Aufruf schlägt wegen Verletzuung der Identity-Bedingung fehl.
Außerdem weiß ich nicht, ob SET Statements überhaupt über die .ExecuteNonQuery() Methode ausgeführt werden können.
Und möglicherweise bekomme ich da auch noch Rechte-Probleme auf dem SQL-Server...
Irgendwie muss es der Enterprise Manager ja aber auch können, denn damit geht's ja.
Wie macht der das bloß?
Für guten Rat bedankt sich
Thomas Schulz