Autor Tema: Visual Basic consulta SQL SELECT UPDATE actualizar base de datos OleDbConnection  (Leído 5843 veces)

anmaroso

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 29
    • Ver Perfil
Buenos días.

No me actualiza la base de datos con Visual Basic. Paso el código.

Código: [Seleccionar]

 If ds.HasChanges Then
            Try
                Me.Validate()
                dt.AcceptChanges()
                da.Update(dt)
                MsgBox("datos actualizados")
            Catch ex As Exception
                MsgBox("Update failed")
            End Try

            MsgBox(vms2)
        Else
            MsgBox("No hay modificación de registros")
        End If


dt es la tabla  Dim dt As DataTable
   
da el OleDbDataadapter Dim da As New OleDb.OleDbDataAdapter

Lo intento de mil maneras y no lo logro. algo hago mal pero no lo veo.


Gracias y Saludos.
« Última modificación: 19 de Noviembre 2015, 13:39 por Alex Rodríguez »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:No me actualiza la base de datos.
« Respuesta #1 en: 31 de Octubre 2015, 14:22 »
Hola anmaroso con el código que has pegado no veo información suficiente para saber lo que falla. En estos hilos hay ejemplos y siguiéndolos es posible que puedas solucionar el problema:

https://www.aprenderaprogramar.com/foros/index.php?topic=2980.0

https://www.aprenderaprogramar.com/foros/index.php?topic=1485.0

saludos

anmaroso

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 29
    • Ver Perfil
Re:No me actualiza la base de datos.
« Respuesta #2 en: 17 de Noviembre 2015, 12:33 »
Hola Alex, buenos días:

He ido a los enlaces que me indicaste y no encontré la solución. Después de mucho indagar he logrado que me actualice todos los registros modificados a excepción del primero de la base de datos que no encuentro la manera.

Te paso el código a ver dónde falla.

Código: [Seleccionar]

Imports System
Imports System.Data
Imports System.Data.OleDb
Imports System.Data.DataRow

