none
Visua Basic con base de datos en Access RRS feed

  • Pregunta

  • Saludos, cual sería el codigo ideal para una conexión entre una aplicación creada en Windows form ( Visual Basic 2012) y una base de datos en Access(2013). La base de datos tiene una tabla llamada Table1 y columnas llamadas, ID, número de lote, cavidad 1, cavidad 2, cavidad 3, cavidad 4. La aplicación tiene los mismos campos en texbox y un botón para activarlo (sin código) y quisiera que cuando yo escriba la información en la forma de visual basic y le de al botón se guarde en Accsess. Ya tengo todo el proceso de enlace con la base de datos y está en el proyecto(en el server explorer y veo las tablas con sus nombres) lo que me falta es el código para que ejecute, gracias adelantadas.
    sábado, 5 de diciembre de 2015 14:43

Todas las respuestas

  • Hola sortiz55,

    ¿Conoces de ADO Net?, necesitas un bloque de código que permita la inserción según el proveedor de datos (en este caso Access)

    Private Sub btnInsertarAccess_Click(sender As Object, e As EventArgs)
    	Dim cadenaConexion As String = "CADENA_DE_CONEXION"
    
    	Using cn As New OleDbConnection(cadenaConexion)
    		Dim instruccionSQL As String = "INSERT INTO Table1 (ID, NumLote, Cavidad1) VALUES (?, ?, ?)"
    
    		Using cmd As New OleDbCommand(instruccionSQL, cn)
    			cmd.Parameters.AddWithValue("@ID", txtID.text)
                            cmd.Parameters.AddWithValue("@NumLote", txtNumLote.text)
    			cmd.Parameters.AddWithValue("@Cavidad1", txtCavidad1.text)			     
    
    			cn.Open()
    
    			cmd.ExecuteNonQuery()
    		End Using
    	End Using
    End Sub

    En caso el campo [ID]  sea autonumerico no es necesario nombrarlo en la lista de inserción. Si las columnas tienen un carácter de espacio en blanco entre las palabras no olvides usar un carácter de delimitación: [Cavidad 1]


    sábado, 5 de diciembre de 2015 15:06
  • Saludos Williams Morales, me indica este error.

    Format of the initialization string does not conform to specification starting at index 0.

    sábado, 5 de diciembre de 2015 18:35
  • Hola sortiz55,

    ¿En qué línea te marca la excepción?

    sábado, 5 de diciembre de 2015 18:38
  •   Using cn As New Odbc.OdbcConnection(cadenaConexion)
    sábado, 5 de diciembre de 2015 18:58
  • ¿La variable cadenaConexion tiene un valor valido de cadena de conexión para el origen de datos?

    Dim cadenaConexion As String = "CADENA_DE_CONEXION"

    Yo le puse una cadena de texto, pero tu debería colocar la cadena de conexión que permite comunicarse con tu origen de datos.

    sábado, 5 de diciembre de 2015 19:02
  • El codigo quedó así, solo le borre el botón pues ya lo tiene.

     Public Sub btnPorcientodebb_Click(sender As Object, e As EventArgs) Handles btnPorcientodebb.Click
            Dim cadenaConexion As String = "CADENA_DE_CONEXION"

            Using cn As New Odbc.OdbcConnection(cadenaConexion)
                Dim instruccionSQL As String = "INSERT INTO Table1 (ID, Numero de Lote, Cavidad 1, Cavidad 2, Cavidad 3, Cavidad 4) VALUES (?, ?, ?)"

                Using cmd As New Odbc.OdbcCommand(instruccionSQL, cn)
                    cmd.Parameters.AddWithValue("@ID", txtID.text)
                    cmd.Parameters.AddWithValue("@Numero deLote", txtNumerodelote.Text)
                    cmd.Parameters.AddWithValue("@Cavidad 1", txtbbCavidad1.Text)
                    cmd.Parameters.AddWithValue("@Cavidad 2", txtbbCavidad2.Text)
                    cmd.Parameters.AddWithValue("@Cavidad 3", txtbbCavidad3.Text)
                    cmd.Parameters.AddWithValue("@Cavidad 4", txtbbCavidad4.Text)

                    cn.Open()

                    cmd.ExecuteNonQuery()
                End Using
            End Using
        End Sub

    sábado, 5 de diciembre de 2015 19:03
  • O sea, solo le modifique las partes del formulario mío.

    Como los textbox mios y el código del botón a utilizar.



    • Editado sortiz55 sábado, 5 de diciembre de 2015 19:08
    sábado, 5 de diciembre de 2015 19:05
  • C:\Users\Samuel Ortiz\Documents\Visual Studio 2012\Projects\Porciento de BB solucion (v4)\Porciento de BB\Datos de BB.accdb

    Algo así ?

    sábado, 5 de diciembre de 2015 19:11
  • Hola,

    Pero no estás colocando una cadena de conexión válida, ya te lo mencione en el comentario anterior:

    Dim cadenaConexion As String = "COLOCAR_AQUÍ_LA_CADENA_DE_CONEXION"

    También te comente que cuando tengas nombres de objetos con caracteres de espacio en blanco entre las palabras deberás delimitar el nombre del objeto con corchetes o comillas simples, el código final debería quedarte de la siguiente manera:

    Public Sub btnPorcientodebb_Click(sender As Object, e As EventArgs) Handles btnPorcientodebb.Click
            Dim cadenaConexion As String = "COLOCAR_AQUÍ_LA_CADENA_DE_CONEXION"
    
            Using cn As New OleDbConnection(cadenaConexion)
                Dim instruccionSQL As String = "INSERT INTO Table1 (ID, [Numero de Lote], [Cavidad 1], [Cavidad 2], [Cavidad 3], [Cavidad 4]) VALUES (?, ?, ?, ?, ?, ?)"
    
                Using cmd As New OleDbCommand(instruccionSQL, cn)
                    cmd.Parameters.AddWithValue("@ID", txtID.text)
                    cmd.Parameters.AddWithValue("@NumerodeLote", txtNumerodelote.Text)
                    cmd.Parameters.AddWithValue("@Cavidad1", txtbbCavidad1.Text)
                    cmd.Parameters.AddWithValue("@Cavidad2", txtbbCavidad2.Text)
                    cmd.Parameters.AddWithValue("@Cavidad3", txtbbCavidad3.Text)
                    cmd.Parameters.AddWithValue("@Cavidad4", txtbbCavidad4.Text)
    
                    cn.Open()
    
                    cmd.ExecuteNonQuery()
                End Using
            End Using
        End Sub

    OJO, utiliza un proveedor de datos de acorde con el origen, ¿Por qué haces uso de Odbc? si ocupas Ms-Access deberías usar OleDb como proveedor de datos.

    sábado, 5 de diciembre de 2015 19:17
  • C:\Users\Samuel Ortiz\Documents\Visual Studio 2012\Projects\Porciento de BB solucion (v4)\Porciento de BB\Datos de BB.accdb

    Algo así ?

    No, esa no es una cadena de conexión, por favor mayor empeño si esto se trata de tu profesión!

    Una cadena de conexión es conjunto de atributos que permiten comunicar con un origen de datos, algo como:

    Dim cadenaConexion As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Directorio\NombreArchivo.accdb; Persist Security Info=False;"

    Reemplaza los valores bajo tu escenario

    sábado, 5 de diciembre de 2015 19:20
  • Disculpa Williams, soy apenas estudiante y estoy comenzando en esto. Lo estoy arreglando poco a poco.
    sábado, 5 de diciembre de 2015 19:26
  • Ya aquel errror dejo de salir con los cambios a los valores.

    Ahora en este,    cmd.ExecuteNonQuery()

    Sale,   No value given for one or more required parameters.

    sábado, 5 de diciembre de 2015 19:54
  • Actualmente así

         Dim cadenaConexion As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Samuel Ortiz\Documents\Visual Studio 2012\Projects\Porciento de BB solucion (v4)\Porciento de BB\Datos de BB.accdb; Persist Security Info=False;"

            Using cn As New OleDbConnection(cadenaConexion)
                Dim instruccionSQL As String = "INSERT INTO Table1 (ID, [Numero de Lote], [Cavidad 1], [Cavidad 2], [Cavidad 3], [Cavidad 4]) VALUES (?, ?, ?, ?, ?, ?)"

                Using cmd As New OleDbCommand(instruccionSQL, cn)

                    cmd.Parameters.AddWithValue("@NumerodeLote", txtNumerodelote.Text)
                    cmd.Parameters.AddWithValue("@Cavidad1", txtbbCavidad1.Text)
                    cmd.Parameters.AddWithValue("@Cavidad2", txtbbCavidad2.Text)
                    cmd.Parameters.AddWithValue("@Cavidad3", txtbbCavidad3.Text)
                    cmd.Parameters.AddWithValue("@Cavidad4", txtbbCavidad4.Text)

                    cn.Open()

                    cmd.ExecuteNonQuery()
                End Using
            End Using
        End Sub

    sábado, 5 de diciembre de 2015 19:55
  • ¿Qué paso con el campo [ID]?

    Si es auto numérico entonces no debes de colocarlo en la instrucción sql.

    Dim instruccionSQL As String = "INSERT INTO Table1 ([Numero de Lote], [Cavidad 1], [Cavidad 2], [Cavidad 3], [Cavidad 4]) VALUES (?, ?, ?, ?, ?)"

    sábado, 5 de diciembre de 2015 20:09
  • Lo borré por que en el formulario no tengo ése textbox y como en access lo tira automatico.
    sábado, 5 de diciembre de 2015 20:12
  • Lo borré por que en el formulario no tengo ése textbox y como en access lo tira automatico.

    De acuerdo, si es un campo Autonumerico no debes colocarlo en la consulta SQL (tal como lo puse en el aporte anterior) y obviamente tampoco agregar a la colección de parámetros.

    ¿Cómo te fue?

    sábado, 5 de diciembre de 2015 20:21
  • Willams Morales que pena hombre, te puedo hacer una pregunta, yo estoy usando casi el mismo código, pero quiero añadir una foto, cómo hago?
    sábado, 5 de diciembre de 2015 20:24
  •   cmd.ExecuteNonQuery()

    Data type mismatch in criteria expression

    Es lo que sale cuando lo corro.

    sábado, 5 de diciembre de 2015 20:25
  •   cmd.ExecuteNonQuery()

    Data type mismatch in criteria expression

    Es lo que sale cuando lo corro.

    Tienes que revisar el tipo de dato que tienen las columnas en tu base de datos y de acuerdo a eso hacer la conversión respectiva al momento de pasar el valor al parámetro, por ejemplo, si la [Columna 1] es de tipo numérico entonces deberás hacer lo siguiente:

    cmd.Parameters.AddWithValue("@Cavidad1", int.Parse(txtbbCavidad1.Text))

    sábado, 5 de diciembre de 2015 20:35
  • Sale esto.

    Error    1    Overload resolution failed because no accessible 'Int' accepts this number of arguments.   

    sábado, 5 de diciembre de 2015 20:46
  • Una vez más te hago un llamado a la atención y a que pongas de tu parte!

    Primero, ¿Qué tipo de dato son las columnas en tu base de datos? ¿Son numéricas? ¿Entero?¿Enteros y decimales?

    De acuerdo al tipo de dato que tenga tu columna es que deberás precisar la conversión, yo sumo que es un tipo entero por eso hice na conversión a  entero pero reitero que eso depende del tipo de dato que tengas, ante cualquier caso sería de buena ayuda que muestres el tipo de dato de las columnas.

    Es obvio demás que si tu columna es de tipo numérico no puedes intentar persistir un valor no válido (texto o un valor que exceda los límites del rango permitido por el tipo)

    sábado, 5 de diciembre de 2015 21:00
  • En numero de lote está. Short text, pues es combinación de letras y números

    y en las cavidades (1,2,3,4)number pues son solo numeros.

    No se si esté bien así, pero ya aquel error no lo esta dando si no que me habla mas del "Numero de lote" como que ahí es el problema.

    The INSERT INTO statement contains the following unknown field name: 'Numero de Lote'. Make sure you have typed the name correctly, and try the operation again.

    sábado, 5 de diciembre de 2015 21:10
  • Lo que te menciona el mensaje es que el campo [Numero de Lote] no existe en la tabla, ¿estás seguro de haber escrito bien el nombre?
    sábado, 5 de diciembre de 2015 21:18
  • Estoy verificando y estoy intentando envartelo en foto a ver si es mas facil dar con el problema.
    sábado, 5 de diciembre de 2015 21:23
  • https://social.msdn.microsoft.com/Forums/getfile/754812
    sábado, 5 de diciembre de 2015 21:26
  • https://social.msdn.microsoft.com/Forums/getfile/754813
    sábado, 5 de diciembre de 2015 21:30
  • Yo no soy experto en Access ni entiendo si es case-sensitive pero lo único que noto es que el campo en Ms-Access es [Numero de lote] y tu estás colocando en la instrucción INSERT el campo [Numero de Lote], fíjate que la palabra Lote lo colocas con la inicial en mayúscula muy distinto al nombre del campo que es en minúscula.

    Intenta cambiar la instrucción insert con el nombre del campo tal y como está en Ms-Access

    Dim instruccionSQL As String = "INSERT INTO Table1 ([Numero de lote], [Cavidad 1], [Cavidad 2], [Cavidad 3], [Cavidad 4]) VALUES (?, ?, ?, ?, ?)"

    Coméntame como te fue.


    sábado, 5 de diciembre de 2015 21:40
  • Lo hice y sigue igual.

    The INSERT INTO statement contains the following unknown field name: 'Numero de lote'. Make sure you have typed the name correctly, and try the operation again.

    sábado, 5 de diciembre de 2015 21:45
  • ¿Podrías colocar el código que tienes?
    sábado, 5 de diciembre de 2015 21:53
  • Borré la columna de numero de lote en la base y en visual para hacer la prueba y no dió error.

    Estoy verificando si la data se guarda.


            Dim cadenaConexion As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Samuel Ortiz\Documents\Visual Studio 2012\Projects\Porciento de BB solucion (v4)\Porciento de BB\Datos de BB.accdb; Persist Security Info=False;"

            Using cn As New OleDbConnection(cadenaConexion)
                Dim instruccionSQL As String = "INSERT INTO Table1 ([Cavidad 1], [Cavidad 2], [Cavidad 3], [Cavidad 4]) VALUES (?, ?, ?, ?)"

                Using cmd As New OleDbCommand(instruccionSQL, cn)


                    cmd.Parameters.AddWithValue("@Cavidad 1", txtbbCavidad1.Text)
                    cmd.Parameters.AddWithValue("@Cavidad 2", txtbbCavidad2.Text)
                    cmd.Parameters.AddWithValue("@Cavidad 3", txtbbCavidad3.Text)
                    cmd.Parameters.AddWithValue("@Cavidad 4", txtbbCavidad4.Text)

                    cn.Open()

                    cmd.ExecuteNonQuery()
                End Using
            End Using
        End Sub

    sábado, 5 de diciembre de 2015 22:00
  • Es bastante raro lo que sucede, deberías evitar usar espacios en blanco entre los nombres que defines para las columnas. ¿Qué pasa si nombras la columna como NumeroLote? 
    sábado, 5 de diciembre de 2015 22:03
  • Verifico
    sábado, 5 de diciembre de 2015 22:09
  • The INSERT INTO statement contains the following unknown field name: 'Numerolote'. Make sure you have typed the name correctly, and try the operation again.

    El problema es ahí.

    Amigo no te voy a tomar mas de tu tiempo, estoy mega agradecido por la ayuda. Esto está a ley de nada, seguiré intentando poco a poco, de eso se trata esto. Mil, mil gracias por la ayuda.

    sábado, 5 de diciembre de 2015 22:19