Modifier la classe de base d’un TableAdapter dans un DataSet dactylographie

Date de création de la page :

Code pour créer et générer un ensemble de données dactylographie

Un dataSet dactylographique vous permet de créer un DataTable qui dispose d’informations de type pour chaque colonne basée sur SQL, ou d’un TableAdapter qui simplifie l’interaction des données avec DB en fonction d’un DataTable dactylographique.

Comme le but n’est pas de créer un DataSet dactylographe ici, créons rapidement un ensemble de données avec la base de données et la table prêtes pour l’instant. Vous pouvez également faire ce que vous voulez pour exposer la table.

La première étape consiste à ajouter un DataSet comme nouvel élément à votre projet. Le nom est tout sauf il est laissé ici.

Ouvrez le DataSet et ajoutez un TableAdapter du concepteur.

Suivez l’assistant pour créer un DataTable et un TableAdapter.

Je pense que le formulaire suivant pourrait être un exemple de récupération et d’utilisation des enregistrements de la base de données à l’aide de la DataTable et TableAdapter que vous avez créé. (Ce n’est qu’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.金額));
    }
  }
}

En règle générale, un projet qui utilise ce DataSet a moins d’une table, et vous créez de nombreux ensembles de données qui combinent le nombre de tables ou de tables multiples. Je pense que c’est une ization commune du traitement à venir quand il se produit. Par exemple, vous voudrez peut-être changer dynamiquement la SQL utilisée à l’interne pour modifier les conditions de récupération des enregistrements.

Toutefois, la classe TableAdapter créée à partir du DataSet est en fait automatiquement générée par le code. En outre, parce que cette classe TableAdapter hérite de la classe de composants, il n’y a pas de méthodes ou de propriétés qui peuvent être utilisées en commun réel. Vous ne pouvez pas passer une classe de base à une méthode pour appeler une opération liée à tableadapter.

En outre, sql utilisé à l’interne, sqldataadapter utilisé pour accéder à la base de données, etc sont déclarés dans protégé, de sorte que vous ne pouvez pas les toucher de l’extérieur.

Cependant, comme vous déclarez pour les méthodes et les propriétés déclarées dans protégé, vous pouvez les toucher en créant une classe qui hérite de la classe TableAdapter, et cette classe TableAdapter a un modificateur partiel, de sorte que vous pouvez déclarer une autre méthode ou une propriété pour prolonger le processus. Vous pouvez également créer une nouvelle propriété pour obtenir la propriété interne, comme dans le code suivant:

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

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

Vous pouvez réellement utiliser ce TableAdapter pour voir que vous avez accès aux propriétés étendues.

Toutefois, l’accès aux propriétés internes ne signifie pas que le processus est commun, et vous devez toujours écrire du code pour chaque Ensemble de données que vous créez.

Changer la classe de base d’un TableAdapter

Comme mentionné précédemment, la classe TableAdapter hérite de la classe des composants, ce qui rend difficile le partage du traitement. Si vous modifiez la partie de code qui hérite d’une classe, le code est généré automatiquement, de sorte que la mise à jour du DataSet renvoie à nouveau le code. Si vous le pouvez, vous pouvez écrire une classe partielle qui hérite de l’interface dans un fichier séparé, mais il n’a pas beaucoup de sens parce que vous devez écrire autant de TableAdapters que vous avez créé.

En fait, il existe un mécanisme pour changer la classe d’hérédation de cette TableAdapter. J’aimerais vous expliquer la procédure.

Tout d’abord, créez la classe que vous voulez hériter. TableAdapter a hérité à l’origine de la classe de composants, de sorte que vous devriez hériter de la classe de composants, même si vous la créez. Je vais écrire le code que je veux partager ici, mais je vais juste écrire un cours. Associez l’espace nom à ce que vous avez créé.

using System.ComponentModel;

namespace DataSetBaseAdapter
{
  public class BaseAdapter : Component
  {
  }
}

Ouvrez ensuite le concepteur DataSet et sélectionnez le TableAdapter que vous avez créé.

Cliquez à droite pour ouvrir la propriété. Il y a une propriété appelée BaseClass, qui devrait d’abord être "System.ComponentModel.Component". Réécrire ceci à la classe que vous venez de créer. Je vais tout écrire, y compris l’espace nom.

Si vous l’enregistrez, vous verrez que la classe de base de la TableAdapter a changé. En définissant ceci à chaque TableAdapter, vous pouvez écrire le traitement commun à la classe de base.

Par exemple, si vous souhaitez accéder à un SQL interne ou à un SQLDataAdapter, écrivez : Les adaptateurs et les commandCollections qui sont créés automatiquement ne sont que des propriétés créées par la classe des héritiers, de sorte qu’ils ne peuvent pas être touchés directement par l’héritier. Le code suivant utilise la réflexion pour forcer 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);
      }
    }
  }
}

Vous pouvez voir que vous pouvez réellement utiliser le TableAdapter pour accéder aux propriétés de la classe héritée.