在.NET中通过数据库初始化派生类

时间:2012-09-03 00:01:35

标签: asp.net .net sql

假设我有一个具有一个属性的Object Car:Model

我会使用数据库填充对象,如下所示:

Public Class Car

    Public Property Model() As String
        Get
            Return _Model
        End Get
        Set(ByVal value As String)
            _Model = value
        End Set
    End Property
    Private _Model As String

    Private Sub SetObjectData(ByVal theObjReader As System.Data.SqlClient.SqlDataReader)
        Try
            Me._Model = theObjReader("Model").ToString()
        Catch ex As Exception
            Throw New Exception("Unable to Initialize Car.")
        End Try
    End Sub

    Public Sub New(ByVal Car_ID As Integer)
        Dim connection As New SqlConnection(DBTool.DataConnectionString)
        Try
            Dim cmd As SqlCommand
            cmd = New SqlCommand("getCarByCar_ID", connection)
            cmd.CommandType = CommandType.StoredProcedure

            cmd.Parameters.AddWithValue("@Car_ID ", Car_ID)

            connection.Open()
            Dim objReader As SqlDataReader = cmd.ExecuteReader()

            Do While objReader.Read()
                SetObjectData(objReader)
            Loop

            objReader.Close()
            connection.Close()
        Catch ex As Exception
            connection.Close()
        End Try
    End Sub

End Class

现在,我们假设为了这个类被包装在DLL中的参数。

我希望做的是继承它,同时扩展我的属性。例如,假设我们想要一个新的对象“Expensive_Car”,其新属性为“Price”。

如何在不编写代码两次的情况下,以最“有条理”的方式利用之前的Car对象并初始化此派生类? “价格”字段保存在与“模型”字段相同的SQL表中。当然,我们需要从数据库中获取“价格”,就像我们拉出模型一样。

我的目标是利用现有的类并使用新的派生类来扩展它们,而根本不更改父类。 SQL数据库结构可以根据需要使用其他字段进行更改。

谢谢!

尼克

1 个答案:

答案 0 :(得分:0)

你可能想要考虑其中一个ORM,如Entity Framework或NHibernate。

如果你真的想要一个自己动手的方法,那么最简单的方法就是在基类中添加两个protected overridable方法,一个用正确的存储过程名创建SqlCommand对象,另一个用另一个加载特定于派生类的属性。

您可能还应该在Using语句中创建连接,命令和数据读取器对象,以确保所有内容都得到正确清理。

这是一个c#示例,因为我的VB.Net真的很生锈:

public class Car
{
  public Car(int carId) {
    CarId = carId;
    LoadProperties();
  }

  public int CarId { get; set; }
  public string Model { get; set; }

  protected virtual SqlCommand CreateCommand() {
    // Override this method in derived classes to call a different procedure.
    return new SqlCommand("getCarByCar_ID");
  }

  protected virtual void LoadMoreProperties(SqlDataReader reader)
  {
    // Override this method in derived classes to load additional properties.
  }

  private void LoadProperties() {
    using( var connection = new SqlConnection(DBTool.ConnectionString) ) {

      using( cmd = CreateCommand() ) {
        using( var reader = cmd.ExecuteReader() ) {
          // Read Car specific properties

          Model = // get model from reader.


          LoadMoreProperties(reader);
        }
      }
    }
  }
}

public class ExpensiveCar : Car {

  public decimal Price { get; set; }

  protected override SqlCommand CreateCommand() {
    return new SqlCommand("getExpensiveCarByCar_ID");
  }

  protected override void LoadMoreProperties(SqlDataReader reader) {
    Price = // get price from reader.
  }
}

它不会编译,但应该给你的想法。您只想制作可以更改的部分 - 调用不同的存储过程并加载特定于派生类的属性。