none
Error al guartdar cambios de datagridview.

    Pregunta

  • Hola, buenas tardes.

    Me da el siguiente error al guardar los cambios efectuados en un datagridview (Insercción y modificación de datos):

    "No se controló System.InvalidOperationException"

    Llevo buscando soluciones y no la encuentro. Todas las que he encontrado no me han servido, por eso recurro a Vds.

    Imports System.Data
    Imports System.Data.SqlClient
    
    Public Class FUsuarios
    
        Dim vCommand As SqlCommand
        Dim vAdapter As SqlDataAdapter
        Dim vBuilder As SqlCommandBuilder
        Dim vDs As DataSet
        Dim vTable As DataTable
    
        Private Sub FUsuarios_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            TUsuario.Text = vusuario
            If vusuario = "ADMINISTRADOR" Then
                TSBNueva.Visible = True
                TSBAñadir.Visible = True
                TSBEliminar.Visible = True
                Panel3.Visible = True
                DataGridView1.Visible = True
                Using cnn As New  SqlConnection(AccesoBd.CadenaConexion)
                    Try
                        cnn.Open()
                        vCommand = New SqlCommand("pUsuarios", cnn)
                        vCommand.CommandType = CommandType.StoredProcedure
                        vAdapter = New SqlDataAdapter(vCommand)
                        vTable = New DataTable
                        vAdapter.Fill(vTable)
                        vBuilder = New SqlCommandBuilder(vAdapter)
                        vDs = New DataSet()
                        vAdapter.Fill(vDs, "USUARIOS")
                        vTable = vDs.Tables("USUARIOS")
       vCommand.ExecuteNonQuery()
                        'DataGridView1.Refresh()
                    Catch expSQL As SqlException
                        MsgBox(expSQL.ToString, MsgBoxStyle.OkOnly, "SQL Exception")
                    End Try
                End Using
                DataGridView1.DataSource = vDs.Tables("USUARIOS")
                DataGridView1.AutoGenerateColumns = False
                DataGridView1.ColumnHeadersVisible = True
                DataGridView1.Columns("PASSWORD").Visible = False
                DataGridView1.ReadOnly = True
                BGuardar.Enabled = False
                DataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect
    
    
            End If
        End Sub
    
    
        Private Sub BAñadir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BAñadir.Click
            DataGridView1.[ReadOnly] = False
            DataGridView1.AllowUserToAddRows = True
    
            BGuardar.Enabled = True
            BAñadir.Enabled = False
            BEliminar.Enabled = False
        End Sub
    
        Private Sub BGuardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BGuardar.Click
    
            Using cnn As New SqlConnection(AccesoBd.CadenaConexion)
                Try
                    cnn.Open()
                    Dim dt As DataTable = DirectCast(DataGridView1.DataSource, DataTable)
                    Dim dtTemp As DataTable = dt.GetChanges(DataRowState.Added Or DataRowState.Modified)
    
                If (dtTemp Is Nothing) Then Return
    
                    Dim dr As DialogResult = MessageBox.Show(
                          "¿Desea guardar los cambios?", "Guardar", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
    
                    If (dr = DialogResult.Yes) Then
                        vAdapter.Update(vTable)
                        DataGridView1.[ReadOnly] = True
                        BGuardar.Enabled = False
                        BAñadir.Enabled = True
                        BEliminar.Enabled = True
    
                    Else
                        '
                        dt.RejectChanges()
    
                    End If
                Catch expSQL As SqlException
                    MsgBox(expSQL.ToString, MsgBoxStyle.OkOnly, "SQL Exception")
    
                End Try
            End Using
    
        End Sub
    
    
      

    El error me da en la línea que resalto.

    If (dr = DialogResult.Yes) Then vAdapter.Update(vTable) DataGridView1.[ReadOnly] = True BGuardar.Enabled = False BAñadir.Enabled = True BEliminar.Enabled = True

    Gracias y saludos.


    viernes, 4 de noviembre de 2016 18:25

Respuestas

  • Hola:

    Cuando configuras el vAdapter, 'parece' que te falta configurarlo para actualización. Ten en cuenta, que estas usando una Stored Procedure para crear el SqlCommand y el SqlAdapter, te pongo comentarios en medio del código.

    ' Creas el SqlCommand con una Stored Procedure: OK
    vCommand = New SqlCommand("pUsuarios", cnn)
    vCommand.CommandType = CommandType.StoredProcedure
    
    ' Configuras el Adaptador según el SqlCommand: OK
    vAdapter = New SqlDataAdapter(vCommand)
    
    ' Cargas los datos en vTable. '
    ' Innecesario: luego los vuelves a cargar en el DataSet
    ' vTable = New DataTable
    ' vAdapter.Fill(vTable)
    
    ' Creas un CommandBuilder según el Adaptador: OK
    vBuilder = New SqlCommandBuilder(vAdapter)
    
    ' Cargas los datos en un DataSet y obtienes la vTable: OK
    vDs = New DataSet()
    vAdapter.Fill(vDs, "USUARIOS")
    vTable = vDs.Tables("USUARIOS")
    
    ' Innecesario de nuevo, los datos ya están cargados.
    ' vCommand.ExecuteNonQuery()
    
    ' PERO EN ESTE MOMENTO, vAdapter PARECE QUE NO ESTÁ CONFIGURADO correctamente para actualización
    ' Faltaría configurar .UPPDATECOMMAND /.DELETECOMMAND /.INSERTCOMMAND
    ' Deberías comprobarlo y configurarlo según vBuilder!!!

    Has de configurar el vAdapter con las instrucción de 'actualización' de la tabla, posiblemente el error sea debido a eso. 

    Un saludo



    lunes, 7 de noviembre de 2016 12:38

Todas las respuestas

  • Hola, 

    Yo te recomendaría que realices un obj donde realices el modelo de los datos

    Datatable vTable = New DataTable();

    dato = Obj.MetodoSQL(valor)

    vTable(dato);

    Saludos !!

    viernes, 4 de noviembre de 2016 18:49
  • Buenos días, ElihuENSR.

    Perdona que haya tardado tanto en contestar pero he estado haciendo pruebas a partir de tu recomendación y sigo con el error. Quizás lo haya puesto en el sitio equivocado ("donde realices el modelo de los datos"), aunque lo he probado en diferentes sitios.

    Te agradecería me aclarases exactamente donde debe ponerse ese código.

    Muchas gracias por tu contestación.

    Saludos.

    lunes, 7 de noviembre de 2016 10:28
  • Hola:

    Cuando configuras el vAdapter, 'parece' que te falta configurarlo para actualización. Ten en cuenta, que estas usando una Stored Procedure para crear el SqlCommand y el SqlAdapter, te pongo comentarios en medio del código.

    ' Creas el SqlCommand con una Stored Procedure: OK
    vCommand = New SqlCommand("pUsuarios", cnn)
    vCommand.CommandType = CommandType.StoredProcedure
    
    ' Configuras el Adaptador según el SqlCommand: OK
    vAdapter = New SqlDataAdapter(vCommand)
    
    ' Cargas los datos en vTable. '
    ' Innecesario: luego los vuelves a cargar en el DataSet
    ' vTable = New DataTable
    ' vAdapter.Fill(vTable)
    
    ' Creas un CommandBuilder según el Adaptador: OK
    vBuilder = New SqlCommandBuilder(vAdapter)
    
    ' Cargas los datos en un DataSet y obtienes la vTable: OK
    vDs = New DataSet()
    vAdapter.Fill(vDs, "USUARIOS")
    vTable = vDs.Tables("USUARIOS")
    
    ' Innecesario de nuevo, los datos ya están cargados.
    ' vCommand.ExecuteNonQuery()
    
    ' PERO EN ESTE MOMENTO, vAdapter PARECE QUE NO ESTÁ CONFIGURADO correctamente para actualización
    ' Faltaría configurar .UPPDATECOMMAND /.DELETECOMMAND /.INSERTCOMMAND
    ' Deberías comprobarlo y configurarlo según vBuilder!!!

    Has de configurar el vAdapter con las instrucción de 'actualización' de la tabla, posiblemente el error sea debido a eso. 

    Un saludo



    lunes, 7 de noviembre de 2016 12:38
  • Hola, buenas tardes.

    Efectivamente tenía mal configurado el vAdapter.

    Ahora me funciona bien.

    Muchas gracias y saludos.

    lunes, 14 de noviembre de 2016 14:10