Foros del Web » Programación para mayores de 30 ;) » .NET »

[SOLUCIONADO] Problema Excepción BDNull

Estas en el tema de Problema Excepción BDNull en el foro de .NET en Foros del Web. Saludos a todos, tengo un pequeño problema que no logro solucionar. Estoy haciendo un pequeño programa en VB. NET con Visual Studio 2008 con una ...
  #1 (permalink)  
Antiguo 29/04/2013, 15:09
 
Fecha de Ingreso: marzo-2009
Ubicación: España
Mensajes: 371
Antigüedad: 15 años, 7 meses
Puntos: 5
Problema Excepción BDNull

Saludos a todos, tengo un pequeño problema que no logro solucionar.

Estoy haciendo un pequeño programa en VB. NET con Visual Studio 2008 con una bbdd en access 2007.

Tengo ya la primera parte terminada pero cuando lo ejecuto me salta una excepción con lo siguiente.

Cita:
La conversión del tipo 'BDNull' en el tipo 'Integer' no es válida.
Se que esto ocurre porque la bbdd está vacía, en cuando relleno una línea directamente en access ya no me da el error y funciona correctamente el preograma.

Podrían echarme una manos por favor.

El código que carga al abrir esa ventana y mostrar esa excepción es el siguiente:

Cita:
'Mostramos el siguiente ID que corresponde al usuario que estamos reguistrando
BD.Rellena("SELECT MAX(Id) FROM moviles", "IDF")

If BD.Dt.Tables("IDF").Rows.Count <> 0 Then
TbID.Text = (CStr(CInt(BD.Dt.Tables("IDF").Rows(0).Item(0)) + 1))
Else
TbID.Text = "1"
End If
Fila = -1
'Fin muestra del ID

'Carga DGV con moviles de la bbdd
BD.Dt.Tables("FR").Rows.Add(BD.Ds.Tables("FR").New Row())

BD.Rellena("SELECT * FROM moviles ORDER BY Id DESC", "FR")
Claro, el problema es que cuando ponga el programa para que se lo puedan descargar y usar le dará ese error a los usuarios y no es nada bonito ni profesional aunque sea gratis :(

Espero vuestra ayuda por favor.

Muchas gracias.
  #2 (permalink)  
Antiguo 30/04/2013, 01:23
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 10 meses
Puntos: 606
Respuesta: Problema Excepción BDNull

Si nos puedes indicar el fragmento de código en que usas DBNull y que te genera el error, te podremos ayudar mejor :)
__________________
Aviso: No se resuelven dudas por MP!
  #3 (permalink)  
Antiguo 30/04/2013, 12:49
Avatar de Thumper  
Fecha de Ingreso: agosto-2004
Ubicación: Jesús María - Lima - Perú
Mensajes: 270
Antigüedad: 20 años, 2 meses
Puntos: 6
Respuesta: Problema Excepción BDNull

Tu select ponlo así:

SELECT ISNULL(MAX(Id),0) FROM moviles

Saludos
__________________
Martín Alexis Valdivia S.
-----------------------------
"Quisiéramos cambiar el mundo, pero Dios no nos daría el código fuente." CAP
"Si Saber No Es Un Derecho, Seguro Será Un Izquierdo." WD
  #4 (permalink)  
Antiguo 01/05/2013, 04:21
 
Fecha de Ingreso: marzo-2009
Ubicación: España
Mensajes: 371
Antigüedad: 15 años, 7 meses
Puntos: 5
Respuesta: Problema Excepción BDNull

Gracias por la ayuda Thumper, sigue tirando error.

El error cuando le doy a guardar me salta aquí

Cita:
'INSERT, UPDATE y DELETE
Public Sub Ejecuta(ByVal Sql As String)
ClassConecta.Conecta()
Cm = New OleDbCommand(Sql, ClassConecta.Cs)
Cm.ExecuteNonQuery()
Cm.Dispose()
ClassConecta.Desconecta()
End Sub

