executereader check c# ado.net

c# - check - ¿Cuál es la mejor manera de detectar si un IDataReader está vacío?



c# mysql reader null value (4)

Parece que IDataReader.Read () siempre es cierto al menos una vez (si me equivoco al respecto, házmelo saber). Entonces, ¿cómo se puede saber si no tiene registros sin simplemente envolverlo en un try / catch?


Acabo de tropezar con este problema y se me ocurrió esto ...

bool isBeforeEoF; do { isBeforeEoF = reader.Read(); if (isBeforeEoF) { yield return new Foo() { StreamID = (Guid)reader["ID"], FileType = (string)reader["Type"], Name = (string)reader["Name"], RelativePath = (string)reader["RelativePath"] }; } } while (isBeforeEoF);


Puedes simplemente lanzar System.Data.IDataReader a System.Data.Common.DbDataReader

using (System.Data.IDataReader IReader = ICommand.ExecuteReader()) { if (((System.Data.Common.DbDataReader)IReader).HasRows) { //do stuff } } // End Using IReader

Es puro mal, pero (por lo general) funciona;)

(suponiendo que su instancia de IDataReader sea ​​implementada por un proveedor ADO.NET personalizado, y no alguna clase tonta personalizada suya que simplemente implemente IDataReader lugar de derivar de DbDataReader [que implementa IDataReader ]).


Sí, si quiere usar la interfaz, entonces lea hasta que la única forma de probar sea falsa. Si está buscando una implementación genérica de IDataReader , puede probar DbDataReader y usar la propiedad HasRows .


if(dr.Read()) { //do stuff } else { //it''s empty }

Usualmente lo harás sin embargo:

while(dr.Read()) { }