如何使用数据填充 System.Data.DataTable 的子类

本文关键字:DataTable 子类 Data System 何使用 数据 填充 | 更新日期: 2023-09-27 18:31:04

我有一个派生自DataTable的类。在它的ctor中,我希望它拥有我从调用函数中获取的DataTable对象中的所有数据。

这听起来像是一件非常微不足道的事情,但我很惊讶我无法弄清楚。抱歉,我已经连续编码超过 12 个小时了,所以我认为我已经淘汰了。

帮助将不胜感激。

using System.Data;
using Foo.Data;
namespace Foo.BusinessObjects
{
    public class StringTable : DataTable
    {
        public StringTable() : base()
        {
            var sql = "SELECT * FROM FooBar";

            // I know that that's not a legal C# statement but 
            // if it were, I'd want to do the equivalent of the following:
            this = Database.DefaultDatabase.GetDataTable(sql);

        }
    }
}

其中,GetDataTable 方法返回System.Data.DataTable对象。它的签名在这里:

public DataTable GetDataTable(string sql, params SqlParameter[] parameters)
{
   DataSet dataset;
   return ((dataset = GetDataSetInternal(sql, false, parameters)) == null ? 
            null : dataset.Tables[0]);
}

如何使用数据填充 System.Data.DataTable 的子类

您可以在派生类的构造函数中替换以下行

this = Database.DefaultDatabase.GetDataTable(sql);

DataTable dtResult = Database.DefaultDatabase.GetDataTable(sql);
this.Merge(dtResult);

你不能在构造函数中做这种事情。你可以更喜欢组合而不是继承,并且仍然有你的StringTable类。

public class StringTable
{
    private DataTable dataTable;
    public StringTable()
    {
        var sql = "SELECT * FROM FooBar";

        // I know that that's not a legal C# statement but 
        // if it were, I'd want to do the equivalent of the following:
        dataTable = Database.DefaultDatabase.GetDataTable(sql);
    }
}

另一种选择是查看使用 DataTable 的工厂模式,而不是对其进行子类化。类似的东西。继承实际上只是为了给你带来好处,如果它可以以多态的方式表现。否则我不确定你有什么收获,

public class DataTableFactory
{
    public DataTable CreateStringTable()
    {
        var sql = "SELECT * FROM FooBar";
        DataTable dataTable = new DataTable();
        return Database.DefaultDatabase.GetDataTable(sql);
    }
    public DataTable CreateSomeOtherTable()
    {
       //etc etc
    }
}