Si le pongo el SELECT como me dijo Thumper me salta aquí.
Cita:
Public Sub Ejecuta(ByVal Sql As String)
ClassConecta.Conecta()
Cm = New OleDbCommand(Sql, ClassConecta.Cs)
Cm.ExecuteNonQuery()
Cm.Dispose()
ClassConecta.Desconecta()
End Sub
Y yo pienso que está en el botón guardar el problema, aquí se los dejo.
Cita:
'Inserta en la BBDD
BD.Ejecuta("INSERT INTO imei VALUES ('" & TbID.Text & "', '" & CbMarca.Text & "', '" & TbModelo.Text & "', '" & TbColor.Text & "', '" & TbSn.Text & "', '" & TbImei.Text & "', '" & TbOperador.Text & "')")


'Limpia campos después de guardar
ModFuncImei.LimpiaImei()
CbMarca.SelectedIndex = 0

BD.Rellena("SELECT MAX(Id) FROM imei", "IDF")

'Carga de nuevo el DGV con el nuevo imei
If BD.Dt.Tables("IDF").Rows.Count <> 0 Then
TbID.Text = (CStr(CInt(BD.Dt.Tables("IDF").Rows(0).Item(0)) + 1))
Else
TbID.Text = "1"
End If
Fila = -1
'Fin muestra del ID

'Carga DGV con imeis de la bbdd
BD.Dt.Tables("FR").Rows.Add(BD.Ds.Tables("FR").New Row())

BD.Rellena("SELECT * FROM imei ORDER BY Id DESC", "FR")
Saludos y gracias por la ayuda
  #5 (permalink)  
Antiguo 01/05/2013, 08:55
 
Fecha de Ingreso: noviembre-2011
Ubicación: Huancayo
Mensajes: 70
Antigüedad: 13 años
Puntos: 6
Respuesta: Problema Excepción BDNull

Hola,
en el caso de los DataGridView a mi me paso un monton de veces
lo que puedes hacer es usar la prop.

datagridview.rows[].Cells[].Value == BDNull.Value

comparalo asi si quieres hacer validaciones


Saludos
__________________
________________
CompuInicio.com
Iniciando Bien . . .
  #6 (permalink)  
Antiguo 01/05/2013, 11:10
 
Fecha de Ingreso: marzo-2009
Ubicación: España
Mensajes: 371
Antigüedad: 15 años, 7 meses
Puntos: 5
Respuesta: Problema Excepción BDNull

El error sigue aunque quite el DGV.

Al guardar e insertar en la bbdd me explota y me marca la siguiente linea:

Cita:
Cm.ExecuteNonQuery()
  #7 (permalink)  
Antiguo 01/05/2013, 19:48
 
Fecha de Ingreso: mayo-2013
Ubicación: Chaco, Argentina
Mensajes: 45
Antigüedad: 11 años, 6 meses
Puntos: 3
Respuesta: Problema Excepción BDNull

Hola Naz, ¿me permites llamarte así?

Con respecto a tu problema, te comento, por experiencia propia, que los DBNull son re problemáticos, es difícil depurarlos.

Personalmente he tenido muchos inconvenientes con DBNull, especialmente cuando de TEXTBOXES se trata.

Me parece que el problema puede estar en la línea

Cita:
Código:
BD.Ejecuta("INSERT INTO imei VALUES ('" & TbID.Text & "', '" & CbMarca.Text & "', '" & TbModelo.Text & "', '" & TbColor.Text & "', '" & TbSn.Text & "', '" & TbImei.Text & "', '" & TbOperador.Text & "')")
Pienso que alguno de esos textboxes (yo los prefijo con txt) queda sin rellenar, tú te preguntarás por qué el visual toma la cadena vacía como DBNull y deduzco que primero convierte el NullString en DBNull y luego intenta la conversión DBNull en Integer y allí salta el error ¿por qué visual no hace la conversión a cero automáticamente? eso me gustaría saber.

Fijate los campos de la tabla imei cuyo tipo de dato es INTEGER o ENTERO
Una solución que puedes implementar es la siguiente:
colocar un "0" a la izquierda de todos los textboxes numéricos, o bien usar el método PadLeft:

Opción 1: "0" & txtNumero.text
Opción 2: txtNumero.text.padleft(1, "0")

