Modificarea clasei de bază a unui Adaptor de tabel într-un set de date tastat

Data creării paginii :

Cod pentru crearea și generarea unui set de date tastat

Un set de date tastat vă permite să creați un DataTable care are informații de tip pentru fiecare coloană bazată pe SQL sau un Adaptor de tabel care simplifică interacțiunea de date cu DB pe baza unui DataTable tastat.

Deoarece scopul nu este de a crea un set de date tastat aici, să creăm rapid un set de date cu baza de date și tabelul pregătit pentru moment. Puteți face, de asemenea, tot ce vrei să stabilească masa.

Primul pas este să adăugați un Set de date ca element nou la proiect. Numele este orice, dar este lăsat aici.

Deschideți Setul de date și adăugați un Adaptor de tabel de la proiectant.

Urmați expertul pentru a crea un DataTable și un adaptor de tabel.

Cred că următorul formular poate fi un exemplu de regăsire și utilizarea înregistrărilor din baza de date utilizând DataTable și TableAdapter pe care le-ați creat. (Acesta este doar un exemplu.)

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

De obicei, un proiect care utilizează acest Set de date are mai puțin de un tabel și creați mai multe seturi de date care combină numărul de tabele sau mai multe tabele. Cred că este o comună a prelucrării să vină atunci când se întâmplă. De exemplu, se poate dori să modificați dinamic SQL utilizate intern pentru a modifica condițiile pentru regăsirea înregistrărilor.

Cu toate acestea, clasa TableAdapter creat din setul de date este de fapt generat automat de cod. De asemenea, deoarece această clasă TableAdapter moșteni clasa componentă, nu există metode sau proprietăți care pot fi utilizate în comun reale. Nu se poate trece o clasă de bază la o metodă pentru a apela o operațiune legate de tableadapter.

În plus, SQL folosit intern, sqldataadapter utilizate pentru a accesa baza de date, etc sunt declarate în protejate, astfel încât să nu le puteți atinge din exterior.

Cu toate acestea, după declarați pentru metode și proprietăți declarate în protejate, le puteți atinge prin crearea unei clase care înlocuiește clasa TableAdapter și această clasă TableAdapter are un modificator parțial, astfel încât să puteți declara o altă metodă sau proprietate pentru a extinde procesul. De asemenea, aveți posibilitatea să creați o proprietate nouă pentru a obține proprietatea internă, ca în următorul cod:

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

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

Aveți posibilitatea să utilizați de fapt acest TableAdapter pentru a vedea că aveți acces la proprietățile extinse.

Cu toate acestea, accesarea proprietăților interne nu înseamnă că procesul este comun și tot trebuie să scrieți cod pentru fiecare set de date pe care îl creați.

Modificarea clasei de bază a unui Adaptor de masă

După sa menționat mai devreme, clasa TableAdapter moștenește clasa Componentă, ceea ce face dificilă partajarea de prelucrare. Dacă modificați partea de cod care moștenește o clasă, codul este generat automat, astfel încât actualizarea DataSet returnează din nou codul. Dacă se poate, aveți posibilitatea să scrieți o clasă parțială care moștenește interfața într-un fișier separat, dar nu are prea mult sens, deoarece trebuie să scrieți cât mai multe TableAdapters pe cât ați creat.

De fapt, există un mecanism pentru a schimba clasa de modificare a acestui TableAdapter. Aș vrea să explic procedura.

În primul rând, creați clasa pe care doriți să o modificați. TableAdapter a moștenit inițial clasa Componentă, deci ar trebui să moșteniți clasa Componentă chiar dacă o creați. Voi scrie codul pe care vreau să-l împărtășesc aici, dar voi scrie doar o clasă. Potriviți spațiul de nume cu ceea ce ați creat.

using System.ComponentModel;

namespace DataSetBaseAdapter
{
  public class BaseAdapter : Component
  {
  }
}

Apoi deschideți proiectantul Set de date și selectați Adaptorul de tabel pe care l-ați creat.

Faceți clic dreapta pentru a deschide proprietatea. Există o proprietate numită BaseClass, care ar trebui să fie inițial "System.ComponentModel.Component". Rescrie asta clasei pe care tocmai ai creat-o. Voi scrie totul, inclusiv spațiul de nume.

Dacă îl salvați, veți vedea că clasa de bază a TableAdapter s-a modificat. Setând acest lucru la fiecare TableAdapter, aveți posibilitatea să scrieți procesare a clasei de bază.

De exemplu, dacă doriți să accesați un SQL intern sau SQLDataAdapter, scrieți: Adaptoarele și CommandCollections care sunt create automat sunt numai proprietăți create de clasa de moșie, astfel încât acestea nu pot fi atinse direct de la moșionor. Următorul cod utilizează reflecția pentru a forța accesul.

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

Puteți vedea că puteți utiliza de fapt TableAdapter pentru a accesa proprietățile clasei moștenite.