Taulukkosovittimen perusluokan muuttaminen kirjoiteessa DataSet-kohteessa

Sivun luontipäivämäärä :

Koodi, jolla luodaan ja luodaan kirjoitettu DataSet

Kirjoitetun DataSet-kohteen avulla voit luoda DataTable-taulukon, joka on kunkin SQL-pohjaisen sarakkeen tyyppitiedot, tai TableAdapterin, joka yksinkertaistaa tietojen vuorovaikutusta DB:n kanssa kirjoitetun DataTable-taulukon perusteella.

Koska tarkoituksena ei ole luoda kirjoitettua DataSet täällä, let's nopeasti luoda DataSet tietokannan ja taulukon valmis nyt. Voit myös tehdä mitä haluat asettaa pöydän.

Ensimmäinen vaihe on lisätä DataSet uutena kohteena projektiin. Nimi on kaikkea muuta kuin se on jäljellä täällä.

Avaa DataSet ja lisää Taulukkosovitin suunnittelijalta.

Luo DataTable ja TableAdapter ohjatun toiminnon avulla.

Mielestäni seuraava lomake voi olla esimerkki tietueiden noutamisesta ja käyttämisestä tietokannasta luomasi DataTable- ja TableAdapter-sovittimen avulla. (Tämä on vain esimerkki.)

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

Yleensä tätä DataSetiä käyttävässä projektissa on vähemmän kuin yksi taulukko, ja luot useita tietojoukkoja, jotka yhdistävät taulukoiden tai useiden taulukoiden määrän. Uskon, että se on yhteinen käsittely keksiä, kun se tapahtuu. Voit esimerkiksi muuttaa sisäisesti käytettävää SQL:ää dynaamisesti tietueiden hakemisen ehtojen muuttamiseksi.

DataSetistä luotu TableAdapter-luokka luodaan kuitenkin automaattisesti koodilla. Koska tämä TableAdapter-luokka perii Komponentti-luokan, ei ole olemassa menetelmiä tai ominaisuuksia, joita voidaan käyttää tosi yleisinä. Perusluokkaa ei voi siirtää menetelmään, jolla kutsutaan taulusovittimeen liittyvää toimintoa.

Lisäksi sql käytetään sisäisesti, sqldataadapter käytetään käyttämään tietokantaa, jne.

Kun kuitenkin määrität suojatussa käytössä oleville menetelmille ja ominaisuuksille, voit koskettaa niitä luomalla luokan, joka perii TableAdapter-luokan, ja tässä TableAdapter-luokassa on osittainen muunnin, joten voit määrittää toisen menetelmän tai ominaisuuden prosessin laajentamiseksi. Voit myös luoda uuden ominaisuuden sisäisen ominaisuuden saamiseksi, kuten seuraavassa koodissa:

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

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

Tämän TableAdapterin avulla voit itse asiassa nähdä, että sinulla on laajennetut ominaisuudet.

Sisäisten ominaisuuksien käyttäminen ei kuitenkaan tarkoita, että prosessi on yleinen, ja sinun on silti kirjoitettava koodi kullekin luomaasi DataSet-joukkoa varten.

TableAdapterin perusluokan muuttaminen

Kuten edellä mainittiin, TableAdapter-luokka perii Komponentti-luokan, mikä vaikeuttaa käsittelyn jakamista. Jos muutat luokan perivän koodin osaa, koodi luodaan automaattisesti, joten DataSet-kohteen päivittäminen palauttaa koodin uudelleen. Jos voit, voit kirjoittaa osittaisen luokan, joka perii liittymän erilliseen tiedostoon, mutta siinä ei ole paljon järkeä, koska sinun on kirjoitettava niin monta TableAdapteria kuin olet luonut.

Itse asiassa on olemassa mekanismi muuttaa periytyvä luokka tämän TableAdapter. Haluaisin selittää toimenpiteen.

Luo ensin luokka, jonka haluat periä. TableAdapter peri alun perin Komponentti-luokan, joten sinun tulisi periä Komponentti-luokka, vaikka luot sen. I'll kirjoittaa koodin haluan jakaa täällä, mutta minä vain kirjoittaa luokan. Vastaa nimitilaa luomaasi.

using System.ComponentModel;

namespace DataSetBaseAdapter
{
  public class BaseAdapter : Component
  {
  }
}

Avaa sitten DataSet-suunnitteluohjelma ja valitse luomasi TableAdapter.

Avaa ominaisuus napsauttamalla hiiren kakkospainiketta. On olemassa BaseClass-niminen ominaisuus, jonka pitäisi aluksi olla System.ComponentModel.Component. Kirjoita tämä uudelleen juuri luomaasi luokkaan. Kirjoitan kaiken, myös nimiavaruuden.

Jos tallennat sen, näet, että TableAdapterin perusluokka on muuttunut. Määrittämällä tämän jokaiselle TableAdapter-sovittimelle voit kirjoittaa perusluokkaan yhteisen käsittelyn.

Jos esimerkiksi haluat käyttää sisäistä SQL- tai SQLDataAdapter-sovitinta, kirjoita: Automaattisesti luodut sovittimet ja CommandCollectionit ovat vain periytyjäluokan luomia ominaisuuksia, joten niitä ei voi koskettaa suoraan perijältä. Seuraava koodi pakottaa käytön heijastukseen.

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

Näet, että voit käyttää periytyneen luokan ominaisuuksia TableAdapterin avulla.