Pouvez-vous obtenir les noms des colonnes à partir d'un SqlDataReader?
Après la connexion à la base de données, puis-je connaître le nom de toutes les colonnes qui ont été retournés dans mon SqlDataReader
?
Vous devez vous connecter pour publier un commentaire.
ou
columns = Enumerable.Range(0, reader.FieldCount) .Select(reader.GetName).ToList();
SELECT id AS "MyId" FROM table;
Il y a un
GetName
fonction de laSqlDataReader
qui accepte l'index de colonne et retourne le nom de la colonne.À l'inverse, il y a un
GetOrdinal
qui prend un nom de colonne, et renvoie l'index de colonne.GetOrdinal
était parfait. Je cherchaisGetName
, mais beaucoup plus propre solution pour mon problème avecGetOrdinal
.Vous pouvez obtenir les noms des colonnes à partir d'un DataReader.
Voici la partie importante:
Déjà mentionné. Juste un LINQ réponse:
Le second est plus propre et beaucoup plus rapide. Même si vous cache
GetSchemaTable
dans la première approche, l'interrogation va être très lent.reader.Cast<IDataRecord>().ToList()
. Je crois que vous pourriez utiliserdynamic
mot-clé là, au lieu deIDataRecord
mais sans aucun avantage.DataTable
a été conçu pour faciliter uniques de chargement, de sorte que vous pourriez utiliser, mais vous perdez l'avantage de chargement sur demande (avec lecteur de données que vous pourriez arrêter le chargement à n'importe quel point), commevar dt = new DataTable(); dt.Load(reader); return dt.AsEnumerable().ToList();
. Il y a beaucoup de bibliothèques qui permet d'automatiser cette pour vous, découvrez-les ici stackoverflow.com/questions/11988441 et voilà stackoverflow.com/questions/1464883reader.Cast<IEnumerable<dynamic>>
et.Cast<dynamic>
, mais il dit,Cannot convert method group 'Cast' to non-delegate type 'dynamic'. Did you intend to invoke the method?
qu'ai-je fait de mal là? (J'ai regardé vos sources, mais il exige de connaître le nom de la colonne, dont je n'ai pas)using (var reader = command.ExecuteReader()) { return reader.Cast<IDataRecord>().ToList(); }
. Voir cette réponse pour la conversion de, de manière générique, expando objets: stackoverflow.com/a/20223709/661933Si vous voulez les noms de colonne seulement, vous pouvez faire:
Mais si vous avez uniquement besoin d'une ligne, j'aime mon AdoHelper plus. Cet ajout est idéal si vous avez une seule ligne de requête et vous ne voulez pas avoir affaire avec les données de la table en vous code. Elle retourne un casse dictionnaire des noms de colonnes et les valeurs.
throw ex;
est la pire pratique.- Je utiliser le GetSchemaTable méthode, qui est exposée via la IDataReader interface.
Utiliser une méthode d'extension:
Bien sûr que vous pouvez.
Qui est à l'origine de: http://www.dotnetjunkies.ddj.com/Article/B82A22D1-8437-4C7A-B6AA-C6C9BE9DB8A6.dcik
Il est plus facile de l'atteindre en SQL