Создать интерфейс для настраиваемого адаптера и таблицы данных - PullRequest
0 голосов
/ 30 апреля 2020

Я учусь использовать интерфейсы, и возникает проблема при использовании сгенерированного набора данных. Я создал две подобные таблицы в базе данных, а затем создал два адаптера данных в наборе данных на основе этих таблиц. Затем я создал классы, которые описывают адаптер, датируемые и необходимые методы.

Мой 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; }
}

И я перепробовал много других вариантов. Но безрезультатно. Кто-нибудь знает их общий класс?

1 Ответ

1 голос
/ 05 мая 2020

Если вы откроете Object Browser в visual studio (Ctrl + Alt + J в 2017 году, раньше это были Ctrl-W, J как аккорд), вы можете увидеть больше информации о таблицах-адаптерах в вашем проекте:

enter image description here

Все адаптеры таблиц наследуются от компонента. Они "ИМЕЮТ-А" DataAdapter, они не "И-А" DataAdapter. Например, они выглядят так:

public class XTableAdapter: Component{

  private DataAdapter _da;

}

Они не выглядят так:

public class XTableAdapter: DataAdapter

Все это говорит, я не уверен, почему вы хотите лечить их таким образом или инкапсулируйте их вместе с таблицей данных. Данные хранятся в таблицах данных, в таблицах-адаптерах pu sh между db и datatable. Я не думаю, что когда-либо видел, чтобы кто-то делал, например, класс, который оборачивает StreamWriter (вещь, которая записывает файл) и String (содержимое файла):

class CombinedFileContentAndWriter{

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

  string content = "Hello World";

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

Это не сказать, что ты не можешь, это просто странно. Предполагается, что адаптеры таблиц - это объекты жизни от короткой до средней, которые призваны перемещать данные; им не нужно объединяться в пару от этих данных. Один табличный адаптер может перезаписывать сотни различных экземпляров данных. Адаптеры таблиц могут создаваться и выбрасываться по требованию, и им не нужно оставаться в паре с данными, которые они загрузили, чтобы функционировать. Вы можете:

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

Нет особого смысла пытаться найти универсальный c способ обращения к табличным адаптерам, потому что все они настроены именно на указанный тип данных c и имеют имена методов, которые являются переменными и, следовательно, не перегружаются:

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

Это примерно столько, сколько вам нужно go с табличными адаптерами и типизированными таблицами / наборами данных.

Вопрос, с которым связана Карен, - это, конечно, умный ресурс, но стоит отметить, что главный ответ решил создать общий c способ адресации табличных адаптеров, чтобы они могли легко зарегистрировать каждый адаптер в транзакции, тогда как Microsoft намеревалась зарегистрировать операции табличного адаптера в транзакции, они должны выполняться внутри TransactionScope

...