none
¿Cómo pongo nombre a un formulario con datos que tengo en SQL? RRS feed

  • Pregunta

  • Hola antes de nada

    Lo que necesito es hacer que el formulario muestre como nombre un conjunto de parámetros que tengo en mi base de datos SQL. Lo he probado en CS y funciono, pero cuando trato de hacerlo en VB.NET no me da lo que necesito, es como si no encontrara lo que le mando a buscar. 

    Este es el código que uso:

            Dim Mifuncion As New Funcion
            Dim MyDatareader As SqlDataReader
            MyDatareader = Nothing
            Try
                Mifuncion.con.Open()
                Dim StrCmd = New SqlCommand("Select * from Compania", Mifuncion.con)
                StrCmd.ExecuteReader()
                If MyDatareader.HasRows Then
                    While (MyDatareader.Read)
                        Me.Text = "Facturación: " + Mifuncion.MyDatareader("E_Nombre").ToString() + " " + Mifuncion.MyDatareader("EID_impuesto").ToString() + ""
                    End While
                End If
            Catch ex As Exception
                Me.Text = "Sin ID de impuesto"
            Finally
                Mifuncion.con.Close()
            End Try
        End Sub

    Si es algún error en el código señálenmelo por favor, me seria de mucha ayuda


    Panda Codes


    • Editado Panda Codes miércoles, 7 de abril de 2021 14:19
    • Cambiado EricRR miércoles, 7 de abril de 2021 18:09 SQL
    miércoles, 7 de abril de 2021 14:17

Respuestas

  • Fíjate que primero declaras MyDataReader pero luego nunca lo asignas. Simplemente llamas a StrCmd.ExecuteReader, pero el resultado que te devuelve no se lo asignas a MyDataReader.

    Por lo tanto, MyDataReader siempre vale Nothing, y da inmediatamente un error en cuanto que llamas a cualquiera de sus miembros. Concretamente, te dará un error de "Referencia a Objeto no establecida" en cuanto que llames a MyDataReader.HasRows. Desgraciadamente has puesto un Catch que intercepta la excepción y no hace nada para decirte cuál ha sido la excepción, sino que simplemente dice "Sin ID de impuesto". Esto es una mala práctica, porque siempre que haya un error te va a decir eso mismo, y entonces no te enteras de cuál ha sido el error.

    Aparte de eso, hay otra cosa que no queda clara, y es la llamada a MiFuncion.con. MiFuncion está recién instanciada y nunca le metes nada en con. Vale, puede ser que lo haga internamente a través del constructor o que sea un método estático, pero no queda claro en el código llamante.

    Después otro problema es que dentro del While llamas a Mifuncion.MyDatareader. Pero Mifuncion es una variable local recién instanciada. El MyDataReader al que tienes que acceder es el de la instancia actual, no es el que está dentro de la instancia referenciada por Mifuncion. Esto también te generará un error una vez superados los anteriores.

    • Marcado como respuesta Panda Codes miércoles, 7 de abril de 2021 22:01
    miércoles, 7 de abril de 2021 17:48

Todas las respuestas

  • Fíjate que primero declaras MyDataReader pero luego nunca lo asignas. Simplemente llamas a StrCmd.ExecuteReader, pero el resultado que te devuelve no se lo asignas a MyDataReader.

    Por lo tanto, MyDataReader siempre vale Nothing, y da inmediatamente un error en cuanto que llamas a cualquiera de sus miembros. Concretamente, te dará un error de "Referencia a Objeto no establecida" en cuanto que llames a MyDataReader.HasRows. Desgraciadamente has puesto un Catch que intercepta la excepción y no hace nada para decirte cuál ha sido la excepción, sino que simplemente dice "Sin ID de impuesto". Esto es una mala práctica, porque siempre que haya un error te va a decir eso mismo, y entonces no te enteras de cuál ha sido el error.

    Aparte de eso, hay otra cosa que no queda clara, y es la llamada a MiFuncion.con. MiFuncion está recién instanciada y nunca le metes nada en con. Vale, puede ser que lo haga internamente a través del constructor o que sea un método estático, pero no queda claro en el código llamante.

    Después otro problema es que dentro del While llamas a Mifuncion.MyDatareader. Pero Mifuncion es una variable local recién instanciada. El MyDataReader al que tienes que acceder es el de la instancia actual, no es el que está dentro de la instancia referenciada por Mifuncion. Esto también te generará un error una vez superados los anteriores.

    • Marcado como respuesta Panda Codes miércoles, 7 de abril de 2021 22:01
    miércoles, 7 de abril de 2021 17:48
  • Muchísimas gracias.

    En el caso de MiFuncion.con ahí llamo la base de datos. Lo que pasa es que la tengo en una clase aparte para no tener que escribir la cadena cada vez que necesite abrir la base de datos en algún formulario.

    El nombre de la clase es Funcion y el con es la cadena de conexión de la base de datos. Si notas apenas de abre el Try dice: MiFuncion.con.Open() y cuando entra el Finaly: MiFuncion.con.Close()

    Lo hago así porque a base de módulos y clases agiliza bastante el programa


    Panda Codes

    miércoles, 7 de abril de 2021 22:20
  • Bien, eso da lugar a otro posible error que podría estar ocurriendo: Si la cadena de conexión (o el servidor) está mal, se producirá una excepción al llamar a MiFuncion.con.Open(), y como está en el Try...Catch presentará el mismo error "Sin ID de impuesto". Por lo que, una vez más, llegamos a la conclusión de que interceptar los errores de esta manera nos deja sin información suficiente para averiguar qué es lo que está sucediendo.
    jueves, 8 de abril de 2021 6:29