Visual Basic.NET - Null Reference Exception

 
Vista:
sin imagen de perfil

Null Reference Exception

Publicado por Alberto (26 intervenciones) el 14/12/2021 05:59:08
Depués de llevar varios días intentando solucionarlo by myself y buscando por todos sitios recurro a vosotros a ver si me pudierais solucionar el problema que me tiene parado totalmente.
Estoy iniciando una aplicación en la que he puesto dos DataGridView que funcionan correctamente. Ahora quiero incorporar registros a la BD, lo he copiado de un curso on line donde funciona perfectamente, no a mí. En la línea que señalo con negrita me aparece el mensaje: "Excepción no controlada. System. Null Reference Exception. Referencia a objeto no establecida como instancia de un objeto. Cmd fue Nothing. Ver detalles". Al ver los detalles me aparece una lista de nombres y valores que no entiendo y donde puede estar la solución. Después de leer en varios sitios entiendo que el mensaje que recibo significa que uno de los campos o variables que intento manejar son Null. Pero no, todas la variables (VALUES) que intento INSERT INTO los campos tienen valores. Incluso he dado valores a campos que o no harían falta (como Id, que tiene en la BD "incremento automático ") o no procede (el campo fechall lo debería dejar en blanco tanto en INSERT INTO como en VALUES ya que es un valor para entrarlo posterirmente).

Dim Id As Integer
Dim etapa As String = ""
Dim Inv As String = ""
Dim importe As String = ""
Dim fechaor As String = ""
Dim plataforma As String = ""
Dim banco As String = ""
Dim fechall As String = ""
Dim situac As String = ""

id = 250
etapa = Me.txtEtapa.Text
Inv = Me.txtInv.Text
importe = Me.txtImporte.Text
fechaor = Me.txtFechaor.Text
plataforma = Me.txtPlataforma.Text
banco = Me.txtBanco.Text
fechall = Me.txtFechall.Text
situac = Me.txtSituac.Text
cmd.CommandType = CommandType.Text
cmd.Connection = conn
sql = "INSERT INTO etapa1(id, etapa, inv, importe, fechaor, plataforma, banco, fechall, situac) "
sql += "VALUES (" & id & ", ' " & etapa & " ' , ' " & Inv & " ', ' " & importe & " ' , ' " & fechaor & " ', ' " & plataforma & " ', ' " & banco & " ' , ' " & fechall & " ' ,' " & situac & " ')"
He intentado entrar las modificaciones que nuestro colega holandés indica como posible solución, pero no me admite las modificaciones que él propone.
El problema se me presenta en tiempo de ejecución. El programa se compila sin problemas y es al ejecutarlo cuando se para y no pasa el registro a la BD. Gracias por vuestra ayuda.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Null Reference Exception

Publicado por Phil Rob (1554 intervenciones) el 14/12/2021 08:01:45
Hola,

Si existe este mensaje de error sobre la línea cmd.CommandType, este es porqué no hace hecha ejecutada una linea como (según tu tipo de DB) :
1
Dim cmd As New ????Command

Quizá existe otro error que verás más tarde : si el campo Id es AutoIncrement, no puedes lo dar el valor en el INSERT. Pero este tiene nada a hacer con el mensaje de error actual.

Que tenga un buen día...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Null Reference Exception

Publicado por Alberto (26 intervenciones) el 14/12/2021 08:21:31
Gracias por tu respuesta, pero sí que tengo definido cmd

Public Class remesas
Public cmd As OleDb.OleDbCommand
Public sql As String = ""
Seguiré probando. Que tengas un buen día.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Null Reference Exception

Publicado por Phil Rob (1554 intervenciones) el 14/12/2021 09:31:40
Hola,

No es escrito NEW en tu código y no se crea la instancia :

Public Class remesas
Public cmd As NEW OleDb.OleDbCommand
Public sql As String = ""


Para el error "El campo es demasiado pequeño ...", ya he visto tu mensaje ayer pero no tengo idea ;

