none
ExecuteNonQuery

    Pregunta

  • ayuda no se en que fallo.....
    Option Strict On
    Imports System.Data.OleDb
    Imports System.Data
    
    Public Class Form3
        Private Sub MATERIALESBindingNavigatorSaveItem_Click(sender As Object, e As EventArgs) Handles MATERIALESBindingNavigatorSaveItem.Click
            Me.Validate()
            Me.MATERIALESBindingSource.EndEdit()
            Me.TableAdapterManager.UpdateAll(Me.Mi_baseDataSet)
        End Sub
    
        Private Sub Form3_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Me.MATERIALESTableAdapter.Fill(Me.Mi_baseDataSet.MATERIALES)
        End Sub
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Using conn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source= D:\BASE DATOS\proyecto\proyecto\bin\Debug\mi base.accdb")
                conn.Open()
                Dim query As String = "INSERT INTO MATERIALES ([Nombres], [Medidas], [Peso], [Long], [Sup],[Corp], [Kam], [Pro], [Man], [Bau], [Mad], [Peris], [Fecha]) VALUES (@Nombres, @Medidas, @Peso, @Lon, @Sup, @Corp, @Kam, @Pro, @Man, @Bau, @Mad, @Peris, @Fecha)"
                Dim cmd As New OleDbCommand(query, conn)
                For Each row As DataGridViewRow In MATERIALESDataGridView.Rows
    
    
                    cmd.Parameters.Clear()
                    cmd.Parameters.AddWithValue("@Nombres", CStr(row.Cells("Nombres").Value))
                    cmd.Parameters.AddWithValue("@Medidas", Convert.ToString(row.Cells("Medidas").Value))
                    cmd.Parameters.AddWithValue("@Peso", Convert.ToString(row.Cells("Peso").Value))
                    cmd.Parameters.AddWithValue("@Long", Convert.ToString(row.Cells("Lon").Value))
                    cmd.Parameters.AddWithValue("@Sup", Convert.ToString(row.Cells("Sup").Value))
                    cmd.Parameters.AddWithValue("@Corp", Convert.ToString(row.Cells("Corp").Value))
                    cmd.Parameters.AddWithValue("@Kam", Convert.ToString(row.Cells("Kam").Value))
                    cmd.Parameters.AddWithValue("@Pro", Convert.ToString(row.Cells("Pro").Value))
                    cmd.Parameters.AddWithValue("@Man", Convert.ToString(row.Cells("Man").Value))
                    cmd.Parameters.AddWithValue("@Bau", Convert.ToString(row.Cells("Bau").Value))
                    cmd.Parameters.AddWithValue("@Mad", Convert.ToString(row.Cells("Mad").Value))
                    cmd.Parameters.AddWithValue("@Peris", Convert.ToString(row.Cells("Peris").Value))
                    cmd.Parameters.AddWithValue("@Fecha", Convert.ToString(row.Cells("Fecha").Value))
                    cmd.ExecuteNonQuery()
                    MsgBox("Los Cambios se Han Guardado Correctamente", MsgBoxStyle.Exclamation, "")
    
                    conn.Close()
                    conn.Dispose()
                Next
            End Using
        End Sub
    
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
            Me.Close()
        End Sub
    
        Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
            Me.MATERIALESTableAdapter.FillBy(Mi_baseDataSet.MATERIALES, NombresTextBox.Text)
        End Sub
    End Class
    

    ExecuteNonQuery requiere una Connection abierta y disponible. El estado actual de la conexión es cerrada.
    sábado, 31 de diciembre de 2016 9:48

