Canviar la classe base d'un TableAdapter en un conjunt de dades mecanografiats

Data de creació de la pàgina :

Codi per crear i generar un conjunt de dades mecanografiat

Un conjunt de dades mecanografiats us permet crear una DataTable que tingui informació de tipus per a cada columna basada en SQL o un TableAdapter que simplifica la interacció de dades amb DB basant-vos en un tipus de dades mecanografiats.

Com que el propòsit no és crear un conjunt de dades escrit aquí, anem a crear ràpidament un conjunt de dades amb la base de dades i la taula preparada per ara. També podeu fer el que vulgueu per establir la taula.

El primer pas és afegir un conjunt de dades com a element nou al vostre projecte. El nom és qualsevol cosa però es deixa aquí.

Obriu el conjunt de dades i afegiu un TableAdapter del dissenyador.

Seguiu l'Assistent per crear una DataTable i un TableAdapter.

Penso que el següent formulari podria ser un exemple de recuperar i utilitzar registres de la base de dades que utilitza el DataTable i TableAdapter que creava. (Això és només un exemple.)

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

Normalment, un projecte que utilitza aquest conjunt de dades té menys d'una taula i crea molts conjunts de dades que combinen el nombre de taules o diverses taules. Crec que és una forma comuna del processament per arribar quan succeeix. Per exemple, és possible que vulgueu canviar dinàmicament l'SQL utilitzat internament per canviar les condicions per a la recuperació de registres.

No obstant això, la classe TableAdapter creada a partir del conjunt de dades és de fet generada automàticament pel codi. També, perquè aquesta classe de TableAdapter herera la classe de component, no hi ha mètodes o propietats que es poden utilitzar en comú real. No podeu passar una classe base a un mètode per cridar una operació relacionada amb el tableadapter.

A més, SQL utilitzat internament, sqldataadaptador utilitzat per accedir a la base de dades, etc es declaren en protegit, de manera que no es pot tocar des de l'exterior.

No obstant això, a mesura que declareu per a mètodes i propietats declarats protegits, podeu tocar-los creant una classe que herega la classe TableAdapter, i aquesta classe TableAdapter té un modificador parcial, de manera que podeu declarar un altre mètode o una propietat per estendre el procés. També podeu crear una propietat nova per obtenir la propietat interna, com en el codi següent:

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

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

Pot de fet utilitzar aquest TableAdapter per veure que té accés a les propietats esteses.

No obstant això, l'accés a les propietats internes no significa que el procés sigui comú, i encara heu d'escriure el codi per a cada conjunt de dades que creeu.

Canviar la classe base d'un TableAdapter

Com s'ha esmentat anteriorment, la classe TableAdapter herera la classe de components, de manera que és difícil compartir el processament. Si canvieu la part del codi que heret una classe, el codi es genera automàticament, de manera que l'actualització del conjunt de dades torna a retornar el codi. Si podeu, podeu escriure una classe parcial que HERLI la interfície en un fitxer separat, però no té gaire sentit perquè heu d'escriure tants quadres com hàgiu creat.

De fet, hi ha un mecanisme per canviar la classe d'herència d'aquest TableAdapter. M'agradaria explicar el procediment.

En primer lloc, creeu la classe que voleu heretar. TableAdapter originalment heretava la classe de component, així hauria d'heretar la classe de component fins i tot si el crea. Escriuré el codi que vull compartir aquí, però només escriuré una classe. Coincideixen amb l'espai de noms del que heu creat.

using System.ComponentModel;

namespace DataSetBaseAdapter
{
  public class BaseAdapter : Component
  {
  }
}

A continuació, obriu el dissenyador del conjunt de dades i seleccioneu el TableAdapter que heu creat.

Feu clic amb el botó dret per obrir la propietat. Hi ha una propietat anomenada BaseClass, que ha de ser inicialment "System. ComponentModel. component". Reescrigui això a la classe que només creava. Escriuré tot, incloent-hi l'espai de noms.

Si el deseu, veureu que la classe base del TableAdapter ha canviat. Posant això a cada TableAdapter, pot escriure processament comú a la classe de base.

Per exemple, si voleu accedir a un SQL intern o SQLDataAdapter, escriviu: Els adaptadors i Mancol·leccions que es creen automàticament només són propietats creades per la classe d'hereu, de manera que no es poden tocar directament des de l'heror. El codi següent utilitza la reflexió per forçar l'accés.

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

Vostè pot veure que en realitat pot utilitzar el TableAdapter per accedir a les propietats de la classe heretada.