none
ERROR "Object reference not set to an instance of an object" RRS feed

  • Pregunta

  • Hola

    Tengo el siguiente código en un formulario Web

    Protected Sub bt_Mostrar_Click(sender As Object, e As EventArgs) Handles bt_Mostrar.Click
            Dim da2 As SqlDataAdapter
            Dim ds2 As DataSet
    Try
    ds2 = New DataSet
    da2 = New SqlDataAdapter("SP_SQL_2008R2", Me.cnx)

    With da2
    .SelectCommand.CommandType = CommandType.StoredProcedure
    .SelectCommand.Parameters.Add(New SqlParameter("@FechaInicial", SqlDbType.VarChar, 10))
    .....

    .SelectCommand.Parameters("@dtp_FechaInicial").Value = FechaInicial.Text
    .....

    .SelectCommand.CommandTimeout = 1000
    .Fill(ds2)
    End With
    gridview1.DataSource = ds2.Tables(0)
    gridview1.DataBind()
    cnx.Close()
    btn_Exportar.Enabled = True
    Session("ds2") = ds2
    Catch ex As Exception
    Response.Write("<script language='javascript'>alert('Error en BBDDs')</script>")
    Finally
    cnx.Close()
    End Try

    Protected Sub btn_Exportar_Click(sender As Object, e As EventArgs) Handles btn_Exportar.Click
    Dim ds2 As DataSet = CType(Session("ds2"), DataSet)
    Using wb As New ClosedXML.Excel.XLWorkbook()
    Using dt As DataTable = ds2.Tables(0)
    wb.Worksheets.Add(dt)
    End Using
    Response.Clear()
    Response.Buffer = True
    Response.Charset = ""
    Response.ContentType = "application/vnd.ms-excel"
    Response.AddHeader("content-disposition", "attachment;filename=archivo.xlsx")
    Using MyMemoryStream As New MemoryStream()
    wb.SaveAs(MyMemoryStream)
    MyMemoryStream.WriteTo(Response.OutputStream)
    Response.Flush()
    Response.End()
    End Using
    End Using
    Session.RemoveAll()
    End Sub


    Como pueden ver con bt_Mostrar muestro en gridview1 el resultado de un procedimiento almacenado y con btn_Exportar exporto los datos a un archivo Excel. Todo funciona perfectamente a menos que pase un tiempo, que no he podido determinar con exactitud, entre el Click de ambos botones; es decir si lleno el GridView con bt_Mostrar y demoro un tiempo en dar el Click a btn_Exportar me sale el error "Object reference not set to an instance of an object", si doy otra vez bt_Mostrar e inmediatamente btn_Exportar todo funciona OK.

    Para que tengáis algo mas de información y aunque no es el foro adecuado algo similar me pasa en un formulario Windows que obtiene datos de la misma BBDDs y los muestra en un DataGrid, para un botón en específico que realiza acciones en la BBDDs cuando pasa un tiempo y se presiona sale el error

    System.NullReferenceException: Referencia a objeto no establecida como instancia de un objeto.
       en Monitor_De_Registros.FrmLocalizador.BtnAsignar_Click(Object sender, EventArgs e)
    ...........

    ¿ Alguna idea o sugerencia ?

    Muchas gracias de antemano y saludos


    jueves, 29 de junio de 2017 7:13