Respuestas

  • Hola:

    Saca la conn.Close() y conn.Dispose() del bloque ForEach row ya que te la está cerrando al procesar el for.

    Si utilizas el método USING tal como lo estás haciendo, no es necesario que cierres la conexión, ya que el mismo cuando sales de el, te la cierra automáticamente.

    Un saludo.

    Gemma

    sábado, 31 de diciembre de 2016 10:21
  • si es update.... el autonumerico me tiraba error.... voy a probar tu solucion... graciasy feliz año nevo
    Si utilizas autonumérico deberías cambiar tu query por un update , me parece que es lo que intentas hacer.

    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala. Solo dejo en el foro mis post si fueron útiles , de lo contrario y por mantener el orden los borro. Saludos. Lima-Perú.

    sábado, 31 de diciembre de 2016 20:33
  • Hola, descargué tu proyecto no pude ejecutarlo , me salía un error que versión de visual studio utilizas,

    por lo que pude ver en la base de datos todos los campos son de tipo texto o cadena menos la fecha, con este código debería funcionar

      Private Sub btnGuardar_Click(sender As Object, e As EventArgs) Handles btnGuardar.Click
            Using conn As New OleDbConnection("Provider = Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\mi base.accdb;Persist Security Info=False;")
                conn.Open()
    
                Dim query As String = "INSERT INTO MATERIALES ([Nombres], [Medidas], [Peso], [Long], [Sup],[Corp], [Kam], [Pro], [Man], [Bau], [Mad], [Peris], [Fecha]) VALUES (@Nombres, @Medidas, @Peso, @Long, @Sup, @Corp, @Kam, @Pro, @Man, @Bau, @Mad, @Peris, @Fecha)"
                Dim cmd As New OleDbCommand(query, conn)
    
                For Each row As DataGridViewRow In dgvMateriales.Rows
    
                    cmd.Parameters.Clear()
    
                    cmd.Parameters.AddWithValue("@Nombres", Convert.ToString(row.Cells("Nombres").Value))
                    cmd.Parameters.AddWithValue("@Medidas", Convert.ToString(row.Cells("Medidas").Value))
                    cmd.Parameters.AddWithValue("@Peso", Convert.ToString(row.Cells("Peso").Value))
                    cmd.Parameters.AddWithValue("@Long", Convert.ToString(row.Cells("Lon").Value))
                    cmd.Parameters.AddWithValue("@Sup", Convert.ToString(row.Cells("Sup").Value))
                    cmd.Parameters.AddWithValue("@Corp", Convert.ToString(row.Cells("Corp").Value))
                    cmd.Parameters.AddWithValue("@Kam", Convert.ToString(row.Cells("Kam").Value))
                    cmd.Parameters.AddWithValue("@Pro", Convert.ToString(row.Cells("Pro").Value))
                    cmd.Parameters.AddWithValue("@Man", Convert.ToString(row.Cells("Man").Value))
                    cmd.Parameters.AddWithValue("@Bau", Convert.ToString(row.Cells("Bau").Value))
                    cmd.Parameters.AddWithValue("@Mad", Convert.ToString(row.Cells("Mad").Value))
                    cmd.Parameters.AddWithValue("@Peris", Convert.ToString(row.Cells("Peris").Value))
                    cmd.Parameters.AddWithValue("@Fecha", CheckDBNull(row.Cells("Fecha").Value))
                    cmd.ExecuteNonQuery()
                Next
            End Using
        End Sub
    
        Public Function CheckDBNull(fecha As Object) As Object
            If fecha Is DBNull.Value Then
                'Return DateTime.MinValue
                Return DBNull.Value
            Else
                Return DirectCast(fecha, DateTime)
            End If
        End Function

    pero no entiendo bien que tratas de hacer con ese código estas tratando de insertar en la bd las mismas filas que tienes ya pero con algún cambio que hagas

    Si lo que necesitas es hacer un update entonces te sugiero agregues un campo autonumerico a la base de datos lo cual es muy sencillo y hagas update por ese campo


    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala. Solo dejo en el foro mis post si fueron útiles , de lo contrario y por mantener el orden los borro. Saludos. Lima-Perú.

    sábado, 31 de diciembre de 2016 19:42

