Lentelės adapterio pagrindinės klasės keitimas įvesto duomenų rinkinio

Puslapio sukūrimo data :

Įvestas DataSet kūrimo ir generavimo kodas

Įvestas DataSet leidžia jums sukurti DataTable, kurioje yra tipo informacija kiekvienam stulpeliui pagal SQL, arba TableAdapter, kuri supaprastina duomenų sąveikos su DB pagal įvestą DataTable.

Kadangi tikslas yra ne sukurti įvestą DataSet čia, galime greitai sukurti DataSet su duomenų bazės ir lentelės paruošta dabar. Taip pat galite daryti viską, ką norite išdėstyti lentelę.

Pirmasis žingsnis yra įtraukti DataSet kaip naują elementą į savo projektą. Pavadinimas yra bet kas, bet jis paliekamas čia.

Atidarykite DataSet ir pridėkite TableAdapter iš dizaino įrankio.

Vykdykite vedlį, kad sukurtumėte DataTable ir TableAdapter.

Manau, kad ši forma gali būti pavyzdys, kaip gauti ir naudoti įrašus iš duomenų bazės naudojant Jūsų sukurtą DataTable ir TableAdapter. (Tai tik pavyzdys.)

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

Paprastai projektas, kuris naudoja šį DataSet turi mažiau nei vieną lentelę, ir galite sukurti daug DataSets, kurie sujungti lentelių arba kelių lentelių skaičių. Manau, kad tai yra bendras perdirbimo sugalvoti, kai tai atsitiks. Pavyzdžiui, galbūt norėsite dinamiškai pakeisti viduje naudojamą SQL įrašams nuskaityti.

Tačiau TableAdapter klasės, sukurtos iš DataSet iš tikrųjų automatiškai generuoja kodas. Be to, dėl to, kad ši TableAdapter klasė paveldi komponento klasę, nėra metodų ar ypatybių, kurias būtų galima naudoti realia bendra. Pagrindinės klasės negalima perduoti metodui, kaip iškviesti su tableadapter susijusią operaciją.

Be to, SQL naudojamas viduje, sqldataadapter naudojamas prieigai prie duomenų bazės, ir tt yra deklaruojami apsaugoti, todėl jūs negalite paliesti juos iš išorės.

Tačiau, kaip jūs deklaruojate metodus ir ypatybes, paskelbtas apsaugotas, galite juos paliesti sukurdami klasę, kuri paveldi TableAdapter klasės, ir ši TableAdapter klasė yra dalinis modifikatorius, todėl jūs galite paskelbti kitą metodą arba ypatybę išplėsti procesą. Taip pat galite sukurti naują ypatybę, kad gautumėte vidinę ypatybę, kaip nurodyta šiame kode:

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

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

Jūs iš tikrųjų galite naudoti šį TableAdapter norėdami pamatyti, kad turite prieigą prie išplėstinių ypatybių.

Tačiau prieiga prie vidinių ypatybių nereiškia, kad procesas yra įprastas, ir jūs vis dar turite rašyti kodą kiekvienam kuriamam DataSet.

Lentelėsadapterio pagrindinės klasės keitimas

Kaip minėta anksčiau, TableAdapter klasė paveldi komponento klasę, todėl sunku bendrinti apdorojimą. Jei pakeisite kodo dalį, kuri paveldi klasę, kodas bus sugeneruotas automatiškai, todėl atnaujinus DataSet vėl grąžins kodą. Jei galite, galite parašyti dalinę klasę, kuri paveldi sąsają atskirame faile, bet tai nėra prasmės, nes turite parašyti tiek TableAdapters, kiek sukūrėte.

Tiesą sakant, yra mechanizmas pakeisti paveldima klasė šio TableAdapter. Norėčiau paaiškinti procedūrą.

Pirmiausia sukurkite klasę, kurią norite paveldėti. TableAdapter iš pradžių paveldėjo komponentų klasę, todėl turėtumėte paveldėti komponento klasę, net jei ją sukūrėte. I'll parašyti kodą noriu pasidalinti čia, bet aš tiesiog parašyti klasę. Suderinkite vardų sritį su tuo, ką sukūrėte.

using System.ComponentModel;

namespace DataSetBaseAdapter
{
  public class BaseAdapter : Component
  {
  }
}

Tada atidarykite DataSet designer ir pasirinkite TableAdapter, kurį sukūrėte.

Dešiniuoju pelės mygtuku spustelėkite, kad atidarytumėte ypatybę. Yra ypatybė, vadinama BaseClass, kuri iš pradžių turėtų būti "System.ComponentModel.Component". Perrašykite tai klasei, kurią ką tik sukūrėte. Aš parašysiu viską, įskaitant vardų erdvę.

Jei jį įrašysite, pamatysite, kad pasikeitė lentelės adapterio pagrindinė klasė. Nustatydami šį parametrą į kiekvieną TableAdapter, galite rašyti bendrą apdorojimą į pagrindinę klasę.

Pvz., jei norite pasiekti vidinį SQL arba SQLDataAdapter, rašykite: Adapteriai ir CommandCollections, kurie sukuriami automatiškai yra tik ypatybės, sukurtos paveldėtojas klasės, todėl jų negalima paliesti tiesiai iš paveldėtojo. Šis kodas naudoja atspindį, kad priverstų prieigą.

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

Galite matyti, kad iš tikrųjų galite naudoti TableAdapter, kad pasiektumėte paveldėtos klasės ypatybes.