none
Utilizar varios SQLDataReader RRS feed

  • Pregunta

  • Hola Chicos... Estoy tratando de hacer dos consultas, si no se encuentra lo buscado en una, que me salte a la otra, lo tengo desde el evento Click de un botón en el Formulario que es esto:

    private void btnSerial_Click(object sender, EventArgs e)
            {
                BuscarO();
                Tamaño();
            }

    Y BuscarO que es el método donde tengo las consultas es así:

    private void BuscarO()
            {
                string CadSQL = "SELECT * FROM ORevisiónSTI WHERE Id='" + txtNOrden.Text + "' ";
                SqlCommand CMD = new SqlCommand(CadSQL, ObjC.Conexión);
                ObjC.AbrirConexión();
                SqlDataReader Registro = CMD.ExecuteReader();
                
                if (Registro.Read() == true)
                {
                    MessageBox.Show("La orden que usted está buscando no ha sido procesada por Servicio Técnico.\n\nSi la orden " +
                        "lleva mucho tiempo sin procesar, comuníquese con la Gerencia de Producto.", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    Registro.Close();
                }
                else
                {
                    Registro.Close();
                    string CadSQL2 = "SELECT * FROM ORevisiónSTR WHERE Id='" + txtNOrden.Text + "'";
                    SqlCommand CMD2 = new SqlCommand(CadSQL2, ObjC.Conexión);
                    ObjC.AbrirConexión();
                    SqlDataReader Registro2 = CMD2.ExecuteReader();
    
                    if(Registro2.Read() == true)
                    {
                        txtCategoria1.Text = Registro["Categoria"].ToString();
                        txtEquipo1.Text = Registro["Equipo"].ToString();
                        txtModelo1.Text = Registro["Modelo"].ToString();
                        txtFecha.Text = Registro["Fecha"].ToString();
                        txtFechaDe.Text = Registro["FechaR"].ToString();
                        lblFechaD.Text = "Fecha de Reparación";
                        txtMEquipos.Text = Registro["MEquipos"].ToString();
                        txtEquipos1.Text = Registro["NEquipos"].ToString();
                        txtEquipos2.Text = Registro["NEquipos1"].ToString();
                        txtEquipos3.Text = Registro["NEquipos2"].ToString();
                        txtEquipos4.Text = Registro["NEquipos3"].ToString();
                        txtSerial1a.Text = Registro["Serial1a"].ToString();
                        txtSerial2a.Text = Registro["Serial2a"].ToString();
                        txtSerial3a.Text = Registro["Serial3a"].ToString();
                        txtSerial4a.Text = Registro["Serial4a"].ToString();
                        txtSerial5a.Text = Registro["Serial5a"].ToString();
                        txtDescripción1a.Text = Registro["Descripción1a"].ToString();
                        txtDescripción2a.Text = Registro["Descripción2a"].ToString();
                        txtDescripción3a.Text = Registro["Descripción3a"].ToString();
                        txtDescripción4a.Text = Registro["Descripción4a"].ToString();
                        txtDescripción5a.Text = Registro["Descripción5a"].ToString();
                        txtCategoria2.Text = Registro["Categoria2"].ToString();
                        txtEquipo2.Text = Registro["Equipo2"].ToString();
                        txtModelo2.Text = Registro["Modelo2"].ToString();
                        txtSerial1b.Text = Registro["Serial1b"].ToString();
                        txtSerial2b.Text = Registro["Serial2b"].ToString();
                        txtSerial3b.Text = Registro["Serial3b"].ToString();
                        txtSerial4b.Text = Registro["Serial4b"].ToString();
                        txtSerial5b.Text = Registro["Serial5b"].ToString();
                        txtDescripción1b.Text = Registro["Descripción1b"].ToString();
                        txtDescripción2b.Text = Registro["Descripción2b"].ToString();
                        txtDescripción3b.Text = Registro["Descripción3b"].ToString();
                        txtDescripción4b.Text = Registro["Descripción4b"].ToString();
                        txtDescripción5a.Text = Registro["Descripción5b"].ToString();
                        txtCategoria3.Text = Registro["Categoria3"].ToString();
                        txtEquipo3.Text = Registro["Equipo3"].ToString();
                        txtModelo3.Text = Registro["Modelo3"].ToString();
                        txtSerial1c.Text = Registro["Serial1c"].ToString();
                        txtSerial2c.Text = Registro["Serial2c"].ToString();
                        txtSerial3c.Text = Registro["Serial3c"].ToString();
                        txtSerial4c.Text = Registro["Serial4c"].ToString();
                        txtSerial5c.Text = Registro["Serial5c"].ToString();
                        txtDescripción1c.Text = Registro["Descripción1c"].ToString();
                        txtDescripción2c.Text = Registro["Descripción2c"].ToString();
                        txtDescripción3c.Text = Registro["Descripción3c"].ToString();
                        txtDescripción4c.Text = Registro["Descripción4c"].ToString();
                        txtDescripción5c.Text = Registro["Descripción5c"].ToString();
                        txtCategoria4.Text = Registro["Categoria4"].ToString();
                        txtEquipo4.Text = Registro["Equipo4"].ToString();
                        txtModelo4.Text = Registro["Modelo4"].ToString();
                        txtSerial1d.Text = Registro["Serial1d"].ToString();
                        txtSerial2d.Text = Registro["Serial2d"].ToString();
                        txtSerial3d.Text = Registro["Serial3d"].ToString();
                        txtSerial4d.Text = Registro["Serial4d"].ToString();
                        txtSerial5d.Text = Registro["Serial5d"].ToString();
                        txtDescripción1d.Text = Registro["Descripción1d"].ToString();
                        txtDescripción2d.Text = Registro["Descripción2d"].ToString();
                        txtDescripción3d.Text = Registro["Descripción3d"].ToString();
                        txtDescripción4d.Text = Registro["Descripción4d"].ToString();
                        txtDescripción5d.Text = Registro["Descripción5d"].ToString();
                    }
                    else
                    {
                        MessageBox.Show("El número de orden no existe o está mal escrito. Verifíquelo e intentelo de nuevo.\n\nSi el problema persiste, comuníquese con el administrador.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        Registro2.Close();
                    }
                    Registro2.Close();
                    ObjC.CerrarConexión();
    
                }

    Pero al momento que le doy Click al Botón me sale esto:

    Sé que tengo que cerrar el DataReader para poder abrir el otro pero no sé donde ponerlo, espero puedan ayudarme


    Error con ReportViewer

    miércoles, 24 de abril de 2019 15:24

Respuestas

  • hola

    Pero estas poniendo la linea

     Registro.Close();

    si cierras el reader como esperas acceder a los datos?

    Si quieres algo desconetado usa un datatable

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 24 de abril de 2019 16:34
  • hola

    Pero estas poniendo la linea

     Registro.Close();

    si cierras el reader como esperas acceder a los datos?

    Si quieres algo desconetado usa un datatable

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    Hola

    else { Registro.Close(); <---- aquí lo estas cerrando string CadSQL2 = "SELECT * FROM ORevisiónSTR WHERE Id='" + txtNOrden.Text + "'"; SqlCommand CMD2 = new SqlCommand(CadSQL2, ObjC.Conexión); ObjC.AbrirConexión(); SqlDataReader Registro2 = CMD2.ExecuteReader(); if(Registro2.Read() == true) <--- por que haces un registro2? { txtCategoria1.Text = Registro["Categoria"].ToString(); <---- de aquí en adelante me preocupa tu manejo de memoria

    Quizá despues de cada reader quieras limpiar el buffer con el método dispose https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqldatareader.dispose?view=netframework-4.8, aunque ten en cuenta que tu SQL reader no lo estas inicializando correctamente y por lo tanto lo que guardas en tus objetos txtXXXCAC.txt quizá no sea lo que esperas me refiero a una cadena proveniente de la consulta en SQL

    https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqldatareader?view=netframework-4.8

    Gracias por usar los foros de MSDN.

    Pablo Sanchez
     ____

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.

    miércoles, 24 de abril de 2019 17:34
    Moderador
  • hola

    >>yo sé que lo estoy cerrando pero tengo dos SQLDataAdapter así que debo cerrar uno para abrir otro

    cerrar los SQLDataAdapter ? no sera los SqlDataReader

    puede tener mas de uno si habilitas MARS en el connection string

    Habilitar conjuntos de resultados activos múltiples

    saludos

    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 24 de abril de 2019 21:19

Todas las respuestas

  • hola

    Pero estas poniendo la linea

     Registro.Close();

    si cierras el reader como esperas acceder a los datos?

    Si quieres algo desconetado usa un datatable

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 24 de abril de 2019 16:34
  • hola

    Pero estas poniendo la linea

     Registro.Close();

    si cierras el reader como esperas acceder a los datos?

    Si quieres algo desconetado usa un datatable

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    Hola

    else { Registro.Close(); <---- aquí lo estas cerrando string CadSQL2 = "SELECT * FROM ORevisiónSTR WHERE Id='" + txtNOrden.Text + "'"; SqlCommand CMD2 = new SqlCommand(CadSQL2, ObjC.Conexión); ObjC.AbrirConexión(); SqlDataReader Registro2 = CMD2.ExecuteReader(); if(Registro2.Read() == true) <--- por que haces un registro2? { txtCategoria1.Text = Registro["Categoria"].ToString(); <---- de aquí en adelante me preocupa tu manejo de memoria

    Quizá despues de cada reader quieras limpiar el buffer con el método dispose https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqldatareader.dispose?view=netframework-4.8, aunque ten en cuenta que tu SQL reader no lo estas inicializando correctamente y por lo tanto lo que guardas en tus objetos txtXXXCAC.txt quizá no sea lo que esperas me refiero a una cadena proveniente de la consulta en SQL

    https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqldatareader?view=netframework-4.8

    Gracias por usar los foros de MSDN.

    Pablo Sanchez
     ____

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.

    miércoles, 24 de abril de 2019 17:34
    Moderador
  • Si, yo sé que lo estoy cerrando pero tengo dos SQLDataAdapter así que debo cerrar uno para abrir otro ¿Si me expliqué?

    Error con ReportViewer

    miércoles, 24 de abril de 2019 20:04
  • hola

    >>yo sé que lo estoy cerrando pero tengo dos SQLDataAdapter así que debo cerrar uno para abrir otro

    cerrar los SQLDataAdapter ? no sera los SqlDataReader

    puede tener mas de uno si habilitas MARS en el connection string

    Habilitar conjuntos de resultados activos múltiples

    saludos

    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 24 de abril de 2019 21:19