为自定义 Adapter 和 DataTable 创建接口
Create interface for custom Adapter and DataTable
我正在学习使用接口,在使用生成的数据集时出现问题。
我在数据库中创建了两个相似的表,然后基于这些表在数据集中创建了两个数据适配器。然后我创建了 classes 来描述适配器、数据和必要的方法。
My DataSet
class DB
{
public class Table1 {
public DataSetTableAdapters.Table1TableAdapter adapter;
public DataSet.Table1DataTable dataTable;
public void Init()
{
adapter = new DataSetTableAdapters.Table1TableAdapter();
dataTable = new DataSet.Table1DataTable();
}
}
public class Table2
{
public DataSetTableAdapters.Table2TableAdapter adapter;
public DataSet.Table2DataTable dataTable;
public void Init()
{
adapter = new DataSetTableAdapters.Table2TableAdapter();
dataTable = new DataSet.Table2DataTable();
}
}
}
我试着实现,例如,像这样
interface ISecondaryTable
{
DataTable dataTable { get; set; }
IDataAdapter adapter { get; set; }
}
而且我尝试了很多其他的选择。但没有结果。
有谁知道他们的共同点class?
如果你在visual studio中打开对象浏览器(2017年是Ctrl+Alt+J,以前是Ctrl-W,J作为和弦)你可以看到更多关于table的信息您项目中的适配器:
所有 TableAdapter 都继承自 Component。它们 "HAVE-A" DataAdapter,它们不是 "IS-A" DataAdapter。例如,它们看起来像这样:
public class XTableAdapter: Component{
private DataAdapter _da;
}
他们看起来不是这样的:
public class XTableAdapter: DataAdapter
综上所述,我不确定您为什么要这样对待它们或将它们与数据一起封装 table。数据存储在 datatable 中,table 适配器将其推送到 db 和 datatable 之间。我认为我从未见过有人这样做过,例如,一个 class 包装了一个 StreamWriter(写入文件的东西)和一个 String(文件的内容):
class CombinedFileContentAndWriter{
StreamWriter sw = newStreamWriter(@"C:\temp\x.txt");
string content = "Hello World";
void DoIt(){
sw.Write(content);
}
}
不是说不行,就是奇怪。 TableAdapters 应该是中短期的东西,被要求移动数据;他们不需要与该数据密不可分地配对。一个 table 适配器可以读写数百个不同的数据实例 table。 TableAdapter 可以按需创建和丢弃,它们不需要与下载的数据保持配对即可运行。您可以:
var dt = new XTableAdapter().GetDataByName();
//manipulate dt in a 30 minute operation
new XTableAdapter().Update(dt); //a different tableadapter sends the data back to the DB
尝试找到引用 table 适配器的通用方法没有多大意义,因为它们都是针对特定数据table 完全定制的,并且具有可变的方法名称,因此不可重载:
SchoolDataset ds = new SchoolDataSet();
new StudentTableAdapter.FillByStudentId(ds, 123);
new StaffTableAdapter.FillByStaffLastName(ds, "Smith");
new ClassroomTableAdapter.FillByYearDesignation(ds, "First grade");
这与您使用 table 适配器并键入 datatables/sets 所需的深度差不多。
Karen 链接到的问题当然是一个聪明的资源,但值得注意的是,主要答案选择创建一种通用方法来解决 table 适配器,以便他们可以轻松地将每个适配器注册到事务中,而 Microsoft 打算在事务中注册 table 适配器操作,它们应该在 TransactionScope
中执行
我正在学习使用接口,在使用生成的数据集时出现问题。 我在数据库中创建了两个相似的表,然后基于这些表在数据集中创建了两个数据适配器。然后我创建了 classes 来描述适配器、数据和必要的方法。
My DataSet
class DB
{
public class Table1 {
public DataSetTableAdapters.Table1TableAdapter adapter;
public DataSet.Table1DataTable dataTable;
public void Init()
{
adapter = new DataSetTableAdapters.Table1TableAdapter();
dataTable = new DataSet.Table1DataTable();
}
}
public class Table2
{
public DataSetTableAdapters.Table2TableAdapter adapter;
public DataSet.Table2DataTable dataTable;
public void Init()
{
adapter = new DataSetTableAdapters.Table2TableAdapter();
dataTable = new DataSet.Table2DataTable();
}
}
}
我试着实现,例如,像这样
interface ISecondaryTable
{
DataTable dataTable { get; set; }
IDataAdapter adapter { get; set; }
}
而且我尝试了很多其他的选择。但没有结果。 有谁知道他们的共同点class?
如果你在visual studio中打开对象浏览器(2017年是Ctrl+Alt+J,以前是Ctrl-W,J作为和弦)你可以看到更多关于table的信息您项目中的适配器:
所有 TableAdapter 都继承自 Component。它们 "HAVE-A" DataAdapter,它们不是 "IS-A" DataAdapter。例如,它们看起来像这样:
public class XTableAdapter: Component{
private DataAdapter _da;
}
他们看起来不是这样的:
public class XTableAdapter: DataAdapter
综上所述,我不确定您为什么要这样对待它们或将它们与数据一起封装 table。数据存储在 datatable 中,table 适配器将其推送到 db 和 datatable 之间。我认为我从未见过有人这样做过,例如,一个 class 包装了一个 StreamWriter(写入文件的东西)和一个 String(文件的内容):
class CombinedFileContentAndWriter{
StreamWriter sw = newStreamWriter(@"C:\temp\x.txt");
string content = "Hello World";
void DoIt(){
sw.Write(content);
}
}
不是说不行,就是奇怪。 TableAdapters 应该是中短期的东西,被要求移动数据;他们不需要与该数据密不可分地配对。一个 table 适配器可以读写数百个不同的数据实例 table。 TableAdapter 可以按需创建和丢弃,它们不需要与下载的数据保持配对即可运行。您可以:
var dt = new XTableAdapter().GetDataByName();
//manipulate dt in a 30 minute operation
new XTableAdapter().Update(dt); //a different tableadapter sends the data back to the DB
尝试找到引用 table 适配器的通用方法没有多大意义,因为它们都是针对特定数据table 完全定制的,并且具有可变的方法名称,因此不可重载:
SchoolDataset ds = new SchoolDataSet();
new StudentTableAdapter.FillByStudentId(ds, 123);
new StaffTableAdapter.FillByStaffLastName(ds, "Smith");
new ClassroomTableAdapter.FillByYearDesignation(ds, "First grade");
这与您使用 table 适配器并键入 datatables/sets 所需的深度差不多。
Karen 链接到的问题当然是一个聪明的资源,但值得注意的是,主要答案选择创建一种通用方法来解决 table 适配器,以便他们可以轻松地将每个适配器注册到事务中,而 Microsoft 打算在事务中注册 table 适配器操作,它们应该在 TransactionScope
中执行