Todas las respuestas

  • Hola:

    Saca la conn.Close() y conn.Dispose() del bloque ForEach row ya que te la está cerrando al procesar el for.

    Si utilizas el método USING tal como lo estás haciendo, no es necesario que cierres la conexión, ya que el mismo cuando sales de el, te la cierra automáticamente.

    Un saludo.

    Gemma

    sábado, 31 de diciembre de 2016 10:21
  • ya esta lo hice tal cual pero finalizar la carga actualizacion de datos de la tabla... sale el cartel del

     MsgBox("Los Cambios se Han Guardado Correctamente", MsgBoxStyle.Exclamation, "")

    como 10 veces y despues .....

    Excepción no controlada del tipo 'System.Data.OleDb.OleDbException' en System.Data.dll
    Información adicional: No coinciden los tipos de datos en la expresión de criterios.

    señalando cmd.ExecuteNonQuery()


     
    sábado, 31 de diciembre de 2016 13:53
  • Hola, por lo que describes la actualización se realiza correctamente y falla en una de las filas ,ten en cuenta que por usar For Each row se actualizarán todas las filas de tu datagridview y no solo la que estás modificando actualmente,entonces en una de esas filas encuentra valores que no se corresponden con la definición de datos en la tabla de ACCESS,te sugeriría uitlizes un break point F9 y luego con F10 vayas recorreindo línea a línea tu programa para ver que valor le asignas aa los parémetros por ejemplo acá

    Convert.ToString(row.Cells("Peso").Value)

    breakpoint

    Otra cosa que puee estar pasando esque la última fila de tu datagridview este con las celdas en blanco,con lo que deberías de utilizar la propedad de los datagridview AllowUserToAddRows en false


    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala. Solo dejo en el foro mis post si fueron útiles , de lo contrario y por mantener el orden los borro. Saludos. Lima-Perú.


    • Editado Augusto1982 sábado, 31 de diciembre de 2016 15:17
    sábado, 31 de diciembre de 2016 15:12
  • lo hice tal cual .... cambie la propiedad del datagridview----- ahora recorri todos me fije q valor le asigne a cada parametroo..... ahora todos los parametros son iguales tanto en tabla de  access como en el formcode ....el  unico que cambia el datatimepicker de fecha.... el resto esta supestamente todo bien creo.... ya no se hace 2 meses que estoy vuelteando con esto... perdoon.... no s que hacer te  subo el proyecto puede ser???

    https://1drv.ms/u/s!AmtavNxyY_MkhVn_mRuwUImJxr0I


    • Editado pablonoc2017 sábado, 31 de diciembre de 2016 16:11
    sábado, 31 de diciembre de 2016 16:08
  • Hola, descargué tu proyecto no pude ejecutarlo , me salía un error que versión de visual studio utilizas,

    por lo que pude ver en la base de datos todos los campos son de tipo texto o cadena menos la fecha, con este código debería funcionar

      Private Sub btnGuardar_Click(sender As Object, e As EventArgs) Handles btnGuardar.Click
            Using conn As New OleDbConnection("Provider = Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\mi base.accdb;Persist Security Info=False;")
                conn.Open()
    
                Dim query As String = "INSERT INTO MATERIALES ([Nombres], [Medidas], [Peso], [Long], [Sup],[Corp], [Kam], [Pro], [Man], [Bau], [Mad], [Peris], [Fecha]) VALUES (@Nombres, @Medidas, @Peso, @Long, @Sup, @Corp, @Kam, @Pro, @Man, @Bau, @Mad, @Peris, @Fecha)"
                Dim cmd As New OleDbCommand(query, conn)
    
                For Each row As DataGridViewRow In dgvMateriales.Rows
    
                    cmd.Parameters.Clear()
    
                    cmd.Parameters.AddWithValue("@Nombres", Convert.ToString(row.Cells("Nombres").Value))
                    cmd.Parameters.AddWithValue("@Medidas", Convert.ToString(row.Cells("Medidas").Value))
                    cmd.Parameters.AddWithValue("@Peso", Convert.ToString(row.Cells("Peso").Value))
                    cmd.Parameters.AddWithValue("@Long", Convert.ToString(row.Cells("Lon").Value))
                    cmd.Parameters.AddWithValue("@Sup", Convert.ToString(row.Cells("Sup").Value))
                    cmd.Parameters.AddWithValue("@Corp", Convert.ToString(row.Cells("Corp").Value))
                    cmd.Parameters.AddWithValue("@Kam", Convert.ToString(row.Cells("Kam").Value))
                    cmd.Parameters.AddWithValue("@Pro", Convert.ToString(row.Cells("Pro").Value))
                    cmd.Parameters.AddWithValue("@Man", Convert.ToString(row.Cells("Man").Value))
                    cmd.Parameters.AddWithValue("@Bau", Convert.ToString(row.Cells("Bau").Value))
                    cmd.Parameters.AddWithValue("@Mad", Convert.ToString(row.Cells("Mad").Value))
                    cmd.Parameters.AddWithValue("@Peris", Convert.ToString(row.Cells("Peris").Value))
                    cmd.Parameters.AddWithValue("@Fecha", CheckDBNull(row.Cells("Fecha").Value))
                    cmd.ExecuteNonQuery()
                Next
            End Using
        End Sub
    
        Public Function CheckDBNull(fecha As Object) As Object
            If fecha Is DBNull.Value Then
                'Return DateTime.MinValue
                Return DBNull.Value
            Else
                Return DirectCast(fecha, DateTime)
            End If
        End Function

    pero no entiendo bien que tratas de hacer con ese código estas tratando de insertar en la bd las mismas filas que tienes ya pero con algún cambio que hagas

    Si lo que necesitas es hacer un update entonces te sugiero agregues un campo autonumerico a la base de datos lo cual es muy sencillo y hagas update por ese campo


    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala. Solo dejo en el foro mis post si fueron útiles , de lo contrario y por mantener el orden los borro. Saludos. Lima-Perú.

    sábado, 31 de diciembre de 2016 19:42
  • si es update.... el autonumerico me tiraba error.... voy a probar tu solucion... graciasy feliz año nevo
    sábado, 31 de diciembre de 2016 20:00
  • si es update.... el autonumerico me tiraba error.... voy a probar tu solucion... graciasy feliz año nevo
    Si utilizas autonumérico deberías cambiar tu query por un update , me parece que es lo que intentas hacer.

    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala. Solo dejo en el foro mis post si fueron útiles , de lo contrario y por mantener el orden los borro. Saludos. Lima-Perú.

    sábado, 31 de diciembre de 2016 20:33