We wpisie pt.: "Jak DataSet’a przenieść do MsSQL'a? (SQLServer Management Objects i SqlBulkCopy)" przedstawiłem, jak można na podstawie DataSet'a stworzyć odpowiadającą mu bazę danych. Niestety nie wszystko zostało tam opisane i wykonane prawidłowo, o czym pisałem już we wpisie „Klucze obce, a relacje w DataSet'cie”. Kolejnym elementem, który wymaga dodania są ograniczenia (Constrains), a w szczególności ten wymuszający unikalność UniqueConstraint.
Otóż tabela w DataSet'cie przechowuje informacje o ograniczeniach we właściwości Constraints. Jest to kolekcja mogąca przechowywać różne ograniczenia, jednak zwykle (lub nawet zawsze) są to ograniczenia typu UniqueConstraint (do innych rodzajów ograniczeń zaliczyć można ForeignKeyConstrain, ale one są przechowywane w ramach innej właściwości tabeli). A jak to może być zmapowane na tabelę w SQLSerwerze? Otóż na
indeksy (Index)
typu (IndexKeyType)
DriUniqueKey. A poszczególne kolumny wchodzące w skład
ograniczenia mapujemy na IndexedColumn. Tak stworzony indeks tworzymy
w bazie wywołując funkcję „Create”. Uwaga: należy jednak
zwrócić uwagę, by wybierając ograniczenia do mapowania nie wybrać
takiego, który jest kluczem tabeli (gdyż taki powinien być
zmapowany na indeks typu DriPrimaryKey)
Ostatecznie kod
realizujący zamianę ograniczeń z Tabeli: TableName DataSet'u:
SourceDataSet na odpowiednie indeksy w tabeli TableInSqlServer, może
wyglądać następująco:
/// <summary> /// Creates the constraints base on data table constraints. /// </summary> /// <param name="SourceDataSet">The source data set.</param> /// <param name="TableName">Name of the table.</param> /// <param name="TableInSqlServer">The table in SQL server.</param> private static void CreateConstraintsBaseOnDataTableConstraints ( DataSet SourceDataSet, string TableName, Table TableInSqlServer ) { DataTable DataSetTable = SourceDataSet.Tables[ TableName ]; foreach ( Constraint con in DataSetTable.Constraints ) { if ( con is UniqueConstraint) { UniqueConstraint ucon = (UniqueConstraint)con; if ( !ucon.IsPrimaryKey ) //there is no need to duplicate the indes { Index newIndex = new Index( TableInSqlServer, String.Format( "IX_{0}_{1}", TableName, con.ConstraintName ) ); newIndex.IndexKeyType = IndexKeyType.DriUniqueKey; foreach ( DataColumn dc in ucon.Columns ) { newIndex.IndexedColumns.Add( new IndexedColumn( newIndex, dc.ColumnName, false ) ); } newIndex.Create(); } } } }
Brak komentarzy:
Prześlij komentarz