DataSet, SQL2005 und IDENTITY-Probleme

12/12/2008 - 14:39 von Michael Kolowicz | Report spam
Guten Tag,

folgendes Szenario haben wir zur Zeit:

Wir haben eine Alte Anwendung (OldApp) die durch unseres neue Anwendung
(NewApp) ersetzt werden soll. Die Fehler in OldApp was das DB-Design
betrifft, wurden in NewApp nicht mehr geamcht ;-)

Deshalb brauchen wir für den Umstieg ein Tool, das uns die Daten
portiert.

Als in VB-2008 eine Windows-Forms erstellt (PortApp). Dort haben wir
zwei DataSets erstellt (dsOld und dsNew). In diesen DataSets sind die
Tabellen über den Server-Explorer eingefügt worden.

Dann haben wir eine Klasse erzeugt, die eine Methode ConvertData
enthàlt. Dies sieht dann so aus:

maxCounter = dsOld.oldTable.Count - 1
For iCounter = 0 To maxCounter
rowOld = dsOld.oldTable.Rows(iCounter)
rowNew = dsNew.MyTable.NewMyTableRow

With rowNew
.DataID = rowOld.EntryID
.UserName = rowOld.UserName
End With

dsNew.MyTable.AddMyTableRow(rowNew)
Next

MyTableTableAdapter.Update(dsNew.MyTable)

Meine Frage nun:
Wie müssen die Einstellungen im Dataset und auf der Datenbanktabelle
sein, damit ich die Informationen 1:1 kopiert bekomme und nach dem
Kopieren troztdem eine AutoIncrement der Spalte DataID habe. Zu bedenken
ist, dass die DataID nicht fortlaufend ist, wenn die daten aus OldApp
kopiert werden.

Gibt es ein gutes Whitepaper/HowTo im Internet, was mir eine passende
idee/Lösung liefern kann bzw. wie habt ihr das ganze gelöst?

Mit freundlichen WE-Grüßen
Michael
 

Lesen sie die antworten

#1 Elmar Boye
12/12/2008 - 23:17 | Warnen spam
Hallo Michael,

"Michael Kolowicz" schrieb ...

Du hattest doch bereits einen Thread in der Datenbank NG laufen,
da hàttest Du auch weiter machen können...

Deshalb brauchen wir für den Umstieg ein Tool, das uns die Daten
portiert.



Zunàchst die Frage: Laufen beide Datenbanken unter SQL Server?
Denn dann wàre es grundsàtzlich günstiger auf das DataSet zu
verzichten und die Daten direkt via T-SQL zu übertragen.

Unterschiedliche Datenbanken lassen sich via
Datenbank.Schema.Tabelle
und unterschiedliche Server/Instanzen via
Server.Datenbank.Schema.Tabelle
ansprechen, wobei für Server ein Verbindungsserver
einzurichten wàre.

Als in VB-2008 eine Windows-Forms erstellt (PortApp). Dort haben wir
zwei DataSets erstellt (dsOld und dsNew). In diesen DataSets sind die
Tabellen über den Server-Explorer eingefügt worden.

Dann haben wir eine Klasse erzeugt, die eine Methode ConvertData
enthàlt. Dies sieht dann so aus:
maxCounter = dsOld.oldTable.Count - 1
For iCounter = 0 To maxCounter
rowOld = dsOld.oldTable.Rows(iCounter)
rowNew = dsNew.MyTable.NewMyTableRow

With rowNew
.DataID = rowOld.EntryID
.UserName = rowOld.UserName
End With

dsNew.MyTable.AddMyTableRow(rowNew)
Next

MyTableTableAdapter.Update(dsNew.MyTable)



Das macht am Ende nur viel Kopierei um Nichts
(um mal ein bekanntes Zitat zu verfàlschen ;-)

Ebensogut kannst Du hier einen besonderen SqlDataAdapter erstellen,
der die Daten in die neue Tabelle eintràgt.
Das geht selbst mit typisierten DataSets - die IMHO für die einmalige
Sache eher Overhead denn wirklich hilfreich sind) in dem Du einen
angepassten TableAdapter verwendest.

Denn auch wenn es die Designer nahelegen ist es nicht zwangsweise
so, dass Du die gleiche Tabelle für ein InsertCommand wie beim
SelectCommand verwendest.

Wie müssen die Einstellungen im Dataset und auf der Datenbanktabelle
sein, damit ich die Informationen 1:1 kopiert bekomme und nach dem
Kopieren troztdem eine AutoIncrement der Spalte DataID habe.



Das im Datenbank Thread bereits genannte IDENTITY_INSERT tut dabei
schon seine Dienste.
Nur darfst Du dann nicht mit dem Standard-Insert des Designers arbeiten,
der immer eine neue ID abholen will, - sondern die IDENTITY Spalte
im INSERT Befehl als ganz normale Spalte angeben.

Da Identity Insert immer nur für eine Tabelle aktiv sein darf,
solltest Du es direkt vor dem UPdate aktivieren und anschliessend
gleich wieder deaktivieren - beim typisierten DataSet gehts nur,
wenn man die Verbindung selbst steuert.

Gibt es ein gutes Whitepaper/HowTo im Internet, was mir eine passende
idee/Lösung liefern kann bzw. wie habt ihr das ganze gelöst?



Das làßt sich mit etwas Eigenprogrammierung leicht lösen, solange
man dabei die Designer aus dem Wege ràumt (oder gleich links liegen
làßt). Denn die sind für Standard-Aufgaben gedacht - ADO.NET kann
aber noch ein klein bissel mehr, was sie nicht abdecken.

Noch etwas fixer geht es im übrigen mit SqlBulkCopy, wobei dabei
einige Grundbedingungen erfüllt sein müssen... Bevor ich das weiter
ausführe, sollte erst die Eingangsfrage geklàrt sein.

Gruß Elmar

Ähnliche fragen