Utilizas una DB Access. Si quieres, puedes enviar tu proyecto con una parte de DB y miraré para depurar los errores.

...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil

Null Reference Exception

Publicado por Alberto (26 intervenciones) el 14/12/2021 09:02:26
A las 8'58.
Superado ese problema. El cambio que he hecho es poner ahora
Dim cmd as New oledb.oledbCommand.
Ahora me aparece una excepciòn: "El campo es demasiado pequeño ... linea 52". A ver si por ahí consigo finalmente siolucionarlo.
La linea 52 del nuevo problema es la primera después del Try
cmd.ExecuteNonQuery().
Ya queda menos, gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Null Reference Exception

Publicado por Alberto (26 intervenciones) el 14/12/2021 09:22:47
Creo que he dado con el problema. Los campos fechaor y fechall son date/hora y los estaba entrando como Texto que tiene dimensiones superiores a los date/hora. Espero solucionarlos por ahí.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Null Reference Exception

Publicado por Phil Rob (1554 intervenciones) el 14/12/2021 10:35:02
Texto y fecha, quizá existe problema de conversión.
Este una buena pista.
Cuando no funciona, puedes enviar, lo he dicho ya.

Buen trabajo...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Null Reference Exception

Publicado por Phil Rob (1554 intervenciones) el 14/12/2021 10:38:11
No he tenido tus códigos con línea 52 y código Try. ..
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Null Reference Exception

Publicado por Alberto (26 intervenciones) el 14/12/2021 18:27:34
Perdona que no te haya contestado antes, pero tenía citas médicas y me ha sido imposible. El mensaje "Null Reference Exception" ha desaparecido al poner el Dim As New.. que me indicaste.
Me han aparecido algunos errores de sintaxis que he solucionado y vuelve a aparecer lo de "El campo es demasiado pequeño...". Para mí está claro que el problema es que intento entrar un campo texto (desde el TextBox) en un campo que está definido como Date/Hora en la BD. En VB6.o hay una propiedad de los TextBox, DataFormat, que hace que lo que se entre en ese TextBox tengo el formato que interesa : No veo en Visual Studio esa propiedad en los TextBox. He intentado convertir un texto en fecha con CDate() para intentar hacerlo compatible con el campo de la BD, pero sin éxito. Ahí está el quid de la cuestión.
El error me lo da en la línea cmd.ExecuteNonQuery(). Sigo mirando everywhere esta cuestión de la conversión de texto en fecha pero sin éxito. Gracias en todo caso.

Dim importe As String = ""
Dim fechaor As DateTime = #3/1/2008#
Dim plataforma As String = ""
Dim banco As String = ""
Dim fechall As DateTime = #3/1/2008#
Dim situac As String = ""

id = 250
etapa = Me.txtEtapa.Text
Inv = Me.txtInv.Text
importe = Me.txtImporte.Text
fechaor = Me.txtFechaor.Text
plataforma = Me.txtPlataforma.Text
banco = Me.txtBanco.Text
fechall = Me.txtFechall.Text
situac = Me.txtSituac.Text

cmd.CommandType = CommandType.Text
cmd.Connection = conn
sql = "INSERT INTO etapa1(id, etapa, inv, importe, fechaor, plataforma, banco, fechall, situac) "
sql += "VALUES (" & id & ", ' " & etapa & " ' , ' " & Inv & " ', ' " & importe & " ' , ' " & CDate(fechaor) & " ' ,"
sql += " ' " & plataforma & " ', ' " & banco & " ' , ' " & CDate(fechall) & " ' ,' " & situac & " ')"
MsgBox(sql)
cmd.CommandText = sql
Try
cmd.ExecuteNonQuery()
MsgBox("Datos guardados")
Catch ex As Exception
MsgBox(ex.ToString)
End Try
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Null Reference Exception

Publicado por Phil Rob (1554 intervenciones) el 14/12/2021 21:38:43
Hola,

