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 );
}
}










Maciej_Zbrzezny on delicious.com
Brak komentarzy:
Prześlij komentarz