poniedziałek, 3 stycznia 2011

SqlBulkCopy i wyłączenie auto-inkrementacji w tabeli [PL]

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

Brak komentarzy:

Prześlij komentarz

Posty powiązane / Related posts