none
Datagrid view y actualización en BD

    Pregunta

  • Buenos días,

    Estoy realizando una aplicación que utiliza un datagrid view obtenido de una base de datos Access mediante el siguiente código:

    Dim myConnection As OleDbConnection = New OleDbConnection 'Declarar Tipo de conexion (nueva)
            Dim dr As OleDbDataReader
            myConnection.ConnectionString = Conexion
            myConnection.Open()
            Dim cmd As OleDbCommand = New OleDbCommand("Select *
                                                                FROM dtgEntidad;", myConnection)
            dr = cmd.ExecuteReader
            Dim dt As New DataTable()

            dt.Load(dr)
            dtgEntidades.DataSource = dt

            myConnection.Close()
            dtgEntidades.DataSource = dt

    Lo que no acabo de conseguir es realizar correctamente la interacción con los datos de datagridview y la BD, me interesaría poder borrar, actualizar y agregar pero no soy capaz de hacerlo con los eventos del datagrid.

    ¿Alguien sería tan amable de echarme una mano?

    Gracias.

    martes, 30 de agosto de 2016 14:35

Respuestas

  • En la siguiente conversación encontrarás una respuesta mía donde muestro la clase HelperDataAccess, la cual dispone de un método compartido para obtener un objeto DataTable (GetData), y otro para actualizar la tabla correspondiente de la base de datos (UpdateData):

    Actualizar una tabla en SQLServer con DataGridView

    Obviamente, el código fuente de la clase HelperDataAccess lo tendrás que adaptar para que utilice objetos del espacio de nombres System.Data.OleDb (bases de datos de Access) en lugar de utilizar los objetos de acceso a datos del espacio de nombres System.Data.SqlClient (bases de datos de SQL Server).

    Es decir, tendrás que importar el espacio de nombres:

        Imports System.Data.OleDb

    y sustituir los siguientes objetos:

     
        SqlCommand         -->   OleDbCommand
        SqlConnection      -->   OleDbConnection
        SqlDataAdapter     -->   OleDbDataAdapter
        SqlCommandBuilder  -->   OleDbCommandBuilder

    Te hago la salvedad que para configurar el adaptador de datos mediante un objeto OleDbCommandBuilder, la tabla de la base de datos de Access que desees actualizar, tiene que tener establecida, sí o sí, su correspondiente clave principal; si no es así, olvídate entonces del procedimiento UpdateData y configura manualmente las propiedades InsertCommand, UpdateCommand y DeleteCommand del adaptador de datos, cuestión ésta que te aseguro no es ni fácil ni agradable. ;-)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    miércoles, 31 de agosto de 2016 9:45
    Moderador
  • "estutoriales" preguntó:

    > Me he fijado que utiliza en metodo Friend, ¿tiene este alguna ventaja con respecto al Public?

    La única "ventaja" que tiene, si se pueda llamar así, es que un miembro declarado Friend solamente lo pueden llamar aquellos otros miembros existentes en EL MISMO PROYECTO, mientras que si está declarado como Public, también lo pueden llamar otros miembros existentes FUERA DEL PROYECTO donde se encuentra declarado el miembro Friend.

    Friend (Visual Basic)

    Niveles de acceso en Visual Basic


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    jueves, 1 de septiembre de 2016 15:07
    Moderador

