piątek, 11 lutego 2011

Klucze obce, a relacje w DataSet'cie [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 wkradł się tam pewien „brak”. Mianowicie część relacji pomiędzy tabelami zostało pominiętych – w wytworzonych tabelach nie zostały wykorzystane klucze obce.
Otóż dla każdej tabeli (DataTable) w DataSet'cie dostępne są relacje typu dzieci (właściwość ChildRelations) i rodzice (właściwość ParentRelations). Relacje takie odpowiadają sobie, przez co w tabeli nadrzędnej jedna z relacji typu dzieci odpowiada pewnej relacji typu rodzic z tabeli podrzędnej. Dlatego dla każdej tabeli relacje typu rodzic (właściwość ParentRelations) powinny zostać zamapowane w bazie danych Ms SQL, na klucze obce prowadzące do tabeli nadrzędnej.
SMO wspiera operacje na kluczach obcych, wystarczy wykorzystać klasę ForeignKey. Obiekt klucza obcego tworzymy przekazując do konstruktora tabelę (w sensie SMO), dla której ma być utworzony, oraz jego nazwę (np. na bazie nazwy relacji z DataSet'a). Do tak utworzonego obiektu klucza obcego dodajemy kolumny (obiekty klasy: ForeignKeyColumn) bazujące na odpowiednich parach identyfikatorów z tabeli podrzędnej i nadrzędnej.
Kod niżej przedstawionej funkcji realizuje właśnie wspomniany algorytm. Do funkcji zostaje przekazany źródłowy DataSet, nazwa tabeli w tym źródłowym DataSet'cie oraz tabela w bazie danych (w sensie SMO).
/// <summary>
/// Creates the foreign keys base on data table relations.
/// </summary>
/// <param name="SourceDataSet">The source DataSet that cotains: 
///   tables, relations and data.</param>
/// <param name="TableName">Name of the table in DataSet.</param>
/// <param name="TableInSqlServer">The table object (SMO) in SQL server.</param>
private static void CreateForeignKeysBaseOnDataTableRelations
  ( DataSet SourceDataSet, string TableName, Table TableInSqlServer )
{
  DataTable DataSetTable = SourceDataSet.Tables[ TableName ];
  foreach ( DataRelation datarel in DataSetTable.ParentRelations )
  {
    ForeignKey FK = new ForeignKey( TableInSqlServer, datarel.RelationName );
    for ( int i = 0; i < datarel.ChildColumns.Length; i++ )
    {
      ForeignKeyColumn fkc = new ForeignKeyColumn( FK, datarel.ChildColumns[ i ].ColumnName, datarel.ParentColumns[ i ].ColumnName );
      FK.Columns.Add( fkc );
    }
    FK.ReferencedTable = datarel.ParentTable.TableName;
    FK.Create();
  }
}
Promuj

Brak komentarzy:

Prześlij komentarz

Posty powiązane / Related posts