Jakiś czas temu pisałem na temat jak DataSet’a przenieść do MsSQL'a (z wykorzystaniem SQLServer Management Objects i SqlBulkCopy). W takim przypadku, gdy kolumna w tabeli w DataSet'cie ma ustawioną właściwość AutoIncrement, to należy w kolumnie w SQL serwerze ustawić Identity na true, oraz IdentityIncrement i IdentitySeed na odpowiednie im wartości (AutoIncrementStep i AutoIncrementSeed) pochodzącej ze źródłowej kolumny z tabeli z DataSet'a. Niestety w takim przypadku, podczas późniejszego ładowania danych do tabeli, kolumny danych korzystające z auto-inkrementacji (identity) mogą w efekcie być uzupełnione innymi danymi, niż wyglądało to w oryginalnym zestawie danych. Zobaczmy jak to można rozwiązać.
Właściwości Identity dla kolumny w serwerze Ms SQL nie można zmienić w istniejącej kolumnie (chyba że zrobimy na niej drop, ale to już inna historia), można natomiast wyłączyć efekt ustawienia tej właściwości. Robimy to przy pomocy SET
IDENTITY_INSERT, korzystając z następującej składni:
SET IDENTITY_INSERT [ database_name . [ schema_name ] . ] table { ON | OFF }
Okazuje się jednak, że w przypadku korzystania z SqlBulkCopy możemy
to zrobić przy pomocy ustawień odpowiednich opcji, a dokładniej
opcji SqlBulkCopyOptions.KeepIdentity.
Można to wykonać np. w następujący sposób:
SqlBulkCopyOptions option = SqlBulkCopyOptions.Default ^ SqlBulkCopyOptions.KeepIdentity; using ( SqlBulkCopy bulkCopy = new SqlBulkCopy( ConnectionString, option ) ) { //Destination table: bulkCopy.DestinationTableName = „TableName”; try { //writing to server bulkCopy.WriteToServer( dt ); //here dt – DataSet table } catch ( Exception ex ) { // do sth eg.: MessageBox.Show( ex.Message ); } }
Brak komentarzy:
Prześlij komentarz