Změna základní třídy tableadapter u zadané datové sady

Datum vytvoření stránky :

Kód pro vytvoření a generování zadané datové sady

Zadaný dataset umožňuje vytvořit DataTable, která obsahuje informace o typu pro každý sloupec založený na SQL, nebo TableAdapter, který zjednodušuje interakci dat s DB na základě zadané DataTable.

Vzhledem k tomu, že účelem není vytvořit zadaný DataSet zde, pojďme rychle vytvořit DataSet s databází a tabulka připravena pro tuto chvíli. Můžete také dělat, co chcete vyložit stůl.

Prvním krokem je přidání DataSet jako nové položky do projektu. Jméno je cokoliv, ale je to tady.

Otevřete DataSet a přidejte TableAdapter z návrháře.

Podle průvodce vytvořte datatable a tableadapter.

Myslím, že následující formulář může být příkladem načítání a používání záznamů z databáze pomocí DataTable a TableAdapter, které jste vytvořili. (Toto je jen příklad.)

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.金額));
    }
  }
}

Projekt, který používá tuto datovou sadu, má obvykle méně než jednu tabulku a vytvoříte mnoho datových sad, které kombinují počet tabulek nebo více tabulek. Myslím, že je běžné zpracování přijít, když se to stane. Můžete například chtít dynamicky změnit SQL používá interně změnit podmínky pro načítání záznamů.

Třída TableAdapter vytvořená z datové sady je však ve skutečnosti automaticky generována kódem. Také protože tato třída TableAdapter dědí třídu Component, neexistují žádné metody nebo vlastnosti, které lze použít v reálném společné. Základní třídu nelze předat metodě pro volání operace související s tabulkovým adaptérem.

Kromě toho sql používá interně, sqldataadapter slouží k přístupu k databázi, atd.

Však jak deklarujete pro metody a vlastnosti deklarované v chráněné, můžete se jich dotknout vytvořením třídy, která dědí TableAdapter třídy a tato tableadapter třída má částečný modifikátor, takže můžete deklarovat jinou metodu nebo vlastnost rozšířit proces. Můžete také vytvořit novou vlastnost získat vnitřní vlastnost, jako v následujícím kódu:

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

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

Tento adaptér tableadapter můžete skutečně použít k zobrazení, že máte přístup k rozšířeným vlastnostem.

Přístup k internívlastnosti však neznamená, že proces je běžné a stále musíte napsat kód pro každou dataset, kterou vytvoříte.

Změna základní třídy tableadapter

Jak již bylo zmíněno dříve TableAdapter třídy dědí Component třídy, takže je obtížné sdílet zpracování. Pokud změníte část kódu, která dědí třídu, kód je automaticky generován, takže aktualizace DataSet znovu vrátí kód. Pokud je to možné, můžete napsat částečnou třídu, která dědí rozhraní v samostatném souboru, ale nedává to moc smysl, protože musíte napsat tolik TableAdapters, kolik jste vytvořili.

Ve skutečnosti existuje mechanismus pro změnu dědící třídy tohoto TableAdapter. Rád bych vysvětlil postup.

Nejprve vytvořte třídu, kterou chcete dědit. TableAdapter původně zdědil třídu Component, takže byste měli třídu Component dědit i v případě, že ji vytvoříte. Napíšu kód, o který se chci podělit, ale prostě napíšu hodinu. Přiřazovat obor názvů k tomu, co jste vytvořili.

using System.ComponentModel;

namespace DataSetBaseAdapter
{
  public class BaseAdapter : Component
  {
  }
}

Potom otevřete návrháře DataSet a vyberte TableAdapter, který jste vytvořili.

Kliknutím pravým tlačítkem myši otevřete vlastnost. Existuje vlastnost s názvem BaseClass, která by měla být zpočátku "System.ComponentModel.Component". Přepište to do třídy, kterou jste právě vytvořili. Napíšu všechno, včetně jmenovky.

Pokud jej uložíte, uvidíte, že se změnila základní třída TableAdapter. Nastavením tohoto na každý TableAdapter, můžete zapsat společné zpracování základní třídy.

Chcete-li například získat přístup k internímu adaptéru SQL nebo SQLDataAdapter, zapište: Adaptéry a CommandCollections, které jsou vytvořeny automaticky jsou pouze vlastnosti vytvořené třídy dědice, takže se jich nelze dotknout přímo z dědice. Následující kód používá reflexe vynutit přístup.

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

Můžete vidět, že můžete skutečně použít TableAdapter pro přístup k vlastnostem zděděné třídy.