Respuestas

  • Hola, lo primero que te sugeriría es que pusieras un break point para ver en que punto exacto cae la aplicación

    Usar puntos de interrupción

    Lo otro es que las sessiones tienen un tiempo de duración , creo que el defecto es 20 minutos, si estás guardando la sesion y luego recuperándola

    Dim ds2 As DataSet = CType(Session("ds2"), DataSet)

    entonces entre el periodo de tiempo que mencionas quizás ya expiro, ciertamente esto no sería el problema que presentas en el desarrollo winforms solo en el web.

    El tiempo de caducidad de la sesion puede cambiarse en el web config

    Elemento <sessionstate></sessionstate>


    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala.Solo dejo mis respuestas en el foro si son votadas o respuesta, de lo contrario por mantener el orden las borro.Saludos. Lima-Perú.

    jueves, 29 de junio de 2017 14:18
  • Buen día:

    Antes que nada, espero te encuentres bien.

    Considero que puedes manejar otro tipo de variables en vez de Session.

    Veo que el objetivo, y corrígeme si no es así, es exportar los datos sin tener que volver a ejecutar tu consulta a la base de datos; retienes la información para utilizarla después.

    Entonces recomiendo que puedas utilizar algunas de estas opciones para retener los datos en tu variable:

    •    Puedes utilizar una variable declarada  dentro de la clase del formulario
    •    Puedes utilizar una variable static

    Y cada nueva busqueda se tendría que limpiar la variable

    Recomiendo también evaluar  primero si una variable es nula antes de utilizarla, para darle un tratamiento sin tener que utilizar tantas sentencias CATCH; un Ejemplo sería IF (Session("ds2") != null) o probar con isNothing.

    Por otro lado, observo que lo que requieres para realizar tu exportación a Excel es finalmente un objeto DataTable, así que el tipo de dato que sería más conveniente retener sería el DataTable. De cualquier forma también sería conveniente que evaluaras si el dataSet arrojó cuando menos una tabla en el resultado, con un count o con una comparación de si es diferente de nulo; porque puede pasar que el objeto dataset no sea nulo, pero al querer recuperar las tablas de la forma ds2.Tables (0), si no hay tablas, no existe el elemento 0 de la colección de tablas.

    Espero haberte sido de ayuda

    ¡Un cordial saludo!

    jueves, 29 de junio de 2017 16:24

Todas las respuestas

  • Hola, lo primero que te sugeriría es que pusieras un break point para ver en que punto exacto cae la aplicación

    Usar puntos de interrupción

    Lo otro es que las sessiones tienen un tiempo de duración , creo que el defecto es 20 minutos, si estás guardando la sesion y luego recuperándola

    Dim ds2 As DataSet = CType(Session("ds2"), DataSet)

    entonces entre el periodo de tiempo que mencionas quizás ya expiro, ciertamente esto no sería el problema que presentas en el desarrollo winforms solo en el web.

    El tiempo de caducidad de la sesion puede cambiarse en el web config

    Elemento <sessionstate></sessionstate>


    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala.Solo dejo mis respuestas en el foro si son votadas o respuesta, de lo contrario por mantener el orden las borro.Saludos. Lima-Perú.

    jueves, 29 de junio de 2017 14:18
  • Buen día:

    Antes que nada, espero te encuentres bien.

    Considero que puedes manejar otro tipo de variables en vez de Session.

    Veo que el objetivo, y corrígeme si no es así, es exportar los datos sin tener que volver a ejecutar tu consulta a la base de datos; retienes la información para utilizarla después.

    Entonces recomiendo que puedas utilizar algunas de estas opciones para retener los datos en tu variable:

    •    Puedes utilizar una variable declarada  dentro de la clase del formulario
    •    Puedes utilizar una variable static

    Y cada nueva busqueda se tendría que limpiar la variable

    Recomiendo también evaluar  primero si una variable es nula antes de utilizarla, para darle un tratamiento sin tener que utilizar tantas sentencias CATCH; un Ejemplo sería IF (Session("ds2") != null) o probar con isNothing.

    Por otro lado, observo que lo que requieres para realizar tu exportación a Excel es finalmente un objeto DataTable, así que el tipo de dato que sería más conveniente retener sería el DataTable. De cualquier forma también sería conveniente que evaluaras si el dataSet arrojó cuando menos una tabla en el resultado, con un count o con una comparación de si es diferente de nulo; porque puede pasar que el objeto dataset no sea nulo, pero al querer recuperar las tablas de la forma ds2.Tables (0), si no hay tablas, no existe el elemento 0 de la colección de tablas.

    Espero haberte sido de ayuda

    ¡Un cordial saludo!

    jueves, 29 de junio de 2017 16:24
  • Hola

    Muchas gracias Augusto e Ing.argama, tendré en cuenta vuestras sugerencias.

    Saludos

    viernes, 30 de junio de 2017 7:24