Ändern der Basisklasse eines TableAdapters in einem typisierten DataSet
Code zum Erstellen und Generieren eines typisierten DataSets
Mit einem typisierten DataSet können Sie eine DataTable mit Typinformationen für jede Spalte basierend auf SQL erstellen, oder einen TableAdapter, der die Dateninteraktion mit DB basierend auf einer typisierten DataTable vereinfacht.
Da der Zweck nicht darin besteht, hier ein typisiertes DataSet zu erstellen, erstellen wir schnell ein DataSet mit der Datenbank und Tabelle, die jetzt bereit ist. Sie können auch tun, was Sie wollen, um die Tabelle zu legen.
Der erste Schritt besteht darin, Ihrem Projekt ein DataSet als neues Element hinzuzufügen. Der Name ist alles andere als hier.
Öffnen Sie das DataSet, und fügen Sie einen TableAdapter aus dem Designer hinzu.
Folgen Sie dem Assistenten, um eine DataTable und einen TableAdapter zu erstellen.
Ich denke, dass das folgende Formular ein Beispiel für das Abrufen und Verwenden von Datensätzen aus der Datenbank mit der DataTable und TableAdapter sein könnte, die Sie erstellt haben. (Dies ist nur ein Beispiel.)
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.金額));
}
}
}
In der Regel verfügt ein Projekt, das dieses DataSet verwendet, über weniger als eine Tabelle, und Sie erstellen viele DataSets, die die Anzahl der Tabellen oder mehrere Tabellen kombinieren. Ich denke, es ist eine gemeinsame Isierung der Verarbeitung, wenn sie kommt. Sie können z. B. die intern verwendete SQL dynamisch ändern, um die Bedingungen für das Abrufen von Datensätzen zu ändern.
Die aus dem DataSet erstellte TableAdapter-Klasse wird jedoch automatisch vom Code generiert. Da diese TableAdapter-Klasse die Component-Klasse erbt, gibt es keine Methoden oder Eigenschaften, die in realer Allgemeinheit verwendet werden können. Sie können keine Basisklasse an eine Methode übergeben, um einen Tabellenadapter-bezogenen Vorgang aufzurufen.
Darüber hinaus werden sql, das intern verwendet wird, sqldataadapter, das für den Zugriff auf die Datenbank usw. verwendet wird, als geschützt deklariert, sodass Sie sie nicht von außen berühren können.
Wenn Sie jedoch für In protected deklarierte Methoden und Eigenschaften deklarieren, können Sie sie berühren, indem Sie eine Klasse erstellen, die die TableAdapter-Klasse erbt, und diese TableAdapter-Klasse verfügt über einen partiellen Modifikator, sodass Sie eine andere Methode oder Eigenschaft deklarieren können, um den Prozess zu erweitern. Sie können auch eine neue Eigenschaft erstellen, um die interne Eigenschaft abrufe, wie im folgenden Code:
using System.Data.SqlClient;
namespace DataSetBaseAdapter {
public partial class DataSet1 {
}
}
namespace DataSetBaseAdapter.DataSet1TableAdapters
{
public partial class 金額集計TestTableAdapter
{
public SqlDataAdapter InnerAdapter
{
get { return Adapter; }
}
}
}
Sie können diesen TableAdapter tatsächlich verwenden, um zu sehen, dass Sie Zugriff auf die erweiterten Eigenschaften haben.
Der Zugriff auf interne Eigenschaften bedeutet jedoch nicht, dass der Prozess üblich ist, und Sie müssen weiterhin Code für jedes DataSet schreiben, das Sie erstellen.
Ändern der Basisklasse eines TableAdapters
Wie bereits erwähnt, erbt die TableAdapter-Klasse die Component-Klasse, was die gemeinsame Verarbeitung erschwert. Wenn Sie den Teil des Codes ändern, der eine Klasse erbt, wird der Code automatisch generiert, sodass das Aktualisieren des DataSet den Code erneut zurückgibt. Wenn Sie können, können Sie eine partielle Klasse schreiben, die die Schnittstelle in einer separaten Datei erbt, aber es macht keinen großen Sinn, da Sie so viele TableAdapter schreiben müssen, wie Sie erstellt haben.
Tatsächlich gibt es einen Mechanismus zum Ändern der Erbenklasse dieses TableAdapters. Ich möchte das Verfahren erläutern.
Erstellen Sie zunächst die Klasse, die Sie erben möchten. TableAdapter hat ursprünglich die Component-Klasse geerbt, daher sollten Sie die Component-Klasse erben, auch wenn Sie sie erstellen. Ich schreibe den Code, den ich hier teilen möchte, aber ich schreibe nur eine Klasse. Entspricht dem Namespace dem erstellten Namen.
using System.ComponentModel;
namespace DataSetBaseAdapter
{
public class BaseAdapter : Component
{
}
}
Öffnen Sie dann den DataSet-Designer, und wählen Sie den von Ihnen erstellten TableAdapter aus.
Klicken Sie mit der rechten Maustaste, um die Eigenschaft zu öffnen. Es gibt eine Eigenschaft namens BaseClass, die zunächst "System.ComponentModel.Component" sein sollte. Schreiben Sie dies in die Klasse um, die Sie gerade erstellt haben. Ich schreibe alles, einschließlich des Namespace.
Wenn Sie es speichern, sehen Sie, dass sich die Basisklasse des TableAdapter geändert hat. Wenn Sie dies auf jeden TableAdapter festlegen, können Sie eine allgemeine Verarbeitung in die Basisklasse schreiben.
Wenn Sie beispielsweise auf ein internes SQL oder SQLDataAdapter zugreifen möchten, schreiben Sie: Adapter und CommandCollections, die automatisch erstellt werden, sind nur Eigenschaften, die von der Erbenklasse erstellt werden, sodass sie nicht direkt vom Erben berührt werden können. Der folgende Code verwendet Reflektion, um den Zugriff zu erzwingen.
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);
}
}
}
}
Sie können sehen, dass Sie tatsächlich den TableAdapter verwenden können, um auf die Eigenschaften der geerbten Klasse zuzugreifen.