Mi pregunta es cómo obtener la cantidad de filas devueltas por una consulta usando SqlDataReader
en C #. He visto algunas respuestas sobre esto, pero ninguna se definió claramente, excepto una que dice hacer un ciclo while con el Read()
método e incrementar un contador.
Mi problema es que estoy tratando de llenar una matriz multidimensional con la primera fila con los nombres de los encabezados de las columnas y todas las filas posteriores a los datos de la fila.
Sé que puedo simplemente volcar las cosas en un control de lista y no preocuparme por ello, pero para mi propia edificación personal y también me gustaría extraer los datos dentro y fuera de la matriz según lo elija y mostrarlos en diferentes formatos.
Así que creo que no puedo hacer la forma Read()
y luego incrementar ++ porque eso significa que tendría que abrir Read()
y luego abrir de Read()
nuevo para obtener la cantidad de filas y luego los datos de la columna.
Solo un pequeño ejemplo de lo que estoy hablando:
int counter = 0;
while (sqlRead.Read())
{
//get rows
counter++
}
y luego un bucle for para recorrer las columnas y hacer estallar
something.Read();
int dbFields = sqlRead.FieldCount;
for (int i = 0; i < dbFields; i++)
{
// do stuff to array
}
fuente
RepeatableRead
nivel de aislamiento no realiza el bloqueo de rango, por lo que aún permite insertar registros; debe usar un nivel de aislamiento deSnapshot
oSerializable
.Si no necesita recuperar toda la fila y desea evitar hacer una consulta doble, probablemente pueda intentar algo como eso:
Es posible que deba agregar una transacción y no esté seguro de si la reutilización del mismo comando agregará automáticamente una transacción en él ...
fuente
sqlCon.Close();
? Pensé queusing
debería hacerlo por ti.Según lo anterior, un conjunto de datos o un conjunto de datos escrito puede ser una buena estructura temporal que podría usar para hacer su filtrado. Un SqlDataReader está destinado a leer los datos muy rápidamente. Mientras está en el bucle while (), todavía está conectado a la base de datos y está esperando que haga lo que esté haciendo para leer / procesar el siguiente resultado antes de que continúe. En este caso, puede obtener un mejor rendimiento si extrae todos los datos, cierra la conexión a la base de datos y procesa los resultados "sin conexión".
La gente parece odiar los conjuntos de datos, por lo que lo anterior también se podría hacer con una colección de objetos fuertemente tipados.
fuente
No puede obtener un recuento de filas directamente desde un lector de datos porque es lo que se conoce como cursor de manguera de incendios, lo que significa que los datos se leen fila por fila en función de la lectura que se realiza. Aconsejaría no hacer 2 lecturas de los datos porque existe la posibilidad de que los datos hayan cambiado entre las 2 lecturas y, por lo tanto, obtendría resultados diferentes.
Lo que podría hacer es leer los datos en una estructura temporal y usarla en lugar de la segunda lectura. Alternativamente, deberá cambiar el mecanismo mediante el cual recupera los datos y usar algo como un DataTable en su lugar.
fuente
para completar la respuesta de Pit y para un mejor rendimiento: obtenga todo en una consulta y use el método NextResult.
fuente
También me enfrento a una situación en la que necesitaba devolver un resultado superior, pero también quería obtener el total de filas que coincidían con la consulta. finalmente llego a esta solución:
fuente