Kann ich nach dem Herstellen einer Verbindung zur Datenbank den Namen aller Spalten abrufen, die in meinem zurückgegeben wurden SqlDataReader
?
c#
ado.net
sqldatareader
Blankman
quelle
quelle
columns = Enumerable.Range(0, reader.FieldCount) .Select(reader.GetName).ToList();
SELECT id AS "MyId" FROM table;
Es gibt eine
GetName
Funktion,SqlDataReader
die den Spaltenindex akzeptiert und den Namen der Spalte zurückgibt.Umgekehrt gibt es eine,
GetOrdinal
die einen Spaltennamen aufnimmt und den Spaltenindex zurückgibt.quelle
GetOrdinal
war perfekt. Ich suchteGetName
, aber viel sauberere Lösung für mein Problem mitGetOrdinal
.Sie können die Spaltennamen von einem DataReader abrufen.
Hier ist der wichtige Teil:
quelle
Schon erwähnt. Nur eine LINQ- Antwort:
Der zweite ist sauberer und viel schneller. Selbst wenn Sie
GetSchemaTable
beim ersten Ansatz zwischenspeichern, wird die Abfrage sehr langsam sein.quelle
reader.Cast<IDataRecord>().ToList()
. Ich glaube, Sie könnten dort eindynamic
Schlüsselwort verwenden,IDataRecord
aber ohne Nutzen.DataTable
wurde entwickelt, um das einmalige Laden zu vereinfachen, sodass Sie dies auch verwenden können, aber den Vorteil des Ladens bei Bedarf verlieren (mit dem Datenleser können Sie das Laden jederzeit beenden), wie zvar dt = new DataTable(); dt.Load(reader); return dt.AsEnumerable().ToList();
. Es gibt viele Bibliotheken, die dies für Sie automatisieren können. Sie finden sie hier stackoverflow.com/questions/11988441 und hier stackoverflow.com/questions/1464883reader.Cast<IEnumerable<dynamic>>
und.Cast<dynamic>
, aber es heißt,Cannot convert method group 'Cast' to non-delegate type 'dynamic'. Did you intend to invoke the method?
was habe ich dort falsch gemacht? (Ich habe mir Ihre Quellen angesehen, aber Sie mussten den Spaltennamen kennen, was ich nicht weiß.)Wenn Sie nur die Spaltennamen möchten, können Sie Folgendes tun:
Wenn Sie jedoch nur eine Zeile benötigen, gefällt mir mein AdoHelper-Zusatz. Dieser Zusatz ist ideal, wenn Sie eine einzeilige Abfrage haben und sich nicht mit der Datentabelle in Ihrem Code befassen möchten. Es wird ein Wörterbuch mit Spaltennamen und -werten zurückgegeben, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird.
quelle
throw ex;
ist eine schlechteste Praxis.Ich verwende die GetSchemaTable- Methode, die über die IDataReader-Schnittstelle verfügbar gemacht wird.
quelle
Verwenden Sie eine Erweiterungsmethode:
quelle
Sie können sicher.
Dies ist ursprünglich von: http://www.dotnetjunkies.ddj.com/Article/B82A22D1-8437-4C7A-B6AA-C6C9BE9DB8A6.dcik
quelle
In SQL ist dies einfacher zu erreichen
quelle