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