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(); } }
Brak komentarzy:
Prześlij komentarz