Rolf B: C# Klasse/Speicher Array

Beitrag lesen

Hallo Henry,

okay, ich habe heute etwas gelernt: ein DataReader hat einen Indexer, dem man Spaltennamen übergeben kann. Ich dachte bisher immer, man könnte nur Indexpositionen angeben (und diese zur Not mit GetOrdinal vorher einsammeln).

Anyroad - ein DataReader liefert Dir keine Anzahl. Die kennst Du erst, wenn Du das Query-Ergebnis zu Ende gelesen und mitgezählt hast. Es gibt zwar die RecordsAffected-Eigenschaft, aber laut Microsoft gilt die nur für INSERT/UPDATE/DELETE Statements. Wobei ich nicht verstehe, wie ein DataReader mit I/U/D zusammenarbeitet 🤷‍♂️

Eine Notlösung ist eine Vorab-Query, die COUNT(*) ermittelt. Aber das würde ich nicht machen, das ist ja ein doppelter Zugriff auf die Datenbank.

Wenn Du eine Menge von Daten vom DataReader zurückbekommst und im Zugriff halten willst, dann musst Du die auch als Menge speichern. Ein Array bietet sich nicht an, weil Du die Anzahl nicht kennst, aber mit ArrayList oder List<> kann es gehen.

ADO.NET bietet Dir darüber hinaus auch den Typ DataTable an. Mit einem MySqlDataAdapter kannst Du eine DataTable einfach aus dem SQL Statement füllen lassen. Allerdings hast Du dann auch die ganze ADO.NET Infrastruktur am Bein und musst die DataTable vorher designen. Ich nehme an, du verwendest das MySqlConnector Nuget-Paket? Oder verwendest Du MySql.Data? Abhängig davon könnte die relevante Doku leicht unterschiedlich sein.

Und je nachdem, ob Du eine eigene ArrayList oder List<> bildest, oder ob Du mit DataTable arbeitest, kann auch das weitere Vorgehen unterschiedlich sein. DataTables können getypt sein, d.h. du hast dann eine SPSDataTable und eine SPSDataRow, aber das erstellst Du normalerweise nicht von Hand sondern mit den entsprechenden Designer in Visual Studio. Ohne den würde ich von DataTables abraten.

Welchen Weg gehen wir?

Rolf

--
sumpsi - posui - obstruxi