Todas las respuestas

  • Buenos días Estutoriales:

    Supongo que lo intentas hacer mediante la barra que agrega en la pantalla de diseño que pone automáticamente cuando hiciste la conexión. Si ese es el caso en tu lado derecho se debió generar un "[AlgunNombre]DataSet"...

    Seleccionarlo y en la ventana de propiedades  en la sección de "Advanced" la segunda opción "Copy output directory" debes tener la opción "Copy is newer"... En caso de que lo quieras hacer por medio de un botón que tu mismo programas pues esa ya es otra historia. Con confianza pregunta si no me explique bien también dime para darte mas detalles.

    martes, 30 de agosto de 2016 14:42
  • Buenos días Roberto,

    Gracias por tomarte tu tiempo en responderme.

    No acabo de entender lo que comentas, quizas no me he explicado bien o no entendido correctamente tu comentario. Dejame que te detalle un poco más mi caso. 

    En mi proyecto tengo un datagridview "dtgEntidades" que relleno con el código explicado anteriormente, me lo carga correctamente, ahí ningún problema.

    Lo que me interesa tratar es la interacción con el datagridview, por ejemplo un usuario modifica un campo del datagridview, borra una línea o crea una nueva.

    Supongo que en ese caso debería de hacer un UPDATE, INSERT o DELETE dependiendo del caso, la duda que tengo es donde debería incluir el código correspondiente para que los cambios del datagridview se muestren en mi base de datos, entiendo que se debería de hacer a través de eventos, pero no soy capaz...

    Edito: No estoy utilizando origenes de datos que creo que es a lo que te referias.
    • Editado estutoriales miércoles, 31 de agosto de 2016 9:16
    miércoles, 31 de agosto de 2016 9:14
  • "estutoriales" preguntó:

    > Lo que no acabo de conseguir es realizar correctamente la interacción con
    > los datos de datagridview y la BD, me interesaría poder borrar, actualizar
    > y agregar pero no soy capaz de hacerlo con los eventos del datagrid.

    Hola:

    Para que las modificaciones efectuadas en el control DataGridView, o mejor dicho, en el objeto DataTable al que se encuentra enlazado el control DataGridView, surtan efecto en la base de datos, tienes que llamar al método Update de un objeto OleDbDataAdapter debidamente configurado pasándole el objeto DataTable que has enlazado con el control DataGridView:

        ' Referenciamos el objeto DataTable enlazado con el control DataGridView
        Dim dt As DataTable = DirectCast(dtgEntidades.DataSource, DataTable)
    
        ' Actualizamos la base de datos
        Dim n As Integer = objetoDataAdapter.Update(dt)
    
        MessageBox.Show($"Nº de registros actualizados: {n}")
    

    Obviamente, el objeto llamado 'objetoDataAdapter' en el ejemplo, tendrás que declararlo y configurarlo correctamente, tal y como se muestra en los ejemplos que aparecen en los enlaces indicados más arriba.

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    miércoles, 31 de agosto de 2016 9:21
    Moderador
  • En la siguiente conversación encontrarás una respuesta mía donde muestro la clase HelperDataAccess, la cual dispone de un método compartido para obtener un objeto DataTable (GetData), y otro para actualizar la tabla correspondiente de la base de datos (UpdateData):

    Actualizar una tabla en SQLServer con DataGridView

    Obviamente, el código fuente de la clase HelperDataAccess lo tendrás que adaptar para que utilice objetos del espacio de nombres System.Data.OleDb (bases de datos de Access) en lugar de utilizar los objetos de acceso a datos del espacio de nombres System.Data.SqlClient (bases de datos de SQL Server).

    Es decir, tendrás que importar el espacio de nombres:

        Imports System.Data.OleDb

    y sustituir los siguientes objetos:

     
        SqlCommand         -->   OleDbCommand
        SqlConnection      -->   OleDbConnection
        SqlDataAdapter     -->   OleDbDataAdapter
        SqlCommandBuilder  -->   OleDbCommandBuilder

    Te hago la salvedad que para configurar el adaptador de datos mediante un objeto OleDbCommandBuilder, la tabla de la base de datos de Access que desees actualizar, tiene que tener establecida, sí o sí, su correspondiente clave principal; si no es así, olvídate entonces del procedimiento UpdateData y configura manualmente las propiedades InsertCommand, UpdateCommand y DeleteCommand del adaptador de datos, cuestión ésta que te aseguro no es ni fácil ni agradable. ;-)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    miércoles, 31 de agosto de 2016 9:45
    Moderador
  • Buenos días Enrique,

    Editado: Ya solucione el problema, hacía conflicto con otra función. Me he fijado que utiliza en metodo Friend, ¿tiene este alguna ventaja con respecto al Public?

    Gracias.

    -------------------------

    Gracias por regalarme tu tiempo en esta respuesta tan detallada, sin embargo, después de haber aplicado el código me devuelve un error que dice referencia a objeto no establecida como instancia de un objeto, lo curioso es que me carga la estructura de la tabla pero no sus datos.

    Adjunto código:

    Modulo

    Imports System.Data.OleDb
    Friend Module HelperDataAccess
    
        Private Function GetConnectionString() As String
    
            ' La función devolverá la cadena de conexión utilizada
            ' por el proyeto, y en ella puedes escribir el código
            ' fuente necesario para leerla desde el archivo de
            ' configuración de la aplicación.
            '
            Return "Data Source=" & ubicacionACCDB & ";Provider=Microsoft.ACE.OLEDB.12.0;"
    
        End Function
    
        ''' <summary>
        ''' Ejecuta la consulta SQL de selección existente en el objeto Command
        ''' devolviendo un objeto DataTable.
        ''' </summary>
        ''' <param name="cmd">objeto Command debidamente configurado.</param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Friend Function GetData(cmd As OleDbCommand) As DataTable
    
            If (cmd Is Nothing) Then
                Throw New ArgumentNullException("cmd")
            End If
    
            Dim dt As New DataTable()
    
            ' Configuramos una conexión con el origen de datos.
            '
            Using cnn As New OleDbConnection(GetConnectionString())
    
                cmd.Connection = cnn
    
                Dim da As New OleDbDataAdapter(cmd)
    
                ' Añadimos información sobre la clave principal de la tabla. 
                '
                da.MissingSchemaAction = MissingSchemaAction.AddWithKey
    
                da.Fill(dt)
    
                ' En el objeto DataTable guardamos el objeto
                ' Command utilizado para ejecutar la consulta.
                '
                dt.ExtendedProperties.Add("Command", cmd)
    
            End Using
    
            Return dt
    
        End Function
    
        ''' <summary>
        ''' Actualiza el origen de datos con los datos existentes
        ''' en el objeto DataTable pasado al procedimiento.
        ''' </summary>
        ''' <param name="dt">Objeto DataTable configurado con el objeto Command y la
        ''' cadena de conexión utilizadas para rellenar el objeto DataTable.</param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Friend Function UpdateData(dt As DataTable) As Integer
    
            If (dt Is Nothing) Then
                Throw New ArgumentNullException("dt")
            End If
    
            ' Recuperamos el objeto Command almacenado
            ' en las propiedades extendidas del objeto
            ' DataTable.
            '
            Dim cmd As OleDbCommand = DirectCast(dt.ExtendedProperties("Command"), OleDbCommand)
            If (cmd Is Nothing) Then
                Throw New ArgumentException("No se ha configurado el objeto Command.")
            End If
    
            ' Referenciar el objeto Connection
            Using cnn As OleDbConnection = cmd.Connection
    
                ' Obtener la cadena de conexión
                cnn.ConnectionString = GetConnectionString()
    
                ' Configurar el adaptador de datos.
                Dim da As New OleDbDataAdapter(cmd)
    
                ' Generar automáticamente las propiedades del adaptador de datos, pero
                ' para ello, la tabla tiene que tener establecida su correspondiente
                ' clave principal.
                '
                Dim cb As New OleDbCommandBuilder(da)
                cb.QuotePrefix = "["
                cb.QuoteSuffix = "]"
    
                With da
                    .InsertCommand = cb.GetInsertCommand()
                    .DeleteCommand = cb.GetDeleteCommand()
                    .UpdateCommand = cb.GetUpdateCommand()
                End With
    
                Return da.Update(dt)
    
            End Using
    
        End Function
    
    End Module

    Boton cargar datos

            Try
                Dim cmd As New OleDbCommand()
    
                ' Seleccionamos todos los clientes de la tabla Clientes donde
                ' el valor del campo IdCliente sea inferior a 4300020.
                '
                cmd.CommandText = "Select * FROM Entidades"
                'cmd.Parameters.AddWithValue("@id", 4300020)
    
                dtgEntidades.DataSource = GetData(cmd)
    
            Catch ex As Exception
                ' Se ha producido un error
                MessageBox.Show(ex.Message)
    
            End Try

    Muchas gracias por su ayuda


    • Editado estutoriales jueves, 1 de septiembre de 2016 11:51
    jueves, 1 de septiembre de 2016 11:25
  • "estutoriales" preguntó:

    > Me he fijado que utiliza en metodo Friend, ¿tiene este alguna ventaja con respecto al Public?

    La única "ventaja" que tiene, si se pueda llamar así, es que un miembro declarado Friend solamente lo pueden llamar aquellos otros miembros existentes en EL MISMO PROYECTO, mientras que si está declarado como Public, también lo pueden llamar otros miembros existentes FUERA DEL PROYECTO donde se encuentra declarado el miembro Friend.

    Friend (Visual Basic)

    Niveles de acceso en Visual Basic


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    jueves, 1 de septiembre de 2016 15:07
    Moderador
  • Buenos días Enrique,

    Gracias por aportarme la explicación y la documentación.

    Verás tengo otra duda, gracias a tu código consegui cargar los datos e interactuar con ellos a traves del datagridview, justo como quería pero me encuentro con un problema.

    Me he creado la siguiente función para realizar la actualización de los datos del datagridView:

     Private Sub RefrescarAccionesEntidad()
            Try
                Dim cmd As New OleDbCommand()
    
                ' Seleccionamos todos los clientes de la tabla Clientes donde
                '
                cmd.CommandText = "SELECT Acciones.idAccion, Acciones.Título, Acciones.FechaHora, Acciones.Tipo, Acciones.Prioridad, Acciones.Estado,  Acciones.Descripción, Acciones.Nota, Acciones.Tiempo
                                                            FROM Entidades INNER JOIN Acciones ON Entidades.idEntidad = Acciones.idEntidad
                                                            WHERE (((Acciones.idUsuario)=" & Usuarioid & ") AND ((Acciones.idEntidad)=" & txtId.Text & "))"
    
    
                dtgAcciones.DataSource = GetData(cmd)
                Me.dtgAcciones.Columns("idAccion").Visible = False
    
            Catch ex As Exception
                ' Se ha producido un error
                MessageBox.Show(ex.Message)
    
            End Try
        End Sub

    La funcion me funciona correctamente cuando la llamo desde el Form Load o desde un boton que únicamente contiene esa función, funciona correctamente.

    Sin embargo, si la llamo desde otra función por ejemplo una que realiza updates o inserts no funciona correctamente, ¿me podrías guiar un poco sobre que hago mal?

    Gracias.

    viernes, 2 de septiembre de 2016 11:18
  • "estutoriales" escribió:

    > La funcion me funciona correctamente cuando la llamo desde el Form Load o desde un
    > boton que únicamente contiene esa función, funciona correctamente.
    >
    > Sin embargo, si la llamo desde otra función por ejemplo una que realiza updates o
    > inserts no funciona correctamente, ¿me podrías guiar un poco sobre que hago mal?

    Pues la verdad es que un poco complicado que te pueda guiar sobre lo que estás haciendo mal sin conocer:

        1º) ¿En qué te basas para escribir que "no funciona correctamente"?

        2º) Si no te funciona correctamente porque te aparece un error, ¿qué descripción tiene el error?

        3º) ¿Qué código fuente estás ejecutando cuando aparece el error?

    Como bien creo que podrás comprender, si tu no aportas los detalles de lo que está ocurriendo, no creo que alguien del foro te pueda ayudar. Yo, desde luego soy incapaz de hacerlo. :-(

    >   Friend Function GetData(cmd As OleDbCommand) As DataTable

    La implementación que se hace en la función GetData es IMPOSIBLE que produzca un error; podrá producirlo el objeto OleDbCommand que le pasas a dicha función, por lo que sin conocer lo que estás haciendo y cómo lo estás haciendo, lo único que por ahora te puedo decir es que revises bien la configuración que tiene el objeto OleDbCommand que le has pasado a la función GetData.

    > ' Seleccionamos todos los clientes de la tabla Clientes donde
    > '
    > cmd.CommandText = "SELECT * FROM ...
    >  WHERE (((Acciones.idUsuario)=" & Usuarioid & ") AND ((Acciones.idEntidad)=" & txtId.Text & "))"

    Por cierto, aprovecho el mensaje para decirte que no estaría de más que te fueses acostumbrado a trabajar con parámetros de entrada en lugar de inyectar variables en la cláusula WHERE de la consulta SQL de combinación que estás ejecutando:

            cmd.CommandText =
                "SELECT a.idAccion, a.[Título], a.FechaHora, a.Tipo, a.Prioridad, a.Estado, a.[Descripción], a.Nota, a.Tiempo " &
                "FROM Entidades e INNER JOIN Acciones a ON e.idEntidad = a.idEntidad " &
                "WHERE ((a.idUsuario=@param1) AND (a.idEntidad=@param2))"
    
            ' Los parámetros de entrada hay que añadirlos a la colección
            ' Parameters del objeto OleDbCommand en el mismo orden en el
            ' que se han especificado en la cláusula WHERE.
            '
            cmd.Parameters.AddWithValue("@param1", Usuarioid)
            cmd.Parameters.AddWithValue("@param2", txtId.Text)

    Te aconsejaría que evitaras que los nombres, tanto de las tablas como de sus campos, tuvieran acentos. En caso de tenerlos, y a fin de evitar resultados inesperados, tienes que encerrar el nombre entre corchetes, tal y como aparece en la consulta SQL de selección.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.




    viernes, 2 de septiembre de 2016 14:44
    Moderador
  • Buenos días Enrique,

    Gracias por sus consejos los tendre en cuenta.

    > 1º) ¿En qué te basas para escribir que "no funciona correctamente"?

    Cuando la ejecuto directamente desde un botón sin nada de código me refresca los datos correctamente. Cuando lo hago desde otro form o desde un timer dentro del mismo form, no me refresca los datos, no muestra ningún error. Curiosamente me he dado cuenta de que si ejecuto dos veces la función desde el otro form si que refresca.


    > 2º) Si no te funciona correctamente porque te aparece un error, ¿qué descripción tiene el error?

    No me aparece ningún error, simplemente no me actualiza el datagrid.

    >  3º) ¿Qué código fuente estás ejecutando cuando aparece el error?

    
    
    Friend Sub RefrescarAccionesEntidad()
            Try
                Dim cmd As New OleDbCommand()
    
                ' Seleccionamos todos los clientes de la tabla Clientes donde
                ' el valor del campo IdCliente sea inferior a 4300020.
                '
                cmd.CommandText = "SELECT Acciones.idAccion, Acciones.Título, Acciones.FechaHora, Acciones.Tipo, Acciones.Prioridad, Acciones.Estado,  Acciones.Descripción, Acciones.Nota, Acciones.Tiempo
                                                            FROM Entidades INNER JOIN Acciones ON Entidades.idEntidad = Acciones.idEntidad
                                                            WHERE (((Acciones.idUsuario)=" & Usuarioid & ") AND ((Acciones.idEntidad)=" & idEntidad & "))"
    
    
                dtgAcciones.DataSource = GetData(cmd)
                Me.dtgAcciones.Columns("idAccion").Visible = False
    
            Catch ex As Exception
                ' Se ha producido un error
                MessageBox.Show(ex.Message)
    
            End Try
        End Sub
    
        Friend Sub GuardarCambiosAccionesEntidad()
            Try
                ' Recuperamos un objeto DataTable con los cambios que
                ' se han realizado en el objeto DataTable enlazado
                ' con el control DataGridView.
                '
                Dim dt As DataTable = DirectCast(dtgAcciones.DataSource, DataTable).GetChanges()
    
                Dim n As Integer
    
                If (Not dt Is Nothing) Then
                    ' Si existe algún cambio actualizamos el origen de datos.
                    n = UpdateData(dt)
                End If
    
            Catch ex As Exception
                ' Se ha producido un error
                MessageBox.Show(ex.Message)
    
            End Try
        End Sub
    
    'BOTÓN QUE NO REFRESCA (SI REALIZO EL PROCESO DOS VECES SÍ) 
    
     Private Sub btnBorrar_Click(sender As Object, e As EventArgs) Handles btnBorrar.Click
            Try
                Dim row As DataGridViewRow = dtgAcciones.CurrentRow
                If IsNothing(row) Then
                    MessageBox.Show("Para suprimir una acción debe de seleccionar una acción.", "Error al Borrar", MessageBoxButtons.OK, MessageBoxIcon.Error)
                Else
    
                    AccionSeleccionada = row.Cells(0).Value.ToString()
                    Dim result As DialogResult
                    result = MessageBox.Show("Esta apunto de borrar el registro seleccionado. ¿Confirma que desea borrarlo?", "Borrado de Acción", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
                    If result = DialogResult.Yes Then
                        Ejecutar("DELETE FROM Acciones WHERE idAccion = " & AccionSeleccionada & ";")
                    End If
                    'GuardarCambiosAccionesEntidad()
                    RefrescarAccionesEntidad()
                End If
            Catch ex As Exception
                MessageBox.Show(ex.ToString)
            End Try
    
       End Sub
    
    'BOTÓN QUE SI REFRESCA
    
        Public Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            RefrescarAccionesEntidad()
        End Sub


    Código de función en otro modulo

        Public Sub Ejecutar(ByVal sql As String)
            Dim myConnection As OleDbConnection
            myConnection = New OleDbConnection(Conexion)
            myConnection.Open()
            Dim cmd As New OleDbCommand(sql, myConnection)
            cmd.ExecuteNonQuery()
    
        End Sub

    Te he expuesto en los comentarios el botón que me funciona y el que no.

    Gracias.

    Un saludo




    lunes, 5 de septiembre de 2016 7:54
  • "estutoriales" escribió:

    > Cuando la ejecuto directamente desde un botón sin nada de código me refresca
    > los datos correctamente. Cuando lo hago desde otro form o desde un timer dentro
    > del mismo form, no me refresca los datos, no muestra ningún error. Curiosamente
    > me he dado cuenta de que si ejecuto dos veces la función desde el otro form si
    > que refresca.

    ¡Vamos a ver! Lo que describes son temas que yo no llego a entender, y mira que llevo ya unos cuantos años en este mundillo. O funciona o no funciona, pero eso de que unas veces sí funciona y otras no, o tengo que hacer 24 veces click sobre un Button para que funcione y se "refresque" (supuestamente una base de datos), perdóname pero a mí, personalmente, no me entra en la cabeza, y más los procedimientos que te indiqué (GetData y UpdateData) que están más que probados.

    >   Private Function GetConnectionString() As String
    >
    >        ' La función devolverá la cadena de conexión utilizada
    >        ' por el proyeto, y en ella puedes escribir el código
    >        ' fuente necesario para leerla desde el archivo de
    >        ' configuración de la aplicación.
    >        '
    >        Return "Data Source=" & ubicacionACCDB & ";Provider=Microsoft.ACE.OLEDB.12.0;"
    >
    >    End Function

    ¿Estás completamente seguro que estás "refrescando" la base de datos correcta? ¿Por casualidad has añadido la base de datos de Access al proyecto de tu aplicación? ¿Cuál es el valor COMPLETO de la variable llamada 'ubicacionACCDB" que tomas para devolver la cadena de conexión que están utilizando los métodos GetData y UpdateData?

    > Código de función en otro modulo
    >
    >    Public Sub Ejecutar(ByVal sql As String)
    >        Dim myConnection As OleDbConnection
    >        myConnection = New OleDbConnection(Conexion)
    >
    >    End Sub

    ¿Qué valor tiene la variable, campo o función llamada "Conexion" que supuestamente contiene la cadena de conexión? ¿Es el MISMO VALOR que la variable, campo o función llamada "ubicacionACCDB" que utilizas en la función GetConnectionString?


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    lunes, 5 de septiembre de 2016 9:29
    Moderador
  • Buenas tardes "estutoriales":

    Disculpa me desconecte un poco del foro debido a la carga de trabajo, ya leo muchas respuestas con las que NO estoy familiarizado, ya por el tiempo supongo ya solucionaste... o sigue el problema???

     
    jueves, 15 de septiembre de 2016 20:38