Pregunta

Me da algo extraño cuando intento leer algunos datos con el conector MySQL .net. Aquí está el código:

IDataReader reader = null;

using (MySqlConnection connection = new MySqlConnection(this.ConnectionString))
{
    String getSearch = "select * from organization";
    MySqlCommand cmd = new MySqlCommand(getSearch, connection);
    cmd.CommandType = CommandType.Text;

    connection.Open();
    reader = cmd.ExecuteReader();

    while (reader.Read())
    {
        // response write some stuff to the screen (snipped for brevity)
    }
}

Si pongo un punto de interrupción después de ExecuteReader y expando la vista de resultados en Visual Studio (al pasar el mouse sobre el lector y expandir), puedo ver las filas devueltas por la consulta. Si luego dejo que se cierre y expanda la vista de resultados nuevamente, aparece el mensaje 'La enumeración no produjo resultados'.

Parece que los contenidos del lector se reinician tan pronto como se ven.

En cuanto a lo que hemos intentado:
- el SQL se ejecuta bien directamente en DB
- Vincular los resultados de la consulta directamente a una cuadrícula de datos solo devuelve una cuadrícula de datos vacía
- obtuve la última versión del conector .net
- probado en dos máquinas diferentes para descartar cualquier error local

Hasta ahora nada ha funcionado.

Si alguien pudiera ofrecer alguna idea o sugerencia, sería muy apreciada.

¿Fue útil?

Solución

por lo que entiendo, el SqlDataReader está destinado a usarse para una enumeración única de los datos que ha devuelto. Una vez que haya recorrido los resultados una vez, el objeto ha cumplido con su deber. Aquí hay un par de ideas para solucionar este problema, una de las cuales puede resolver esto en función de sus necesidades:

  1. Vuelva a ejecutar la consulta para generar otro SqlDataReader cuando sea necesario

  2. En lugar de utilizar el SqlDataReader, almacene los resultados de su consulta original en un System.Data.DataTable, donde luego puede volver a leer y manipular los datos como quiera.

Espero que esto ayude!

Adam

Otros consejos

Como un lector de datos lee información, el bloque que usa cierra la conexión al lector justo después de asignar su valor a la variable. Aquí está un artículo que muestra algunos ejemplos de código que pueden llevarlo a donde necesita estar.

La clave es que la conexión DEBE estar abierta cuando se intenta leer desde el lector.

Aquí está la explicación:

Esto se debe a que ya ha pasado por el lector una vez en el depurador (la primera vez que amplió la vista). Esta es la forma en que funcionan los lectores, y por lo que sé, no hay forma de restablecer un lector para que vuelva a leer desde el principio, excepto la opción de re-ejecución:

  

Solo tienes que volver a ejecutar el    cmd.ExecuteReader (); línea (a la derecha   haga clic en la fuente y use " set   siguiente declaración " opción de menú).

Este es el comportamiento de los lectores de datos. Si ya lo ha recorrido, no puede regresar. Debe ejecutar el comando nuevamente y recuperar uno nuevo.

Si necesita usar sus datos después de cerrar el lector, puede optar por usar un Typed DataSet , o el DataSet sin tipo como se especifica en Adam's answer .

Por cierto, aquí hay algunas optimizaciones que podrías hacer:

  • Mueva el lector dentro del Connection usando el bloque para hacerlo salir de alcance después de terminar usándolo (una vez que está fuera de uso bloque, la conexión se cerrará y no podrá usarlo de todos modos, por lo que no tiene sentido dejarlo afuera)
  • Ejecute ExecuteReader en otro bloque usando (ya que implementa IDisposable ) y hace lo mismo con el Sql Command (el mismo IDisposable interfaz)
  • No recuperar todos los campos de la base de datos
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top