如何使用数据填充 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]);
}
您可以在派生类的构造函数中替换以下行
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
}
}