为自定义适配器和数据表创建接口

问题描述 投票:0回答:1

我正在学习使用接口,使用生成的数据集时出现问题。我在数据库中创建了两个相似的表,然后基于这些表在数据集中创建了两个数据适配器。然后,我创建了描述适配器,数据和必要方法的类。

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; }
}

而且我尝试了许多其他选择。但是没有结果。有人知道他们的普通班吗?

c# wpf interface dataset dataadapter
1个回答
0
投票

[如果您在Visual Studio中打开对象浏览器(2017年为Ctrl + Alt + J,以前是Ctrl-W,J作为和弦),您可以在项目中查看有关表适配器的更多信息:

enter image description here

所有TableAdapter从Component继承。它们是“ HAVE-A”数据适配器,不是“ IS-A”数据适配器。例如,它们看起来像这样:

public class XTableAdapter: Component{

  private DataAdapter _da;

}

它们看起来不是这样:

public class XTableAdapter: DataAdapter

所有这些,我不确定为什么要这样处理它们或将它们与数据表一起封装。数据存储在数据表中,表适配器将其推入db和datatable之间。我认为我从未见过有人这样做,例如,一个包装了StreamWriter(写文件的东西)和String(文件的内容)的类:

class CombinedFileContentAndWriter{

  StreamWriter sw = newStreamWriter(@"C:\temp\x.txt");

  string content = "Hello World";

  void DoIt(){
    sw.Write(content);
  }
}

并不是说你做不到,这很奇怪。 TableAdapter应该是中短寿命的东西,需要用来移动数据。他们不需要与这些数据密不可分地配对。一个表适配器可以读写一个数据表的数百个不同实例。可以创建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

试图找到引用表适配器的通用方法没有什么意义,因为它们都是完全针对特定的数据表定制的,并且具有可变的方法名称,因此不可重载:

SchoolDataset ds = new SchoolDataSet();
new StudentTableAdapter.FillByStudentId(ds, 123);
new StaffTableAdapter.FillByStaffLastName(ds, "Smith");
new ClassroomTableAdapter.FillByYearDesignation(ds, "First grade");

这与使用表适配器和键入的数据表/集所需的深度差不多。

当然,Karen链接到的问题是一个聪明的资源,但是值得注意的是,主要答案选择创建一种通用的方式来解决表适配器,以便他们可以轻松地在事务中注册每个适配器,而Microsoft打算注册表适配器。事务中的操作,应在TransactionScope

中执行
© www.soinside.com 2019 - 2024. All rights reserved.