Ændre basisklassen for et TableAdapter i et indtastet datasæt

Dato for oprettelse af side :

Kode til oprettelse og generering af et indtastet DataSet

Et indtastet DataSet giver dig mulighed for at oprette en DataTable, der indeholder typeoplysninger for hver kolonne baseret på SQL, eller et TableAdapter, der forenkler datainteraktionen med DB baseret på en indtastet DataTable.

Da formålet ikke er at oprette et indtastet DataSet her, lad os hurtigt oprette et DataSet med databasen og tabellen klar til nu. Du kan også gøre, hvad du vil lægge ud bordet.

Det første trin er at føje et DataSet som et nyt element til projektet. Navnet er alt andet end det er tilbage her.

Åbn DataSet, og tilføj et TableAdapter fra designeren.

Følg guiden for at oprette en DataTable og A TableAdapter.

Jeg tror, at følgende formular kan være et eksempel på at hente og bruge poster fra databasen ved hjælp af DataTable og TableAdapter, som du har oprettet. (Dette er blot et eksempel).

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

Et projekt, der bruger dette DataSet, har typisk færre end én tabel, og du opretter mange datasæt, der kombinerer antallet af tabeller eller flere tabeller. Jeg tror, at det er en fælles gør i den behandling, der skal finde sted, når det sker. ændre den SQL, der bruges internt, til at ændre betingelserne for hentning af poster.

Den TableAdapter-klasse, der er oprettet ud fra DataSet, genereres dog automatisk af koden. Da denne TableAdapter-klasse arver komponentklassen, er der heller ingen metoder eller egenskaber, der kan bruges til almindelig. Du kan ikke overføre en basisklasse til en metode for at kalde en tableadapter-relateret handling.

Desuden er sqldataadapter, der bruges til at få adgang til databasen osv., erklæret beskyttet, så du ikke kan røre dem udefra.

Men som du erklærer for metoder og egenskaber, der er erklæret i beskyttet, kan du røre ved dem ved at oprette en klasse, der arver Klassen TableAdapter, og denne TableAdapter-klasse har en delvis modifikator, så du kan erklære en anden metode eller egenskab for at udvide processen. Du kan også oprette en ny egenskab for at hente den interne egenskab, som i følgende kode:

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

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

Du kan faktisk bruge denne TableAdapter til at se, at du har adgang til de udvidede egenskaber.

Adgang til interne egenskaber betyder dog ikke, at processen er almindelig, og du skal stadig skrive kode for hvert DataSet, du opretter.

Ændre basisklassen for et TableAdapter

Som tidligere nævnt arver TableAdapter-klassen komponentklassen, hvilket gør det vanskeligt at dele behandlingen. Hvis du ændrer den del af koden, der arver en klasse, genereres koden automatisk, så hvis datasættet opdateres igen, returneres koden. Hvis du kan, kan du skrive en delvis klasse, der arver interface i en separat fil, men det giver ikke meget mening, fordi du er nødt til at skrive så mange TableAdapters som du har oprettet.

Faktisk er der en mekanisme til at ændre den nedarvende klasse af denne TableAdapter. Jeg vil gerne forklare proceduren.

Først skal du oprette den klasse, du vil arve. TableAdapter arvede oprindeligt komponentklassen, så du skal arve komponentklassen, selvom du opretter den. Jeg vil skrive den kode, jeg ønsker at dele her, men jeg vil bare skrive en klasse. Tilpas navneområdet til det, du har oprettet.

using System.ComponentModel;

namespace DataSetBaseAdapter
{
  public class BaseAdapter : Component
  {
  }
}

Åbn derefter DataSet-designeren, og vælg det TableAdapter, du har oprettet.

Højreklik for at åbne egenskaben. Der er en egenskab kaldet BaseClass, som i første omgang skal være "System.ComponentModel.Component". Omskriv dette til den klasse, du lige har oprettet. Jeg skriver alt, inklusive navneområdet.

Hvis du gemmer den, kan du se, at basisklassen for TableAdapter er ændret. Ved at indstille dette til hver TableAdapter kan du skrive almindelig behandling til basisklassen.

Hvis du for eksempel vil have adgang til en intern SQL eller SQLDataAdapter, skal du skrive: Kort og CommandCollections, der oprettes automatisk, er kun egenskaber, der er oprettet af arverklassen, så de kan ikke berøres direkte fra arvingen. Følgende kode bruger refleksion til at gennemtvinge adgang.

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

Du kan se, at du rent faktisk kan bruge TableAdapter til at få adgang til egenskaberne for den nedarvede klasse.