Error referencia a objeto no establecida como instancia de un objeto

Me sale este error al guardar los campos de un datagridview guarda los datos pero me aparece el error mencionado referencia a objeto no establecida como instancia de un objeto en la consulta que inserta los datos quisiera eliminar ese error

Mi código es el siguiente

Dim i As Object
i = New Object

Try
For i = 0 To Me.DataGridView1.Rows.Count - 1
Dim consulta As String = "insert into gnomina(CodNom,noemp,sd,codigo,descrip,gravado,excento) VALUES('" & Me.DataGridView1.Rows(i).Cells("Column1").Value.ToString & _
"','" & Me.DataGridView1.Rows(i).Cells("Column2").Value.ToString & "','" & Me.DataGridView1.Rows(i).Cells("Column3").Value.ToString & _
"','" & Me.DataGridView1.Rows(i).Cells("Column4").Value.ToString & "','" & Me.DataGridView1.Rows(i).Cells("Column5").Value.ToString & _
"','" & Me.DataGridView1.Rows(i).Cells("Column6").Value & "','" & Me.DataGridView1.Rows(i).Cells("Column7").Value & "')"
If con.State = ConnectionState.Open Then
con.Close()
End If
con.Open()
Dim comando As New OleDb.OleDbCommand(consulta, con)
Dim DR As OleDbDataReader = comando.ExecuteReader
MsgBox("REGISTRO GUARDADO")
Next
Catch ex As Exception
MsgBox(ex.Message)
End Try

La parte en negrita es donde se detiene cuando sale el error

Espero alguien me pueda ayudar con alguna sugerencia, el datagridview no esta enlazado a la bd

Es visual studio 2010 y access 2010

2 Respuestas

Respuesta
1

Hay muchas maneras de hacer eso pero la mejor es usar parámetros, ya que la BD hace los cast's correctos.

Respuesta
2

Puede ser que algún campo que deba contener un tipo de dato no compatible con NULL (No Nullable) esté vacío y al llamar al método "ToString" no hay un valor para convertir a string, yo quitaría el ToString, o validar que todos los campos contengan algún dato, aunque sea CERO.

gracias por tu pronta respuesta, ya realice tu sugerencia de quitar el Tostring y valide que todos los campos tiene un dato y continua saliendo el mismo error 

Como comento si guarda los datos pero quisiera que no saliera ese error

Gracias saludos

Mmmm es raro, córrelo paso a paso con F8 para que veas exactamente en cual línea se detiene, y esta parte no debería ir:

Dim DR As OleDbDataReader = comando.ExecuteReader

Deberías usar solo:

Comando. ExecuteNonQuery

te agradezco tu respuesta ya realice lo que me sugeriste y continua con el mismo mensaje

al quitar try cast se detiene en la primera fila de la consulta 

y aparece colum1 y colum2 nothing pero si tienen datos 

Saludos gracias

¿Puedes poner un ScreenShot del Datagrid para ver los datos? y la ultima prueba la hiciste quitando el ToString?

si quite el Tostring y disculpa como pongo un ScreenShot

Gracias

Teniendo en pantalla lo que quieres poner en el ScreenShot, presiona la tecla "Imprimir Pantalla" debería estar al lado derecho de la tecla F12, con esto se copia lña pantalla al portapapeles y lo pegas en Paint, lo guardas y al responder aquí, presiona el primer botón de las herramientas es para subir una imagen, la seleccionas y listo

Disculpa como que ando un poco saturada con esto y por un momento no entendí que me pedías

Así es como esta el datagridview

Gracias

Pero no tiene ningún dato el DataGrid, solo tiene una fila vacía

Las columnas como se ven, en las propiedades la primera que es Codnom = Column1 y así sucesivamente

Ah ya vi, está en tiempo diseño, me refería a cuando quieres guardar los datos, ya en tiempo de ejecución

Creo que ya vi el error, en tu código haces referencia a las Columnas como "Column1", "Column2" etc... pero en el ScreenShot dice "CodNom", "NoEmp" etc... podrías en lugar de el nombre poner el índice, osea el número de la columna, empezando de Cero.

intentare lo que me indicas 

gracias

Realice lo que me indicaste quedo así

Try
For i = 0 To Me.DataGridView1.Rows.Count - 1
Dim consulta As String = "insert into gnomina(CodNom,noemp,sd,codigo,descrip,gravado,excento) VALUES('" & Me.DataGridView1.Rows(i).Cells(0).Value & _
"','" & Me.DataGridView1.Rows(i).Cells(1).Value & "','" & Me.DataGridView1.Rows(i).Cells(2).Value & _
"','" & Me.DataGridView1.Rows(i).Cells(3).Value & "','" & Me.DataGridView1.Rows(i).Cells(4).Value & _
"','" & Me.DataGridView1.Rows(i).Cells(5).Value & "','" & Me.DataGridView1.Rows(i).Cells(6).Value & "')"
If con.State = ConnectionState.Open Then
con.Close()
End If
con.Open()
Dim comando As New OleDb.OleDbCommand(consulta, con)
comando.ExecuteNonQuery()
MsgBox("REGISTRO GUARDADO")
Next
Catch ex As Exception
MsgBox(ex.Message)
End Try

pero ahora me manda otro error y me guarda otros datos en las casillas marcadas

Gracias

Sin la Base de Datos es difícil saber, pero imagino que el Primer dato es numérico, quizá sea eso ya que en tu código al poner los valores de la Sentencia SQL, le pones los ' en el primer valor y si es numérico no debería llevar esas comillas simples.

Revisando mi consulta me hacia falta un campo, ya se guardan donde deben los datos pero me manda el mensaje de error de

Si guarda los datos pero sale este error y ya no me deja agregar un nuevo registro

Si realizo lo que me comentas de le pones los ' en el primer valor y si es numérico no debería llevar esas comillas simples.

Me manda el siguiente error

el codigo quedaria asi si hago lo que me sugeriste

Dim consulta AsString = "insert into gnomina(CodNom,noemp,sd,codigo,tipo,descrip,gravado,excento) VALUES(" & Me.DataGridView1.Rows(i).Cells(0).Value & _

",'" & Me.DataGridView1.Rows(i).Cells(1).Value & "','" & Me.DataGridView1.Rows(i).Cells(2).Value & _

"','" & Me.DataGridView1.Rows(i).Cells(3).Value & "','" & Me.DataGridView1.Rows(i).Cells(4).Value & _

"','" & Me.DataGridView1.Rows(i).Cells(5).Value & "','" & Me.DataGridView1.Rows(i).Cells(6).Value & _

"','" & Me.DataGridView1.Rows(i).Cells(7).Value & "')"

mi base de datos esta asi

Te agradezco de antemano la atención prestada y ojala y pudieras ayudarme con este ultimo detalle que seria la consulta para el guardado ya sin mensajes de error

Gracias Saludos y Excelente día

Es que le quitaste las comillas simples (') a todos los valores, y debes quitarlos sólo a los campos numéricos, todos los campos deben coincidir con los tipos de datos, para evitar esto podrías usar parámetros, un OleDbParameter por cada valor y agregar los parámetros a la colección de Parámetros, un método completo sería algo así:

Sub Insertar(col1 As Object, col2 As Object)
        Dim _connStr As String = "Cadena de Conexión"
        Dim _sql As String = "INSERT INTO Tabla (Col1, Col2) VALUES (@Col1, @Col2"
        Using conn As New OleDb.OleDbConnection(_connStr)
            Using comm As New OleDb.OleDbCommand(_sql, conn)
                comm.Parameters.Add(New OleDb.OleDbParameter("Col1", col1))
                comm.Parameters.Add(New OleDb.OleDbParameter("Col2", col2))
                If conn.State = ConnectionState.Closed Then conn.Open()
                comm.ExecuteNonQuery()
            End Using
        End Using
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas