Principales respuestas
ERROR "Object reference not set to an instance of an object"

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
- Editado Raimundo Ferrer jueves, 29 de junio de 2017 7:16 Dar mas datos
Respuestas
-
Hola, lo primero que te sugeriría es que pusieras un break point para ver en que punto exacto cae la aplicació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ú.
- Editado Augusto1982 jueves, 29 de junio de 2017 14:19
- Propuesto como respuesta Joyce_ACModerator jueves, 29 de junio de 2017 20:39
- Marcado como respuesta Raimundo Ferrer viernes, 30 de junio de 2017 7:24
-
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!
- Marcado como respuesta Raimundo Ferrer viernes, 30 de junio de 2017 7: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
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ú.
- Editado Augusto1982 jueves, 29 de junio de 2017 14:19
- Propuesto como respuesta Joyce_ACModerator jueves, 29 de junio de 2017 20:39
- Marcado como respuesta Raimundo Ferrer viernes, 30 de junio de 2017 7:24
-
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!
- Marcado como respuesta Raimundo Ferrer viernes, 30 de junio de 2017 7:24
-