Zmienianie klasy podstawowej tableadapter w wpisanym zestawie danych

Data utworzenia strony :

Kod do tworzenia i generowania wpisanego zestawu danych

Wpisany zestaw danych umożliwia utworzenie datatable, który ma informacje o typie dla każdej kolumny na podstawie języka SQL lub TableAdapter, który upraszcza interakcję danych z bazy danych na podstawie wpisanej datatable.

Ponieważ celem nie jest utworzenie wpisanego zestawu danych w tym miejscu, szybko utwórzmy zestaw danych z bazą danych i tabelą gotową na teraz. Możesz również zrobić wszystko, co chcesz, aby ułożyć tabelę.

Pierwszym krokiem jest dodanie zestawu danych jako nowego elementu do projektu. Nazwa jest niczym innym, jak tylko pozostaje tutaj.

Otwórz zestaw danych i dodaj z projektanta program TableAdapter.

Postępuj zgodnie z kreatorem, aby utworzyć DataTable i TableAdapter.

Myślę, że poniższy formularz może być przykładem pobierania i używania rekordów z bazy danych przy użyciu datatable i TableAdapter, który został utworzony. (To tylko przykład).)

public Form1()
{
  InitializeComponent();

  using (var adapter = new 金額集計TestTableAdapter())
  {
    var table = adapter.GetData();

    foreach (var row in table)
    {
      Trace.WriteLine(string.Format("{0}:{1}", row.年月, row.金額));
    }
  }
}

Zazwyczaj projekt, który używa tego zestawu danych ma mniej niż jedną tabelę i tworzysz wiele zestawów danych, które łączą liczbę tabel lub wielu tabel. Myślę, że jest to powszechne przetwarzanie wymyślić, kiedy to się dzieje. Na przykład można dynamicznie zmienić SQL używane wewnętrznie, aby zmienić warunki pobierania rekordów.

Jednak TableAdapter klasy utworzonej na podstawie Zestawu danych jest faktycznie automatycznie generowany przez kod. Ponadto, ponieważ ta klasa TableAdapter dziedziczy Component klasy, nie ma żadnych metod lub właściwości, które mogą być używane w rzeczywistych wspólnych. Nie można przekazać klasy podstawowej do metody, aby wywołać operację związaną z tableadapter.

Ponadto sql używane wewnętrznie, sqldataadapter używany do uzyskiwania dostępu do bazy danych, itp są zadeklarowane w chronionych, więc nie można dotykać ich z zewnątrz.

Jednak podczas deklarowania dla metod i właściwości zadeklarowanych w chronionych, można je dotknąć, tworząc klasę, która dziedziczy TableAdapter klasy i ta klasa TableAdapter ma częściowy modyfikator, dzięki czemu można zadeklarować inną metodę lub właściwość, aby rozszerzyć proces. Można również utworzyć nową właściwość, aby uzyskać właściwość wewnętrzną, jak w poniższym kodzie:

using System.Data.SqlClient;
namespace DataSetBaseAdapter {
    public partial class DataSet1 {
    }
}

namespace DataSetBaseAdapter.DataSet1TableAdapters
{
  public partial class 金額集計TestTableAdapter
  {
    public SqlDataAdapter InnerAdapter
    {
      get { return Adapter; }
    }
  }
}

Można rzeczywiście użyć tego TableAdapter, aby zobaczyć, że masz dostęp do właściwości rozszerzone.

Jednak dostęp do właściwości wewnętrznych nie oznacza, że proces jest wspólny i nadal trzeba napisać kod dla każdego dataset, który tworzysz.

Zmienianie klasy podstawowej tableadapter

Jak wspomniano wcześniej, TableAdapter klasa dziedziczy Component klasy, co utrudnia udostępnianie przetwarzania. Jeśli zmienisz część kodu, która dziedziczy klasę, kod jest generowany automatycznie, więc aktualizowanie DataSet ponownie zwraca kod. Jeśli to możliwe, można napisać klasę częściową, która dziedziczy interfejs w oddzielnym pliku, ale nie ma większego sensu, ponieważ trzeba napisać tyle TableAdapters, jak zostały utworzone.

W rzeczywistości istnieje mechanizm, aby zmienić dziedziczącą klasę tego TableAdapter. Chciałbym wyjaśnić procedurę.

Najpierw utwórz klasę, którą chcesz dziedziczyć. TableAdapter pierwotnie odziedziczył Component klasy, więc należy dziedziczyć Component klasy, nawet jeśli go utworzyć. Napiszę kod, który chcę się tutaj podzielić, ale po prostu napiszę klasę. Dopasuj obszar nazw do utworzonego obszaru nazw.

using System.ComponentModel;

namespace DataSetBaseAdapter
{
  public class BaseAdapter : Component
  {
  }
}

Następnie otwórz projektanta Zestawu danych i wybierz utworzony program TableAdapter.

Kliknij prawym przyciskiem myszy, aby otworzyć właściwość. Istnieje właściwość o nazwie BaseClass, która początkowo powinna być "System.ComponentModel.Component". Przepisz to do klasy, którą właśnie utworzyłeś. Napiszę wszystko, łącznie z przestrzenią nazw.

Jeśli go zapiszesz, zobaczysz, że klasa podstawowa tableAdapter została zmieniona. Ustawiając to dla każdego TableAdapter, można napisać wspólne przetwarzanie do klasy podstawowej.

Na przykład, jeśli chcesz uzyskać dostęp do wewnętrznego sql lub SQLDataAdapter, napisz: Karty i CommandCollections, które są tworzone automatycznie są tylko właściwości utworzone przez klasę dziedzica, więc nie można dotykać bezpośrednio z dziedzica. Poniższy kod używa odbicia, aby wymusić dostęp.

using System.ComponentModel;
using System.Data.SqlClient;
using System.Reflection;

namespace DataSetBaseAdapter
{
  public class BaseAdapter : Component
  {
    public SqlDataAdapter InnerAdapter
    {
      get
      {
        return (SqlDataAdapter)GetType().GetProperty("Adapter",
          BindingFlags.NonPublic | BindingFlags.Instance).GetValue(this, null);
      }
    }

    public SqlCommand[] InnerCommandCollection
    {
      get
      {
        return (SqlCommand[])GetType().GetProperty("CommandCollection",
          BindingFlags.NonPublic | BindingFlags.Instance).GetValue(this, null);
      }
    }
  }
}

Widać, że rzeczywiście można użyć TableAdapter, aby uzyskać dostęp do właściwości klasy dziedziczonej.