none
Accesar una tabla desde visual basic a acces RRS feed

  • Pregunta

  • Hola msetros, antes que nada un coordial saludo de su servidor. Pues ahora tengo este problemita: intento ingresar nuevos registros a una base de datos acces a travez de un datagridview creado en visual, pero me sale el siguiente error:

    Los cambios solicitados en la tabla no se realizaron correctamente porque crearían valores duplicados en el índice, clave principal o relación. Cambie los datos en el campo o los campos que contienen datos duplicados, quite el índice o vuelva a definir el índice para permitir entradas duplicadas e inténtelo de nuevo.

    El codigo es el siguiente:

    Imports System.Data.OleDb

    Public Class Form1
        Dim con As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\user\Desktop\Medicinas.accdb"
        Dim conexion As New OleDbConnection(con)
        Dim comand As New OleDbCommand
        Dim dt As New DataTable("Medicamentos y mas ")

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

            Dim filaid As New DataColumn
            filaid.DataType = System.Type.GetType("System.String")
            filaid.Unique = True
            filaid.ReadOnly = False

            dt.Columns.Add(filaid)

            Dim filamed As New DataColumn
            filaid.DataType = System.Type.GetType("System.String")
            filaid.Unique = False
            filaid.ReadOnly = False

            dt.Columns.Add(filamed)

            Dim filadosis As New DataColumn
            filaid.DataType = System.Type.GetType("System.String")
            filaid.Unique = False
            filaid.ReadOnly = False

            dt.Columns.Add(filadosis)

            Dim filapresio As New DataColumn
            filaid.DataType = System.Type.GetType("System.String")
            filaid.Unique = False
            filaid.ReadOnly = False

            dt.Columns.Add(filapresio)

            DataGridView1.DataSource = dt


        End Sub

           

     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

            If Not conexion.State = ConnectionState.Open Then
                conexion.Open()
            End If


            For i As Integer = 0 To DataGridView1.RowCount - 1 Step 1

                comand.Connection = conexion

                comand.CommandType = CommandType.Text

                comand.CommandText = "INSERT INTO Drogas(Id, Medicamento, Dosis, Precio) VALUES(@id, @medicamento, @dosis, @presio)"

                comand.Parameters.AddWithValue("@id", DataGridView1.Rows(i).Cells(0).ToString)
                comand.Parameters.AddWithValue("@medicamento", DataGridView1.Rows(i).Cells(1).ToString)
                comand.Parameters.AddWithValue("@dosis", DataGridView1.Rows(i).Cells(2).ToString)
                comand.Parameters.AddWithValue("@presio", DataGridView1.Rows(i).Cells(3).ToString)

                comand.ExecuteNonQuery()

            Next

            conexion.Close()




        End Sub

    Agradecere cualquier ayuda saludos

    • Cambiado Karen Malagón viernes, 24 de abril de 2015 21:35 Programming with Access
    viernes, 24 de abril de 2015 21:13

Todas las respuestas

  • El código en general está bien, y grabará en la base de datos la inforación que haya en el DataGrid. El problema es que si lo vuelves a ejecutar, grabará de nuevo la misma información otra vez, duplicándola en la base de datos. Y como la base de datos está configurada para que no acepte duplicados, se produce el error que estás viendo.

    El remedio, lógicamente, es no mandar a grabar los duplicados. En tu código no has metido nada para impedirlo, simplemente tienes un bucle que graba todo el grid a ciegas, sin comprobar si ya existía en la base de datos lo que vas a grabar. Tendrás que tomar una decisión sobre el funcionamiento de tu programa, a ver qué quieres hacer. Una solución típica (pero que podría no ser aplicable en tu caso, dependiendo de cómo quieras que se comporte) consiste en leer al principio desde la base de datos todos los registros a un DataTable, vincular ese datatable al grid, y dejar que el usuario haga cambios en el grid. El datatable hace el seguimiento de cuáles son los cambios nuevos y esos son los que graba.

    Si esa solución no te sirve, otra alternativa sería cambiar las instrucciones de grabación para que examinen uno por uno los registros que se graban, comprobando si ya existen o no antes de volverlos a grabar.

    sábado, 25 de abril de 2015 6:39
  • gracias pablo por tus comentarios tratare de hacer eso

    sábado, 25 de abril de 2015 19:09
  • y como le puedo hacer para hacer eso pablo, q instruccion puedo utilizar
    sábado, 25 de abril de 2015 19:56