Public Class FPTRANSF2
    Dim cnn As New OleDb.OleDbConnection
    Dim cnnm As New OleDb.OleDbConnection
    Dim da As New OleDb.OleDbDataAdapter
    Dim daf As New OleDb.OleDbDataAdapter
    Dim dt As DataTable
    Dim dtf As DataTable
    Dim ds As DataSet
    Dim vffp As DateTime
    Dim de As New BindingSource
    Public vfs1 As Single
    Public vfi1 As Integer
    Dim col As Double
    Dim col1 As String
    Dim col2 As Date
    Dim col3 As Integer
    Private Sub FPTRANSF2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        vffp = FPTRANSF.vffp
        Dim cb As New OleDbCommandBuilder(da)
        cnn = New OleDb.OleDbConnection
        cnn.ConnectionString = strcon
        cnnm = New OleDb.OleDbConnection
        cnnm.ConnectionString = strcon
        Dim consulta As String
        Dim consulta1 As String
        If vffp = Nothing Then '> vgfi Then
            MsgBox("Fecha no seleccionada ")
        Else
            Me.B1.Visible = True
            Me.B2.Visible = True
            MsgBox("Fecha seleccionada " & vffp)

        End If

        consulta = "SELECT TFACTURASR.VENCIMIENTO, TPROVEEDORES.NOMBRE, " & _
                   "TFACTURASR.IMPORTE, TFACTURASR.IMPORTET, " & _
                   "TFACTURASR.FACTURANR, TFACTURASR.FECHAE, " & _
                   "TFACTURASR.FACTURANE, TFACTURASR.CONCEPTOP, " & _
                   "TFACTURASR.FECHAP, TFACTURASR.CLAVE " & _
                   "FROM TPAGO INNER JOIN (TPROVEEDORES INNER JOIN " & _
                   "TFACTURASR ON TPROVEEDORES.CLAVE = TFACTURASR.CPROVEEDOR) " & _
                   "ON TPAGO.CLAVE = TFACTURASR.FPAGO " & _
                   "WHERE (((TPROVEEDORES.NOPAGAR)= FALSE) AND " & _
                   "((TFACTURASR.NOPAGAR)= FALSE) AND  " & _
                   "((TFACTURASR.IMPORTET)= 0) AND " & _
                   "((TFACTURASR.FECHAP)<= Datevalue('" & vgfi & "')) AND " & _
                   "((TFACTURASR.PAGADA)= FALSE) AND " & _
                   "((TFACTURASR.FPAGO) LIKE '4%') AND " & _
                   "((TFACTURASR.VENCIMIENTO) = Datevalue('" & vffp & "'))) " & _
                   "ORDER BY TPROVEEDORES.NOMBRE"


        da = New OleDb.OleDbDataAdapter(consulta, cnn)
        ds = New DataSet
        dt = New DataTable
        da.Fill(dt)

        ds.Tables.Add(dt)

        consulta1 = "SELECT IMPORTET, CONCEPTOP, FECHAP, CLAVE FROM TFACTURASR " & _
                    "ORDER BY CLAVE"
        daf = New OleDb.OleDbDataAdapter(consulta1, cnnm)

        dtf = New DataTable
        daf.Fill(dtf)

        If dt.Rows.Count > 0 Then
            preparartransferencia()
        Else
            MsgBox("sigue")
            prepararfichero()
        End If


    End Sub

    Private Sub preparartransferencia()
     
        DG1.DataSource = dt

        Dim vmt1 As String
        Dim vmt2 As String
        Dim vms1 As Single
        Dim fila As Integer = 0
        While fila <= dt.Rows.Count - 1
            vmt1 = DG1.Rows(fila).Cells(1).Value
            vmt1 = dt.Rows(fila)(1)
            vms1 = 0.0
            vmt2 = ""
            Do While dt.Rows(fila)(1) = vmt1 And fila <= dt.Rows.Count - 1
                vms1 = vms1 + dt.Rows(fila)(2)
                If vmt2 = "" Then
                    vmt2 = dt.Rows(fila)(6)
                Else
                    vmt2 = vmt2 & "," & dt.Rows(fila)(6)
                End If
                dt.Rows(fila)(8) = dt.Rows(fila)(0)
                If fila = dt.Rows.Count - 1 Then
                    dt.Rows(fila)(3) = vms1
                    dt.Rows(fila)(7) = vmt2
                    vfs1 = vfs1 + vms1
                    Exit While
                Else
                    If fila < dt.Rows.Count - 1 Then
                        fila = fila + 1
                    End If
                End If
            Loop
            If fila <= dt.Rows.Count - 1 Then
                fila = fila - 1
                dt.Rows(fila)(3) = vms1
                dt.Rows(fila)(7) = vmt2
                vfs1 = vfs1 + vms1
                fila = fila + 1
            End If
        End While

       
        For Each row As DataRow In dt.Rows
            If row.RowState = DataRowState.Modified Then
                col = row.Item("IMPORTET")
                col1 = row.Item("CONCEPTOP").ToString
                col2 = row.Item("FECHAP")
                col3 = row.Item("CLAVE")
             
                Dim consultam As String
                consultam = "UPDATE TFACTURASR SET IMPORTET = ('" & col & "'), " & _
                            "CONCEPTOP = ('" & col1 & "'), " & _
                            "FECHAP = Datevalue('" & col2 & "') " & _
                            "WHERE (CLAVE) = (" & col3 & ") "

                Try
                    If (Not cnnm Is Nothing) Then
                        cnnm.Close()
                    End If
                    cnnm.Open()
                    Dim cmd As New OleDbCommand(consultam, cnnm)

                    cmd.ExecuteNonQuery()
                    dtf.AcceptChanges()


                Catch ex As Exception
                    MessageBox.Show("No ha actualizado bien")

                End Try

            End If
        Next
    End Sub



Perdona por mi atrevimiento ya que soy muy novato pero pienso que pudiera ser porque se tratase del último registro del bucle de los modificados.

Te agradecería si puedes revisarlo a ver si hay errores.

Gracias y saludos.

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Hola anmaroso, una estrategia que puede ser útil es mostrar por pantalla las consultas que intervienen para verificar que estén bien construidas.

Simplemente escribir algo como

MsgBox ("La consulta a ejecutar es: " & consultam) ó MsgBox ("La consulta a ejecutar es: " & consulta1)

De este modo puedes ver si hay algún error en la generación de consultas ¿Qué obtienes al mostrarlas por pantalla?

Otra cosa, cuando te refieres a que no te modifica el primer registro ¿te refieres a una fila o a una columna? Si es una columna, ten en cuenta que algunas columnas pueden estar definidas como autoincrementales y por ello no es posible modificarlas a través de una consulta ya que sus valores se generan automáticamente.

Saludos

anmaroso

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 29
    • Ver Perfil
Hola, Alex:

Buenos días.

Al final después de tanto tiempo encontré el error .Estaba en que uno de los registros de la base de datos no se actualizaba porque el registro estaba corrupto, no se solucionaba compactando la base de datos por eso he tardado tanto en descubrirlo, ha sido borrar el registro y actualizar bien.

Muchas gracias por tu comprensión.

Saludos.

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Vaya! Ese problema que comentas parece bastante difícil de detectar, yo diría que puede ocurrir pero es bastante infrecuente. Gracias por comentar cómo lo has solucionado.

Saludos

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".