wtorek, 15 lutego 2011

SMO, DataSet i UniqueConstraint [PL]

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

Promuj

Brak komentarzy:

Prześlij komentarz

Posty powiązane / Related posts