Nomainiet TableAdapter pamatklasi drukātā datu kopā

Lapas izveides datums :

Kodu, lai izveidotu un ģenerētu drukātu datu kopu

Drukāti DataSet ļauj izveidot DataTable kas ir tipa informāciju par katru kolonnu, pamatojoties uz SQL, vai TableAdapter, kas vienkāršo datu mijiedarbību ar DB, pamatojoties uz drukāti DataTable.

Tā kā mērķis nav izveidot drukāti DataSet šeit, let ' s ātri izveidot DataSet ar datubāzi un tabulu gatavs tagad. Jūs varat arī darīt, ko jūs vēlaties, lai izkārtotu tabulu.

Pirmais solis ir pievienot DataSet kā jaunu vienumu, lai jūsu projektu. Nosaukums ir kaut kas, bet tas ir palicis šeit.

Atveriet DataSet un pievienojiet TableAdapter no projektētāja.

Izpildiet vedni, lai izveidotu DataTable un TableAdapter.

Es domāju, ka šāda forma varētu būt piemērs izguvei un izmantojot ierakstus no datu bāzes, izmantojot DataTable un TableAdapter ka esat izveidojis. (Tas ir tikai piemērs.)

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

Parasti projektam, kas izmanto šo datu kopu, ir mazāk nekā viena tabula, un tiek izveidotas daudzas datu kopas, kas apvieno tabulu vai vairāku tabulu skaitu. Es domāju, ka tā ir kopīga ization apstrādes nākt klajā, kad tas notiek. Piemēram, lai mainītu ierakstu izgūšanas nosacījumus, iespējams, vēlēsities dinamiski mainīt iekšēji lietoto SQL.

Tomēr TableAdapter klase izveidots no datu kopas faktiski automātiski ģenerē kodu. Arī tāpēc, ka šī TableAdapter klase pārmanto komponentu klase, nav metodes vai īpašības, ko var izmantot reālā kopējā. Pamatklasi nevar nodot metodei, lai izsauktu ar tableadapter saistītu operāciju.

Turklāt, SQL izmanto iekšēji, sqldataadapter izmanto, lai piekļūtu datu bāzei, uc ir deklarētas aizsargātas, tāpēc jūs nevarat pieskarties tos no ārpuses.

Tomēr, kā jūs deklarēt metodēm un rekvizītiem, kas deklarēti aizsargātajā, jūs varat pieskarties tiem, izveidojot klasi, kas pārmanto TableAdapter klasi, un šim TableAdapter klasei ir daļējs modifikators, tāpēc varat deklarēt citu metodi vai rekvizītu, lai paplašinātu procesu. Varat arī izveidot jaunu rekvizītu, lai iegūtu iekšējo īpašumu, kā parādīts šajā kodā:

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 faktiski var izmantot šo TableAdapter redzēt, ka jums ir piekļuve paplašinātiem rekvizītiem.

Tomēr piekļuve iekšējiem rekvizītiem nenozīmē, ka process ir kopīgs, un jums vēl ir jāraksta kods katrai datu kopai, ko izveidojat.

TableAdapter pamatklases maiņa

Kā jau tika minēts iepriekš, TableAdapter klase pārmanto komponentu klasi, tāpēc ir grūti koplietot apstrādi. Ja maināt koda daļu, kas pārmanto klasi, kods tiek ģenerēts automātiski, tāpēc datu kopas atjaunināšana atkal atgriež kodu. Ja iespējams, varat uzrakstīt daļēju klasi, kas pārmanto interfeisu atsevišķā failā, bet nav jēgas, jo jums ir jāraksta tik daudz TableAdapters, cik esat izveidojis.

Faktiski, ir mehānisms, lai mainītu pārmantojot klases šo TableAdapter. Es gribētu izskaidrot procedūru.

Vispirms izveidojiet klasi, kuru vēlaties pārmantot. TableAdapter sākotnēji mantoja komponenta klasi, tāpēc jums vajadzētu mantot komponenta klasi, pat ja jūs to radāt. Es uzrakstīšu kodu vēlos dalīties šeit, bet es ņemšu tikai uzrakstīt klasē. Atbilst nosaukumvietai, ko izveidojāt.

using System.ComponentModel;

namespace DataSetBaseAdapter
{
  public class BaseAdapter : Component
  {
  }
}

Pēc tam atveriet datu kopas noformētāju un atlasiet izveidoto TableAdapter.

Ar peles labo pogu noklikšķiniet, lai atvērtu rekvizītu. Ir īpašums sauc BaseClass, kas sākotnēji būtu "System. ComponentModel. Component". Pārrakstīt to klases jūs tikko izveidojāt. Es uzrakstīšu visu, ieskaitot nosaukumvietu.

Ja to saglabāsit, redzēsit, ka TableAdapter Pamatklase ir mainīta. Iestatot to katram TableAdapter, jūs varat uzrakstīt kopīgu apstrādi pamatklasi.

Piemēram, ja vēlaties piekļūt iekšējam SQL vai SQLDataAdapter, rakstiet: Automātiski izveidotie adapteri un CommandCollections ir tikai tie rekvizīti, ko izveidojusi pārmantotājs, tāpēc tos nevar pieskarties tieši no pārmantotājs. Šo kodu izmanto pārdomas, lai piespiestu piekļuvi.

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

Jūs varat redzēt, ka jūs faktiski var izmantot TableAdapter piekļūt īpašībām mantotā klasē.