Après la connexion à la base de données, puis-je obtenir le nom de toutes les colonnes qui ont été renvoyées dans mon SqlDataReader
?
c#
ado.net
sqldatareader
Blankman
la source
la source
columns = Enumerable.Range(0, reader.FieldCount) .Select(reader.GetName).ToList();
SELECT id AS "MyId" FROM table;
Il y a une
GetName
fonction sur leSqlDataReader
qui accepte l'index de colonne et retourne le nom de la colonne.Inversement, il y a un
GetOrdinal
qui prend un nom de colonne et retourne l'index de colonne.la source
GetOrdinal
était parfait. Je cherchaisGetName
, mais une solution beaucoup plus propre pour mon problèmeGetOrdinal
.Vous pouvez obtenir les noms de colonne à partir d'un DataReader.
Voici la partie importante:
la source
Déjà mentionné. Juste une réponse LINQ :
Le second est plus propre et beaucoup plus rapide. Même si vous mettez en cache
GetSchemaTable
dans la première approche, l'interrogation va être très lente.la source
reader.Cast<IDataRecord>().ToList()
. Je pense que vous pouvez utiliser undynamic
mot clé à la place,IDataRecord
mais sans aucun avantage.DataTable
a été conçu pour faciliter le chargement ponctuel, vous pouvez donc l'utiliser aussi mais vous perdez l'avantage du chargement à la demande (avec le lecteur de données, vous pouvez arrêter le chargement à tout moment), commevar dt = new DataTable(); dt.Load(reader); return dt.AsEnumerable().ToList();
. Il existe de nombreuses bibliothèques qui peuvent automatiser cela pour vous, trouvez-les ici stackoverflow.com/questions/11988441 et ici stackoverflow.com/questions/1464883reader.Cast<IEnumerable<dynamic>>
et.Cast<dynamic>
, mais ça dit,Cannot convert method group 'Cast' to non-delegate type 'dynamic'. Did you intend to invoke the method?
qu'est-ce que j'ai fait de mal là-bas? (J'ai regardé vos sources, mais elles vous demandaient de connaître le nom de la colonne, ce que je ne sais pas)Si vous ne voulez que les noms de colonne, vous pouvez faire:
Mais si vous n'avez besoin que d'une seule ligne, j'aime mon ajout AdoHelper. Cet ajout est idéal si vous avez une requête sur une seule ligne et que vous ne souhaitez pas traiter le tableau de données dans votre code. Il renvoie un dictionnaire insensible à la casse des noms et des valeurs des colonnes.
la source
throw ex;
est une pire pratique.J'utilise la méthode GetSchemaTable , qui est exposée via l'interface IDataReader.
la source
Utilisez une méthode d'extension:
la source
Vous le pouvez certainement.
Il s'agit à l'origine de: http://www.dotnetjunkies.ddj.com/Article/B82A22D1-8437-4C7A-B6AA-C6C9BE9DB8A6.dcik
la source
Il est plus facile de le réaliser en SQL
la source