将子对象的属性插入数据库的正确方法是什么?

时间:2012-02-11 15:06:31

标签: c# sql-server ado.net

我有一个抽象的父类(Product)和两个继承它的子类(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;
    }


}

1 个答案:

答案 0 :(得分:1)

数据访问对象模式将为您提供帮助。

首先,您需要一个BaseProduct表,一个Software表和一个Book表。 SoftwareProduct DAO将调用base.Store()(这是非常伪的,但它会得到这个想法)将所有基类'字段存储在BaseProduct中,然后将自己存储到具有BaseProductId的正确表中作为外键。

数据库规范化通常很好,这个特殊情况可能会被用作原因的教科书示例,因为它显示了域层中OCP / SRP与数据库中规范化表之间的连接:)