Comprendo porqué línea 52, primera línea tras try : este el momento donde se muestra el erro, este el momento de la ejecución del comando SQL.

Veo que en la frase SQL, pones blancos en mas alrededor des las variables Texto. No es bien. te propongo de los quitar. Mira la imagen :
Blanco

Atention que el campo Id es AutoIncrement. En este caso, si el valor 250 es ya dado al campo Id, este da un error. Te propongo aqui de hacer la frase SQL sin el ID (para probar) :
1
2
3
sql = "INSERT INTO etapa1(etapa, inv, importe, fechaor, plataforma, banco, fechall, situac) "
sql += "VALUES (" ' " & etapa & " ' , ' " & Inv & " ', ' " & importe & " ' , ' " & CDate(fechaor) & " ' ,"
sql += " ' " & plataforma & " ', ' " & banco & " ' , ' " & CDate(fechall) & " ' ,' " & situac & " ')"

Quizá el error sera siempre presente. En este caso, comprendemos que el error en otra parte.

Sobre los campos de fechas, te propongo de cambiar la estructura de la tabla y poner el tipo Text Corto, o String. Después, puedes escribir la frase SQL sin CDate :
1
sql = "INSERT INTO etapa1... ... ... ... ... ...  & importe & " ' , ' " & fechaor & " ' ," ... ... ... ... ... ... & banco & " ' , ' " & fechall & " ' ,' " & situac & " ')"

Quizá el error sera siempre presente. En este caso, comprendemos que el error en otra parte.

Para el formato de las fechas, existe ... ToString("dd/mm/yyyy") :
1
fechall = Me.txtFechall.Text.ToString("dd/mm/yyyy")

Tambien existe String.Format("{el formato}", ElValor) :
1
fechall = String.Format("{0:d}", CType(Me.txtFechall.Text, Date))

Comento que CDate es un metodo de conversion de VB6.0. Otro métodos existen en VB.Net, por ejemplo : CType(UnValorAConvertir, ElTipoQueTeGusta).

Tienes trabajo para probar.
Veré mañana si das me buenas nuevas.

Buenas noches ...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Null Reference Exception

Publicado por Phil Rob (1554 intervenciones) el 14/12/2021 23:04:21
Rápidamente ante ir dormir ...

Te propongo de empezar por quitar los blancos inútiles en la frase SQL.

Si tienes :

UnaValor = "QWERTY"

En la frase SQL, si escribes ... & "' " & UnaValor & " '" & ...
Este es como si UnaValor contiene " QWERTY ".

Este es un posible problema.

...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil

Null Reference Exception

Publicado por Alberto (26 intervenciones) el 15/12/2021 08:13:25
¡Al fin! la diferencia entre ' " & campo & " ' y '" & campo & "' era lo de "el campo es pequeño...". Ya no hay ninguna excepcion sino el simpático mensaje de "Mensaje incorporado". Alles Anfang ist schwer. Mil gracias por tu ayuda. Y feliz Navidad.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Null Reference Exception

Publicado por Phil Rob (1554 intervenciones) el 15/12/2021 08:47:32
Hola Alberto,

No comprendo alemán : "Alles Anfang ist schwer". Creo comprender en francés : "Tout début est difficile".
Como lo decir en español : "Todo inicio es difícil" ? Ja! ja! ja!

Estoy feliz que tu problema es solucionado.

Que tenga un buen día y feliz Navida a tu casa
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Null Reference Exception

Publicado por Alberto (26 intervenciones) el 15/12/2021 08:59:15
Para completar lo que he hecho: He omitido el campo ID, he cambiado en la BD los dos campos de fechas a texto con longitud 10 tratándolos como texto en todas partes y he puesto la MaxLength (en Comportamiento de Propiedades de todos los textBoxes) con idénticos valores a los que tienen en la BD, y especialmente y ha sido lo definitivo, he juntado comillas simples con comillas dobles. Gracias, de nuevo, hoy es un dia maravilloso, je.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar