none
Error al momento de exportar informacion de Datagridview a base de datos en sql server con VB.NET RRS feed

  • Pregunta

  • Hola a todos les agradezco mucho su atencion, tengo un datagridview en donde importe una tabla de excel y ahora intento guardar la misma tabla en sql server pero al intentarlo me sale en siguiente error:

    SqlException was unhandled

    An unhandled exception of type 'System.Data.SqlClient.SqlException' occurred in System.Data.dll

    Additional information: Column name or number of supplied values does not match table definition.

    El codigo que utilizo en el boton de guardado es el siguiente:

     Private Sub btnGuardar_Click(sender As Object, e As EventArgs) Handles btnGuardar.Click
    
            btnGuardar.Enabled = False
            Application.DoEvents()
    
            Dim cn As New SqlConnection("Data Source=PLAN08ANALISTA3;Initial Catalog=DBESTIMTJ;Integrated Security=True")
            cn.Open()
    
            Dim cm As New SqlCommand
    
            With cm
                .Connection = cn
                For i As Integer = 0 To DataGridView_vistaprevia.RowCount - 1
                    .CommandText = "insert into ocupacion_visua values ('" & DataGridView_vistaprevia.Rows(i).Cells(0).Value & "','" & DataGridView_vistaprevia.Rows(i).Cells(1).Value & "')"
                    .ExecuteNonQuery()
    
    
                Next
            End With
    
            cm.Dispose()
            cm = Nothing
            With cn
                .Close()
                .Dispose()
    
            End With
            cn = Nothing
    
            MsgBox("Done", MsgBoxStyle.Information, "Info")
    
            btnGuardar.Enabled = True
    
        End Sub

    Estoy trabajando con visual basic.net, una disculpa no tengo mucha experiencia espero que puedan ayudarme.

    martes, 5 de abril de 2016 18:09

Respuestas

  • Hola,

    No deberías poner así tu consulta, prueba poniendo los nombres a las columnas.

       With cmd
                For i As Integer = 0 To DataGridView_vistaprevia.RowCount - 1
                    .Parameters.Clear()
                    .CommandText = "insert into ocupacion_visua (columna1, columna2) values (@param1, @param2)"
                    .Parameters.AddWithValue("@param1", Convert.ToString(DataGridView_vistaprevia.Rows(i).Cells(0).Value))
                    .Parameters.AddWithValue("@param2", Convert.ToString(DataGridView_vistaprevia.Rows(i).Cells(1).Value))
                    .ExecuteNonQuery()
                Next
            End With

    Saludos.


    JC NaupaCrispín

    • Marcado como respuesta Vilag martes, 5 de abril de 2016 20:19
    • Desmarcado como respuesta Vilag martes, 5 de abril de 2016 20:19
    • Marcado como respuesta Vilag martes, 5 de abril de 2016 20:19
    martes, 5 de abril de 2016 18:30
  • Hola,

    Como sabes cuando escribes en un TextBox, este te permite escribir 32767 caracteres, lo cual puede ser un problema cuando tienes un campo con valor determinado (varchar(20)), por eso te recomendaría asignarle.

    .MaxLength = miValorDeCaracteresMaximo

    .MaxLength = 20

    Eso lo puedes poner en tiempo de diseño o si deseas por código, asignarlos en el Load.

    Impidiendo así que el usuario escriba "demás".

    Saludos.



    JC NaupaCrispín

    • Marcado como respuesta Vilag martes, 5 de abril de 2016 20:45
    • Desmarcado como respuesta Vilag martes, 5 de abril de 2016 20:46
    • Marcado como respuesta Vilag martes, 5 de abril de 2016 20:46
    martes, 5 de abril de 2016 20:38

Todas las respuestas

  • Hola,

    No deberías poner así tu consulta, prueba poniendo los nombres a las columnas.

       With cmd
                For i As Integer = 0 To DataGridView_vistaprevia.RowCount - 1
                    .Parameters.Clear()
                    .CommandText = "insert into ocupacion_visua (columna1, columna2) values (@param1, @param2)"
                    .Parameters.AddWithValue("@param1", Convert.ToString(DataGridView_vistaprevia.Rows(i).Cells(0).Value))
                    .Parameters.AddWithValue("@param2", Convert.ToString(DataGridView_vistaprevia.Rows(i).Cells(1).Value))
                    .ExecuteNonQuery()
                Next
            End With

    Saludos.


    JC NaupaCrispín

    • Marcado como respuesta Vilag martes, 5 de abril de 2016 20:19
    • Desmarcado como respuesta Vilag martes, 5 de abril de 2016 20:19
    • Marcado como respuesta Vilag martes, 5 de abril de 2016 20:19
    martes, 5 de abril de 2016 18:30
  • Hola JC NaupaCrispín agradezco mucho tu ayuda, hice lo que me dijiste y me sigue saliendo error la unica diferencia es que en la informacion adicional de error dice lo siguiente: String or binary data would be truncated.

    aqui el error:

    SqlException was unhandled

    An unhandled exception of type 'System.Data.SqlClient.SqlException' occurred in System.Data.dll

    Additional information: String or binary data would be truncated.

    Este es el código modificado.

    Private Sub btnGuardar_Click(sender As Object, e As EventArgs) Handles btnGuardar.Click
    
            btnGuardar.Enabled = False
            Application.DoEvents()
    
            Dim cn As New SqlConnection("Data Source=PLAN08ANALISTA3;Initial Catalog=DBESTIMTJ;Integrated Security=True")
            cn.Open()
    
            Dim cm As New SqlCommand
    
            With cm
                .Connection = cn
                For i As Integer = 0 To DataGridView_vistaprevia.RowCount - 1
                    .Parameters.Clear()
                    .CommandText = "insert into ocupacion_visua (fecha, aforador, estado_tiempo, observaciones, via_de_estudio, sentido_carril, cruce, ruta, num_economico, hora_paso, nivel_ocupacion, tipo_vehiculo) values (@param1, @param2, @param3, @param4, @param5, @param6, @param7, @param8, @param9, @param10, @param11, @param12)"
                    .Parameters.AddWithValue("@param1", Convert.ToString(DataGridView_vistaprevia.Rows(i).Cells(0).Value))
                    .Parameters.AddWithValue("@param2", Convert.ToString(DataGridView_vistaprevia.Rows(i).Cells(1).Value))
                    .Parameters.AddWithValue("@param3", Convert.ToString(DataGridView_vistaprevia.Rows(i).Cells(2).Value))
                    .Parameters.AddWithValue("@param4", Convert.ToString(DataGridView_vistaprevia.Rows(i).Cells(3).Value))
                    .Parameters.AddWithValue("@param5", Convert.ToString(DataGridView_vistaprevia.Rows(i).Cells(4).Value))
                    .Parameters.AddWithValue("@param6", Convert.ToString(DataGridView_vistaprevia.Rows(i).Cells(5).Value))
                    .Parameters.AddWithValue("@param7", Convert.ToString(DataGridView_vistaprevia.Rows(i).Cells(6).Value))
                    .Parameters.AddWithValue("@param8", Convert.ToString(DataGridView_vistaprevia.Rows(i).Cells(7).Value))
                    .Parameters.AddWithValue("@param9", Convert.ToString(DataGridView_vistaprevia.Rows(i).Cells(8).Value))
                    .Parameters.AddWithValue("@param10", Convert.ToString(DataGridView_vistaprevia.Rows(i).Cells(9).Value))
                    .Parameters.AddWithValue("@param11", Convert.ToString(DataGridView_vistaprevia.Rows(i).Cells(10).Value))
                    .Parameters.AddWithValue("@param12", Convert.ToString(DataGridView_vistaprevia.Rows(i).Cells(11).Value))
                    .ExecuteNonQuery()
    
    
    
    
                    '.CommandText = "insert into ocupacion_visua values ('" & DataGridView_vistaprevia.Rows(i).Cells(0).Value & "','" & DataGridView_vistaprevia.Rows(i).Cells(1).Value & "')"
                    '.ExecuteNonQuery()
    
    
                Next
            End With
    
            cm.Dispose()
            cm = Nothing
            With cn
                .Close()
                .Dispose()
    
            End With
            cn = Nothing
    
            MsgBox("Done", MsgBoxStyle.Information, "Info")
    
            btnGuardar.Enabled = True
    
    
    
        End Sub

    Saludos

    martes, 5 de abril de 2016 18:46
  • Ya encontré el error que gracias a la recomendación de JC NaupaCrispín y con un poco de investigación pude solucionar, la solución que me propuso JC NaupaCrispín me ayudo a solucionar uno de los errores que después mostró otro error que tenia "String or binary data would be truncated" investigando un poco encontré que este error puede aparecer porque uno de los datos que intentamos guardar tiene mas caracteres que los establecidos en el campo en la tabla de  sql server lo único que hice fue incrementar mi campo donde tenia el error de varchar(20) a varchar(50) en la tabla de sql server, con esto me ha funcionado lo comparto por si alguien lo necesita. El código que me funciono es el mismo que compartí por segunda ocasión aplicando la corrección de JC NaupaCrispín.

    Saludos

    martes, 5 de abril de 2016 20:29
  • Hola,

    Como sabes cuando escribes en un TextBox, este te permite escribir 32767 caracteres, lo cual puede ser un problema cuando tienes un campo con valor determinado (varchar(20)), por eso te recomendaría asignarle.

    .MaxLength = miValorDeCaracteresMaximo

    .MaxLength = 20

    Eso lo puedes poner en tiempo de diseño o si deseas por código, asignarlos en el Load.

    Impidiendo así que el usuario escriba "demás".

    Saludos.



    JC NaupaCrispín

    • Marcado como respuesta Vilag martes, 5 de abril de 2016 20:45
    • Desmarcado como respuesta Vilag martes, 5 de abril de 2016 20:46
    • Marcado como respuesta Vilag martes, 5 de abril de 2016 20:46
    martes, 5 de abril de 2016 20:38
  • Muchísimas gracias, lo aplicare a mis textbox esto me ayudara a evitar muchos problemas de captura.

    agradezco tu amable atención JC NaupaCrispin

    Saludos

    martes, 5 de abril de 2016 20:48
  • me pueden ayudar es qu nose porque mesale el mismo erro en est codigo

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Data.SqlClient;



    namespace WindowsFormsApplication1


       class datos_nn
      {
                public static int guardar(datos pdatos)
            {
                int retorno=0;
                  using (SqlConnection conn= sql_nn.obtenerConexion())
                  {
                      SqlCommand comando = new SqlCommand(string.Format("insert into datos(nombre,telefono.dirrecion,edad,genero)values('{0}','{1}','{2}','{3}'))",
                          pdatos.nombre, pdatos.telefono, pdatos.direccion, pdatos.edad, pdatos.genero), conn);

                    retorno = comando.ExecuteNonQuery();
                      }

                    return retorno;

              }

    agradezco su ayuda

    jueves, 7 de abril de 2016 15:02