none
Problema al actualizar base de datos SQL con modificaciones efectuadas en datagridview

    Pregunta

  • Hola, buenas noches.

    Al actualizar la base de datos con modificaciones efectuadas en datagridview me sale el siguientes error:

    "  Message=Falta DataColumn 'e_su_ID_S' en DataTable 'FACTURAS_RECIBIDAS' para SourceColumn 'e_su_ID_S'"

    La datatable la tengo con pocos campos para trabajarla mejor y me da la impresión de que para actualizar tiene que tener todos los campos. ¿Es correcto, tiene que tener todos los campos de la tabla de la base de datos?

    El código es el siguiente:

      Private Sub GuardarCambios(vStored As String, vTable As String)
            Dim dt As DataTable = DirectCast(DataGridView1.DataSource, DataTable)
            Try
                Using cnn As New SqlConnection(AccesoBd.CadenaConexion)
                    vCommand = New SqlCommand(vStored, cnn)
                    vCommand.CommandType = CommandType.StoredProcedure
                    vAdapter = New SqlDataAdapter(vCommand)
                    vBuilder = New SqlCommandBuilder(vAdapter)
                    vDs = New DataSet()
                    vAdapter.Fill(vDs, vTable)
                    vBuilder.QuotePrefix = "["
                    vBuilder.QuoteSuffix = "]"
                    vAdapter.InsertCommand = vBuilder.GetInsertCommand()
                    vAdapter.UpdateCommand = vBuilder.GetUpdateCommand()
                    vAdapter.DeleteCommand = vBuilder.GetDeleteCommand()
                    Dim n As Integer = vAdapter.Update(dt)
                    MessageBox.Show("Nº de registros afectados:   " & CStr(n))
                End Using
            Catch expSQL As SqlException
                Dim men As String
                If expSQL.Number = 2627 Then
                    If expSQL.Message.IndexOf("PRIMARY") <> -1 Then
                        men = "Error por intentar grabar valores duplicados en campos clave, corrija el problema y vuelva a intentar"
                    ElseIf expSQL.Message.IndexOf("UNIQUE") <> -1 Then
                        men = "Error por intentar grabar valores duplicados en campos de valores únicos, corrija el problema y vuelva a intentar"
                    Else
                        men = "Error general en la base de datos"
                    End If
                ElseIf expSQL.Number = 515 Then
                    men = "Algunos datos no han sido ingresados y son necesario para completar la operación, corrija el problema y vuelva a intentar"
                Else
                    men = "Error general en la base de datos"
                End If
                MsgBox(men)
            End Try
            If DataGridView1.ReadOnly = False Then
                DataGridView1.ReadOnly = True
            End If
        End Sub
    

    Si sería el caso, trabajar con todos los campos de una tabla grande en vez de con los necesarios sería un problema o no?

    Muchas gracias y saludos.

    viernes, 2 de diciembre de 2016 21:54

Respuestas

  • Hay dos partes: Tienes que pasar los datos a un DataTable y luego el DataTable se graba con un DataAdapter. Los campos del DataTable tienen que coincidir con los del DataAdapter. Pero los del DataAdapter no hace falta que sean todos los de la tabla de la base de datos, solo son obligatorios los que sean NOT NULL.

    Así que si en el DataTable vas a tener pocos campos, cerciórate de que construyes el DataAdapter solo con esos campos, es decir, si vas a usar el SqlCommandBuilder, asegúrate de que le pasas en el SelectCommand un "Select lista de campos from..." y no un "select * from ...". Evidentemente, esa "lista de campos" tiene que contener como mínimo todos los que sean NOT NULL.

    • Marcado como respuesta Ángelroso viernes, 2 de diciembre de 2016 22:31
    viernes, 2 de diciembre de 2016 22:07

Todas las respuestas

  • Hay dos partes: Tienes que pasar los datos a un DataTable y luego el DataTable se graba con un DataAdapter. Los campos del DataTable tienen que coincidir con los del DataAdapter. Pero los del DataAdapter no hace falta que sean todos los de la tabla de la base de datos, solo son obligatorios los que sean NOT NULL.

    Así que si en el DataTable vas a tener pocos campos, cerciórate de que construyes el DataAdapter solo con esos campos, es decir, si vas a usar el SqlCommandBuilder, asegúrate de que le pasas en el SelectCommand un "Select lista de campos from..." y no un "select * from ...". Evidentemente, esa "lista de campos" tiene que contener como mínimo todos los que sean NOT NULL.

    • Marcado como respuesta Ángelroso viernes, 2 de diciembre de 2016 22:31
    viernes, 2 de diciembre de 2016 22:07
  • Muchas gracias, Alberto.

    Problema solucionado siguiendo tus indicaciones.

    Saludos

    viernes, 2 de diciembre de 2016 22:31
  • Hola, Alberto.

    Es que no ha actualizado el primer registro. No sé si tendrá algo que ver con lo expuesto anteriormente.

    Gracias y saludos.

    viernes, 2 de diciembre de 2016 22:40