más info acerca de PadLeft en:

[URL="EL LINK NO SE VISUALIZA COMO LINK"]http://msdn.microsoft.com/es-es/library/92h5dc07(v=vs.80).aspx[/URL]

Código:
He tratado de corregir la apariencia del enlace, pero no hay forma, el foro agrega automáticamente la etiqueta "noparse" 
http://msdn.microsoft.com/es-es/library/92h5dc07(v=vs.80).aspx
Me gustaría saber qué hace la función BD.Rellena, tal vez allí esté el problema.

Otra línea que tal vez esté generando el error puede ser
Código:
TbID.Text = (CStr(CInt(BD.Dt.Tables("IDF").Rows(0).Item(0)) + 1))
Para evitar este error se debe verificar antes de asignar el valor al textbox:

Código:
If Not BD.Dt.Tables("IDF").Rows(0).isnull(0) Then
	TbID.Text = BD.Dt.Tables("IDF").Rows(0).item(0).tostring
End If
Más info acerca de IsNull en:

Código HTML:
[noparse][URL="EL LINK NO SE VISUALIZA COMO LINK"]http://msdn.microsoft.com/en-us/library/system.data.datarow.isnull.aspx[/URL][/noparse]
Código:
He tratado de corregir la apariencia del enlace, pero no hay forma
http://msdn.microsoft.com/en-us/library/system.data.datarow.isnull.aspx
Espero haberte ayudado.

Saludos cordiales.

Última edición por javidotnet; 02/05/2013 a las 15:00 Razón: La etiqueta URL no se visualizaba por la etiqueta noparse
  #8 (permalink)  
Antiguo 02/05/2013, 16:47
 
Fecha de Ingreso: marzo-2009
Ubicación: España
Mensajes: 371
Antigüedad: 15 años, 7 meses
Puntos: 5
Respuesta: Problema Excepción BDNull

Hola.

He realizado los cambios como me dijiste pero nada, sigue haciendo lo mismo.

A ver, si la bbdd está vacía da ese error pero si esto

Cita:
'Mostramos el siguiente ID que corresponde al usuario que estamos reguistrando
BD.Rellena("SELECT MAX(Id) FROM moviles", "IDF")

If BD.Dt.Tables("IDF").Rows.Count <> 0 Then
TbID.Text = (CStr(CInt(BD.Dt.Tables("IDF").Rows(0).Item(0)) + 1))
Else
TbID.Text = "1"
End If
Fila = -1
'Fin muestra del ID
Lo cambio por esto7

Cita:
'Mostramos el siguiente ID que corresponde al usuario que estamos reguistrando
BD.Rellena("SELECT MAX(Id) FROM moviles", "IDF")

If BD.Dt.Tables("IDF").Rows.Count = 0 Then
TbID.Text = (CStr(CInt(BD.Dt.Tables("IDF").Rows(0).Item(0)) + 1))
Else
TbID.Text = "1"
End If
Fila = -1
'Fin muestra del ID
Ya no da error, introduce bien los datos en la bbdd y funciona correctamente pero!!

Al cerrar el programa y abrirlo de nuevo falla, el ID ya no aparece el que debería si no el "1" cuando a lo mejor debería ser el 40 porque hay 39 artículos dentro de la bbdd.

Pero si en la bbdd antes de usar el programa por primera vez yo inserto un artículo directamente en access y lo dejo así

Cita:
'Mostramos el siguiente ID que corresponde al usuario que estamos reguistrando
BD.Rellena("SELECT MAX(Id) FROM moviles", "IDF")

If BD.Dt.Tables("IDF").Rows.Count <> 0 Then
TbID.Text = (CStr(CInt(BD.Dt.Tables("IDF").Rows(0).Item(0)) + 1))
Else
TbID.Text = "1"
End If
Fila = -1
'Fin muestra del ID
Todo va correctamente y nunca falla pero no es plan de regalar un programa y que tengan que hacer esa chapuza pienso yo.

No se si me explico a veces me lio un poco.
  #9 (permalink)  
Antiguo 02/05/2013, 19:29
 
Fecha de Ingreso: mayo-2013
Ubicación: Chaco, Argentina
Mensajes: 45
Antigüedad: 11 años, 6 meses
Puntos: 3
Respuesta: Problema Excepción BDNull

Hola Naz

Que buena descripción hiciste, te felicito, se va aclarando el panorama, ahora entiendo un poco más y creo que di en la tecla:

para solucionar tenés que reemplazar el operador relacional "distinto de" (<>), por el "mayor que"(>), en la sentencia If, así:

Código:
If BD.Dt.Tables("IDF").Rows.Count > 0 Then
Espero que con eso se solucione.

En caso que no funcione, entonces por favor, con tu bbdd vacía, inserta las siguientes líneas de código, inmediatamente después de BD.Rellena...

Código:
MessageBox.Show(BD.Dt.Tables("IDF").Rows.Count.tostring)
MessageBox.Show(BD.Dt.Tables("IDF").Rows(0).Item(0).tostring)
y que te quede así:

Código:
'Mostramos el siguiente ID que corresponde al usuario que estamos reguistrando
BD.Rellena("SELECT MAX(Id) FROM moviles", "IDF")

MessageBox.Show(BD.Dt.Tables("IDF").Rows.Count.tostring)
MessageBox.Show(BD.Dt.Tables("IDF").Rows(0).Item(0).tostring)

If BD.Dt.Tables("IDF").Rows.Count <> 0 Then
       TbID.Text = (CStr(CInt(BD.Dt.Tables("IDF").Rows(0).Item(0)) + 1))
Else
       TbID.Text = "1"
End If
Fila = -1
'Fin muestra del ID
y cuéntame qué resultado arrojan los messageboxes, reitero con tu bbdd vacía

Saludos cordiales.
  #10 (permalink)  
Antiguo 03/05/2013, 00:34
 
Fecha de Ingreso: marzo-2009
Ubicación: España
Mensajes: 371
Antigüedad: 15 años, 7 meses
Puntos: 5
Respuesta: Problema Excepción BDNull

Hola Javi, el > ya lo había provado y nada incluso >= y tampoco.

Al poner el msbox me saltan dos, el primero da "1" y el segundo nada se queda en blanco.

Saludos.
  #11 (permalink)  
Antiguo 03/05/2013, 18:04
 
Fecha de Ingreso: mayo-2013
Ubicación: Chaco, Argentina
Mensajes: 45
Antigüedad: 11 años, 6 meses
Puntos: 3
Respuesta: Problema Excepción BDNull

Cita:
Iniciado por NazCarLpa Ver Mensaje
Hola Javi, el > ya lo había provado y nada incluso >= y tampoco.

Al poner el msbox me saltan dos, el primero da "1" y el segundo nada se queda en blanco.

Saludos.
Hola Naz

¡¡ Ya solucionamos el problema !!

según lo que me dices, el error está aquí (lo marco en rojo y negrita):

Código:
'Mostramos el siguiente ID que corresponde al usuario que estamos reguistrando
BD.Rellena("SELECT MAX(Id) FROM moviles", "IDF")

If BD.Dt.Tables("IDF").Rows.Count <> 0 Then
TbID.Text = (CStr(CInt(BD.Dt.Tables("IDF").Rows(0).Item(0)) + 1))
Else
TbID.Text = "1"
End If
Fila = -1
'Fin muestra del ID
Lo que me parece extraño es que no lo hayas podido solucionar con el código que te pasé en mi primer respuesta:

Cita:
Otra línea que tal vez esté generando el error puede ser

Código:
TbID.Text = (CStr(CInt(BD.Dt.Tables("IDF").Rows(0).Item(0)) + 1))
Para evitar este error se debe verificar antes de asignar el valor al textbox:

Código:
If Not BD.Dt.Tables("IDF").Rows(0).isnull(0) Then
	TbID.Text = BD.Dt.Tables("IDF").Rows(0).item(0).tostring
End If
Por favor, prueba de nuevo con el código que te voy a pasar a continuación y luego me cuentas:

Código:
'Mostramos el siguiente ID que corresponde al usuario que estamos reguistrando
BD.Rellena("SELECT MAX(Id) FROM moviles", "IDF")

If TypeOf BD.Dt.Tables("IDF").Rows(0).Item(0) Is DBNull then
    TbID.Text = "1"
Else
    TbID.Text = (CStr(CInt(BD.Dt.Tables("IDF").Rows(0).Item(0)) + 1))
End If
Fila = -1
'Fin muestra del ID
El If que estaba antes lo saqué del código porque siempre hay una fila en la tabla "IDF" que es resultado de "SELECT MAX(Id) FROM moviles"

Por lo tanto lo que se debe comprobar es si la función MAX() devuelve un valor nulo (DBNull) o un número, y por eso ese nuevo If:
Código:
If TypeOf BD.Dt.Tables("IDF").Rows(0).Item(0) Is DBNull then
Con esto debería desaparecer el error "La conversión del tipo 'DBNull' al tipo Integer no es válida."

Asimismo, existe otra solución, más elegante aún, que consiste en lo que dijo Thumper:

Cita:
Tu select ponlo así:

SELECT ISNULL(MAX(Id),0) FROM moviles

Saludos
aunque hay que corregirla para que no de error, y la corrección que propongo es la siguiente:

Código:
SELECT IIF(ISNULL(MAX(ID)),0,MAX(ID)) FROM moviles
entonces la solución quedaría así:

Código:
'Mostramos el siguiente ID que corresponde al usuario que estamos reguistrando
BD.Rellena("SELECT IIF(ISNULL(MAX(ID)),0,MAX(ID)) FROM moviles", "IDF")

TbID.Text = CStr(CInt(BD.Dt.Tables("IDF").Rows(0).Item(0)) + 1)

Fila = -1
'Fin muestra del ID
Como puedes ver nos ahorramos el if

Resumiendo, hay dos opciones de solución:
1ra. opción:
Código:
'Mostramos el siguiente ID que corresponde al usuario que estamos reguistrando
BD.Rellena("SELECT MAX(Id) FROM moviles", "IDF")

If TypeOf BD.Dt.Tables("IDF").Rows(0).Item(0) Is DBNull then
    TbID.Text = "1"
Else
    TbID.Text = (CStr(CInt(BD.Dt.Tables("IDF").Rows(0).Item(0)) + 1))
End If
Fila = -1
'Fin muestra del ID
2da. opción:
Código:
'Mostramos el siguiente ID que corresponde al usuario que estamos reguistrando
BD.Rellena("SELECT IIF(ISNULL(MAX(ID)),0,MAX(ID)) FROM moviles", "IDF")

TbID.Text = CStr(CInt(BD.Dt.Tables("IDF").Rows(0).Item(0)) + 1)

Fila = -1
'Fin muestra del ID
Espero que puedas solucionar todo y me cuentes cuál opción te convence más.

De todas formas, avísame cualquier cosa que no puedas solucionar, trataremos de encontrarle solución.

Saludos cordiales.

Última edición por javidotnet; 03/05/2013 a las 18:09
  #12 (permalink)  
Antiguo 04/05/2013, 03:28
 
Fecha de Ingreso: marzo-2009
Ubicación: España
Mensajes: 371
Antigüedad: 15 años, 7 meses
Puntos: 5
Respuesta: Problema Excepción BDNull

Hola Javi, funcionanó a la perfección!!!, utilicé el if aunque las dos funcionan perfectamente, MUCHÍSIMAS GRACIAS! ya puedo seguir con el programita a ver si logro terminar el beta y se lo empiezo a pasar a algunos amigos que como yo coleccionan teléfonos móviles jeje.

Una pregunta, hay alguna manera de bloquear la bbdd access para que el usuario cuando vaya a abrirla no pueda manipularla y sólo se pueda por medio del programa?

Un saludo y mil gracias a todos por las ayudas prestadas.

P.D: Como podréis ver tengo poca idea ya que sólo llevo un par de meses programando en vb .net y a ratitos debido al poco tiempo que tengo por mi trabajo.

Etiquetas: bd, net, vb, visual
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:46.