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

时间:2013-09-12 20:07:36

标签: c# .net ado.net

我有一个派生自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]);
}

2 个答案:

答案 0 :(得分:2)

您可以在派生类

的构造函数中替换以下行
this = Database.DefaultDatabase.GetDataTable(sql);

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

答案 1 :(得分:1)

你不能在构造函数中做这种事情。你可能喜欢组合而不是继承,但仍然有你的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
    }
}