2012-02-11 6 views
0

私は、抽象親クラス(Product)とそれを継承する2つの子クラス(Book、Software)を持っています。共通データ(親クラス属性)をProductsテーブルに挿入し、子クラスの特定の属性をBookProductsテーブルとSoftwareProductsテーブルに挿入する必要があります。子オブジェクトの属性をデータベースに挿入する正しい方法は?

これは私が思い付いた実装です。誰かがより良いアプローチを提供できるかどうか疑問に思っていました。

public static class Database 
{ 


    public static void SaveBook(Book book) 
    { 
     //save the product to products table and return the ID of the new row 
     int ProductID = saveProduct(book); 

     SqlConnection connection = DatabaseConnection.GetConnection(); 


      string insertBookStatement = 
      "INSERT BookProducts" + 
      "(ProductID,Author)" + 
      "VALUES (@ProductID,@Author)"; 

     SqlCommand insertBookCommand = new SqlCommand(insertBookStatement, connection); 

     insertBookCommand.Parameters.AddWithValue("@ProductID",ProductID); 
     insertBookCommand.Parameters.AddWithValue("@Author",book.Author); 


     try 
     { 
      connection.Open(); 
      insertBookCommand.ExecuteNonQuery(); 

     } 
     catch (SqlException ex) 
     { 
      throw ex; 
     } 
     finally 
     { 
      connection.Close(); 
     } 



    } 

    public static void SaveSoftware(Software software) 

    { 
     int ProductID = saveProduct(software); 

     SqlConnection connection = DatabaseConnection.GetConnection(); 


     string insertSoftwareStatement = 
     "INSERT SoftwareProducts" + 
     "(ProductID,VersionNumber)" + 
     "VALUES (@ProductID,@VersionNumber)"; 

     SqlCommand insertSoftwareCommand = new SqlCommand(insertSoftwareStatement, connection); 

     insertSoftwareCommand.Parameters.AddWithValue("@ProductID", ProductID); 
     insertSoftwareCommand.Parameters.AddWithValue("@VersionNumber", software.VersionNumber); 


     try 
     { 
      connection.Open(); 
      insertSoftwareCommand.ExecuteNonQuery(); 

     } 
     catch (SqlException ex) 
     { 
      throw ex; 
     } 
     finally 
     { 
      connection.Close(); 
     } 
    } 


    private static int saveProduct(Product p) 
    { 
     int ProductID; 
     SqlConnection connection = DatabaseConnection.GetConnection(); 

     string insertProductStatement = 
      "INSERT Products" + 
      "(Code,Description,Category,Price)" + 
      "VALUES (@code,@Description,@Category,@Price)"; 

     SqlCommand insertProductCommand = new SqlCommand(insertProductStatement, connection); 
     insertProductCommand.Parameters.AddWithValue("@Code", p.Code); 
     insertProductCommand.Parameters.AddWithValue("@Description", p.ShortDescription); 
     insertProductCommand.Parameters.AddWithValue("@Category", p.Category); 
     insertProductCommand.Parameters.AddWithValue("@Price", p.Price); 

     try 
     { 
      connection.Open(); 
      insertProductCommand.ExecuteNonQuery(); 
      string selectStatement = "SELECT IDENT_CURRENT('Products') FROM Products"; 
      SqlCommand selectCommand = new SqlCommand(selectStatement, connection); 
      ProductID = Convert.ToInt16(selectCommand.ExecuteScalar()); 



     } 
     catch (SqlException ex) 
     { 
      throw ex; 
     } 
     finally 
     { 
      connection.Close(); 
     } 


     return ProductID; 
    } 


} 
+0

XML形式をストアドプロシージャに渡すことができます。 SPでは、XMLデータをテーブル構造として読み取ることができます。 http://msdn.microsoft.com/en-us/library/ms345117%28v=sql.90%29.aspx –

+0

より良いアプローチは、Entity Frameworkを使用することです。 –

+0

EFは彼の問題でOPを助けません。このソリューションはすべてデータモデリングとソフトウェア設計に関するもので、特定のORMテクノロジを選択しても実際には役に立ちません。 – Tobias

答えて

1

データアクセスオブジェクトのパターンが役立ちます。

まず、1つのBaseProductテーブル、1つのソフトウェアテーブル、1つのブックテーブルが必要です。 SoftwareProduct DAOはBase.Store()を呼び出します(これはかなりの疑似コードですが、アイデアが出てきます)BaseProductにすべてのベースクラスのフィールドを格納し、BaseProductIdを使って正しいテーブルに格納します外部キーとして。

通常、データベースの正規化は良好です。この特定のケースは、ドメイン層のOCP/SRPとデータベースの正規化されたテーブルとの接続を示すため、テキストブックの例として使用される可能性があります。

関連する問題