Begépelt adatkészlettábla-adapter alaposztályának módosítása
Gépelt adatkészlet létrehozásához és létrehozásához kód
A gépelt DataSet lehetővé teszi, hogy hozzon létre egy DataTable, amely a típus információkat minden oszlop alapján SQL, vagy a TableAdapter, amely leegyszerűsíti az adatok közötti interakció DB alapján gépelt DataTable.
Mivel a cél nem az, hogy hozzon létre egy gépelt DataSet itt, menjünk gyorsan hozzon létre egy DataSet az adatbázis és a tábla készen áll most. Azt csinálsz, amit csak akarsz, hogy terítsd le az asztalt.
Az első lépés egy DataSet hozzáadása új elemként a projekthez. A név minden, de itt maradt.
Nyissa meg a DataSet-et, és adjon hozzá egy TableAdaptert a tervezőtől.
Kövesse a varázslót a DataTable és a TableAdapter létrehozásához.
Úgy gondolom, hogy a következő űrlap lehet egy példa a lekérés és a rekordok használata az adatbázisból a DataTable és TableAdapter, amit létrehozott. (Ez csak egy példa.)
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.金額));
}
}
}
A DataSet et használó projektek általában egynél kevesebb táblával rendelkeznek, és számos olyan adatkészletet hoz létre, amelyek a táblák vagy több tábla számát kombinálják. Úgy gondolom, hogy ez egy közös ization a feldolgozás, hogy jöjjön fel, amikor ez megtörténik. Előfordulhat például, hogy dinamikusan módosítani szeretné a belsőleg használt SQL-t a rekordok beolvasási feltételeinek módosításához.
A DataSet-ből létrehozott TableAdapter osztályt azonban a kód automatikusan létrehozza. Emellett mivel ez a TableAdapter osztály örökli az összetevőosztályt, nincsenek olyan metódusok vagy tulajdonságok, amelyek valódi közösen használhatók. Az alaposztály nem adható át egy asztaladapterrel kapcsolatos művelet hívására irányuló metódusnak.
Ezenkívül az adatbázis eléréséhez használt sql, sqldataadapter deklarálva védett, így kívülről nem érintheti őket.
Ha azonban deklarálja a védett metódusokban deklarált metódusokat és tulajdonságokat, megérintheti őket, ha létrehoz egy osztályt, amely örökli a TableAdapter osztályt, és ez a TableAdapter osztály részleges módosítóval rendelkezik, így deklarálhat egy másik metódust vagy tulajdonságot a folyamat kiterjesztéséhez. A belső tulajdonság levételéhez új tulajdonságot is létrehozhat, ahogy az a következő kódban szerepel:
using System.Data.SqlClient;
namespace DataSetBaseAdapter {
public partial class DataSet1 {
}
}
namespace DataSetBaseAdapter.DataSet1TableAdapters
{
public partial class 金額集計TestTableAdapter
{
public SqlDataAdapter InnerAdapter
{
get { return Adapter; }
}
}
}
Ezzel a TableAdapter-adapterrel láthatja, hogy rendelkezik-e hozzáféréssel a kiterjesztett tulajdonságokhoz.
A belső tulajdonságok elérése azonban nem jelenti azt, hogy a folyamat gyakori, és továbbra is kódot kell írnia minden létrehozott Adatkészlethez.
TableAdapter alaposztályának módosítása
Ahogy korábban említettük, a TableAdapter osztály örökli a Komponens osztályt, ami megnehezíti a feldolgozás megosztását. Ha módosítja a kód azon részét, amely egy osztályt örököl, a kód automatikusan létrejön, így a DataSet frissítése ismét a kódot adja vissza. Ha lehet, írhat egy részleges osztályt, amely egy külön fájlban örökli a felületet, de ennek nincs sok értelme, mert annyi TableAdaptert kell írnia, amennyit létrehozott.
Valójában van egy mechanizmus a TableAdapter öröklő osztályának módosítására. Szeretném elmagyarázni az eljárást.
Először hozza létre az örökölni kívánt osztályt. A TableAdapter eredetileg örökölte a Komponens osztályt, ezért akkor is örökölnie kell az összetevőosztályt, ha létrehozza. Írok a kódot szeretnék megosztani itt, de én csak írni egy osztályt. A névtér és a létrehozott névtér egyeztetése.
using System.ComponentModel;
namespace DataSetBaseAdapter
{
public class BaseAdapter : Component
{
}
}
Ezután nyissa meg a DataSet tervezőt, és jelölje ki a létrehozott TableAdaptert.
A jobb gombbal kattintva nyissa meg a tulajdonságot. Van egy BaseClass nevű tulajdonság, amelynek kezdetben "System.ComponentModel.Component"-nek kell lennie. Írja át ezt az imént létrehozott osztálynak. Mindent megírok, beleértve a névteret is.
Ha menti, látni fogja, hogy a TableAdapter alaposztálya megváltozott. Ha ezt minden TableAdapterre állítja, közös feldolgozást írhat az alaposztályba.
Ha például belső SQL- vagy SQLDataAdapter-t szeretne elérni, írja be a következőt: Az automatikusan létrehozott adapterek és commandCollection-ek csak az öröklési osztály által létrehozott tulajdonságok, így nem érinthetők közvetlenül az öröklőtől. A következő kód reflexiót használ a hozzáférés kényszerítéséhez.
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);
}
}
}
}
Láthatja, hogy a TableAdapter ténylegesen használhatja az örökölt osztály tulajdonságainak eléréséhez.