Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2013
    Messaggi
    74

    vb2010: aggiornare tabella access da file di test

    Salve a tutti.
    Nel mio programma, ho la necessità di caricare tutte le linee di un file cvs (di volta in volta diverso) in una tabella access.

    Quindi, prima di iniziare il ciclo di lettura, azzero la tabella e quindi all'interno del ciclo e fino a quando peek <> -1 leggo le righe, assegno i campi a delle variabili e richiamo questa sub (passandoli come parametri)

    codice:
    Dim connection As New OleDbConnection(stringaconn)
            Dim cmd As New OleDbCommand("Insert into fiel(FI1,FI2,FI3,FI4,FI5) VALUES (?,?,?,?,?)", connection)
            cmd.Parameters.AddWithValue("@FI1", campo1)
            cmd.Parameters.AddWithValue("@FI2", campo2)
            cmd.Parameters.AddWithValue("@FI3", Replace(campo3, """", ""))
            cmd.Parameters.AddWithValue("@FI4", campo4)
            cmd.Parameters.AddWithValue("@FI5", campo5)
    
            connection.Close()
            connection.Open()
    
            Try
                cmd.ExecuteNonQuery()
                xt += 1
                connection.Close()
            Catch es As Exception
                MessageBox.Show("Errore durante l'aggiornamento della tabella " + Chr(13) + Chr(13) + "(" + es.Message + ")")
                connection.Close()
            End Try
    PROBLEMA:

    alla fine del ciclo la variabile, *** leggendo sempre lo stesso file ***, xt (messa li' solo per contare i record scritti) mi dice 1.015 (che è valore giusto), ma la tabella mi presenta, di volta in volta, un numero di record diverso (955, 1.001, 980, ecc, ecc).

    Non riesco proprio a raccapezzarmi .....
    Ultima modifica di karug64; 22-05-2014 a 21:57
    Dopo anni di programmazione amatoriale in VBA, ho deciso di passare a VB.NET

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2014
    residenza
    Vicenza
    Messaggi
    318
    Un errore grave che fai è aprire e richiudere la connessione ogni volta, quindi lo fa 1015 volte.
    Devi aprire una sola volta la connessione, elaborare tutti i 1015 record, e poi chiudere la connessione.

    Sergio

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2013
    Messaggi
    74
    Intanto grazie per la risposta.

    Ho provveduto a fare come mi hai suggerito tu, ma il risultato non cambia. Ma ......
    ho fatto mille tentativi ed ho scoperto (non il problema) ma quello che accade.
    Mi spiego:

    prima di iniziare il ciclo di lettura provvedo ad azzerare la tabella richiamando questa sub:

    codice:
     Private Sub azzera_tab(ByVal comando As String)
    Dim objconn As OleDbConnection
            Dim objcomm As OleDbCommand
            objconn = New OleDbConnection(stringaconn)
            If objconn.State = ConnectionState.Open Then objconn.Close()
            objconn.Open()
            objcomm = New OleDbCommand(comando, objconn)
            Dim risputente As Integer
            Try
                risputente = objcomm.ExecuteNonQuery()
                If risputente = 0 Then
                    objconn.Close()
                End If
            Catch es As Exception
                MessageBox.Show("Errore di connessione al DB" + Chr(13) + Chr(13) + "(" + es.Message + ")")
                objconn.Close()
            End Try
    End sub
    in la variabile "comando" contiene, in questo caso, la stringa

    codice:
    DELETE * FROM FIEL
    ebbene, se blocco il programma subito dopo questa istruzione la tabella è vuota, ma quando poi la popolo, mi sono accorto che le righe che mancano sono sempre le prime del file csv (quindi se su 1015 ne trovo 1.000 quelle mancanti sono sempre le prime 15 e cosi' via).
    Ma non basta.
    Se apro il file DB.mdb cliccandoci sopra e seleziono tutti i record, li cancello manualmente e lo chiudo, l'elaborazione mi da il valore giusto. (prova fatta una ventina di volte sempre con risultati esatti...)

    Quindi deduco che il problema potrebbe essere nella cancellazione (ma non capisco come visto che "vedo" la tabella vuota) .....

    Spero che questa ulteriore informazioni aiuti a dipanare la matassa.

    Grazie
    Dopo anni di programmazione amatoriale in VBA, ho deciso di passare a VB.NET

  4. #4
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Prova il codice di sotto.
    1) svuoto la tabella Access
    2) Leggo il file di testo delimitato
    3) Per ogni riga letta, esclusa l'intestazione, la inserisco in tabella

    codice:
    Private Property StringaConnessione As String = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0}", "C:\tmp\prova.mdb")
    
    Protected Sub Button1_Click(sender As Object, e As System.EventArgs) Handles Button1.Click
        Dim Connessione As OleDbConnection = Nothing
        Dim Comando As OleDbCommand = Nothing
        Dim Transazione As OleDbTransaction = Nothing
        Dim Sql As String = ""
    
    
        Try
            Connessione = New OleDbConnection(Me.StringaConnessione)
            Connessione.Open()
            Transazione = Connessione.BeginTransaction()
            Comando = Connessione.CreateCommand()
            Comando.Transaction = Transazione
    
            'cancello la tabella
            Delete(Comando)
            'leggo il file di testo
            ParserFile(Comando)
    
    
            Transazione.Commit()
            'Transazione.Rollback()
    
            l.MsgBox(Me, "Operazioni su database eseguite regolarmente")
    
    
        Catch ex As Exception
            If (Not (Transazione Is Nothing) AndAlso Not (Transazione.Connection Is Nothing)) Then Transazione.Rollback()
            l.MsgBox(Me, ex)
    
        Finally
            If (Not (Connessione Is Nothing)) Then Connessione.Close()
        End Try
    
    End Sub
    
    'cancello tutti i record di tabella1
    Private Sub Delete(ByVal Comando As OleDbCommand)
        Dim Sql As String = "DELETE FROM [tabella1] "
        Comando.CommandText = Sql
    
        Comando.Parameters.Clear()
        Comando.ExecuteNonQuery()
    
    End Sub
    
    
    'leggo il file di testo
    Private Sub ParserFile(comando As OleDbCommand)
        Using parser As New TextFieldParser("c:\tmp\tabella1.txt", Encoding.Default)
            parser.Delimiters = New String() {";"}
            parser.TrimWhiteSpace = True
    
            Do While Not parser.EndOfData
                Dim n As Long = parser.LineNumber
                Dim fields As String() = parser.ReadFields()
                'salto la 1° riga con l'intestazione campi
                If n = 1 Then Continue Do
                'insert in database
                Append(comando, fields)
    
            Loop
    
        End Using
    End Sub
    
    'insert in database riga letta da file di testo
    Private Sub Append(comando As OleDbCommand, fields As String())
        Dim sql As String = "INSERT INTO [tabella1] ( [id_comune], [nome_comune], [sigla_provincia], [nome_regione], [data]) VALUES (?,?,?,?,?) "
        comando.CommandText = sql
    
        comando.Parameters.Clear()
    
        comando.Parameters.Add("id_comune", OleDbType.Integer).Value = IIf(fields(0) = "", DBNull.Value, fields(0))
        comando.Parameters.Add("nome_comune", OleDbType.VarChar, 100).Value = IIf(fields(1) = "", DBNull.Value, fields(1))
        comando.Parameters.Add("sigla_provincia", OleDbType.VarChar, 2).Value = IIf(fields(2) = "", DBNull.Value, fields(2))
        comando.Parameters.Add("nome_regione", OleDbType.VarChar, 50).Value = IIf(fields(3) = "", DBNull.Value, fields(3))
        comando.Parameters.Add("data", OleDbType.Date).Value = DateTime.Now
    
        comando.ExecuteNonQuery()
    
    End Sub
    Pietro

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2013
    Messaggi
    74
    Grazie.

    Scusa per il ritardo nella risposta.
    Dopo anni di programmazione amatoriale in VBA, ho deciso di passare a VB.NET

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.