Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    361

    (VB6) ottimizzazzione codice import su db

    Ciao,
    ho creato una procedura per caricare in un db access il dettaglio della bolletta telefonica per poi eseguire delle query:
    il codice funziona senza nessun problema, ma essendo una bolletta la bellezza di 2 milioni di righe, un import risulta molto lento.
    Volevo sapere se qualcuno riesce a darmi qualche consiglio per ottimizzare il codice
    codice:
    Private Sub Command2_Click()
    Set conn = New ADODB.Connection
    conn.ConnectionString = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=C:\Documents and Settings\davide.gaulli\My Documents\autogrill\grill.mdb"
    conn.Open
    
    Dim linea As New ADODB.Recordset
    Dim dettagli As New ADODB.Recordset
    Dim chiamati As New ADODB.Recordset
    Dim presente As Boolean
    Dim identif As Integer
    Dim txfile() As String
    
    Query = "select * from linea;"
    linea.Open Query, conn, adOpenKeyset, adLockReadOnly
    
    Query = "select * from dettagli_traffico;"
    dettagli.Open Query, conn, 3, 3
    
    Query = "select * from chiamati;"
    chiamati.Open Query, conn, 3, 3
    
    Open "C:\Documents and Settings\davide.gaulli\My Documents\primobimestre.txt" For Input As #1
    Do While Not EOF(1)
       Line Input #1, record
       txfile = Split(record, ";")
       linea.MoveFirst
       Do While Not linea.EOF
          If linea("numero") = txfile(0) Then
             presente = True
             identif = linea(0)
             Exit Do
          End If
          linea.MoveNext
       Loop
       If presente = True Then
          dettagli.AddNew
          dettagli("idlinea") = identif
          dettagli("tipologia") = txfile(3)
          dettagli("data-ora") = CDate(datizza((txfile(5)))) & " " & CDate(txfile(6))
          dettagli("durata") = CDbl(txfile(7))
          dettagli("costo") = CCur(txfile(9))
          verifica = False
          chiamati.MoveFirst
          Do While Not chiamati.EOF
             If txfile(8) = chiamati("numero") Then
                verifica = True
                Exit Do
             End If
             chiamati.MoveNext
          Loop
          If verifica = False Then
             cont = cont + 1
             chiamati.AddNew
             chiamati("idchiamato") = cont
             chiamati("numero") = txfile(8)
             chiamati.Update
          End If
          dettagli("idchiamato") = chiamati("idchiamato")
          dettagli.Update
       End If
       presente = False
    Loop
    Close #1
    End Sub
    
    Private Function datizza(la_data As String)
    'Function per ottenere la data
    datizza = Mid(la_data, 7, 2) & "/" & Mid(la_data, 5, 2) & "/" & Mid(la_data, 1, 4)
    
    End Function
    Ad esempio, potrebbe velocizzare l'esecuzione dello scipt indicare il campo del record da aggiornare con il valore numerico invece che con il suo nome?
    es
    dettagli(0) = 1 invece che dettagli("id") = 1

    vi rigrazio in anticipo.
    Ciao

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2001
    Messaggi
    798
    dov'è il problema? sul file? Se è così salva il contenuto in una stringa con la funziona Input$(...) e poi fai la split in un array, quindi cicla sull'array e non più sul file, operazione che di per se è molto ma molto lenta.
    Ans.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2001
    Messaggi
    798
    questo poi non mi è chiaro...
    codice:
       Do While Not linea.EOF
          If linea("numero") = txfile(0) Then
             presente = True
             identif = linea(0)
             Exit Do
          End If
          linea.MoveNext
       Loop
    non basta una select con clausola Where?

    Non capisco poi xchè fai l'add con il recordset invece di fare una query di tipo Insert.

    Anche l'ultimo ciclo sul recorset non mi è chiaro... non basterebbe una select con clausola Where?
    Ans.

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    361
    Um, il file di txt da cui leggo è di 130MB (circa 2 milioni di righe) quindi caricarlo in un array nn è un operazione leggera.
    Il fatto comunque è che per come è strutturato adesso, il collo di bottiglia non è purtroppo l'hd che non viene granch'è usato.
    Quindi mi stai dicendo che è preferibile utilizzare comandi sql per popolare le tabelle o per fare delle ricerche.
    Pensavo che il fatto di dover aprire e chiudere continuamente una query fosse più lento che tenere una tabella aperta e scorrerla.
    Per questo nn ho problemi ad implementarlo.
    Quanto a popolare la tabella via sql, ci devo lavorare un pochino.
    Grazie comunque.
    Se qualcun'altro ha qualche idea x velocizzarlo ulteriormente, sono interessatissimo.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2001
    Messaggi
    798
    il file di txt da cui leggo è di 130MB (circa 2 milioni di righe)
    Questo è il problema maggiore, impiegherà sempre tanto tempo la tua procedura. Troppo grande il file da trattare.

    Pensavo che il fatto di dover aprire e chiudere continuamente una query fosse più lento che tenere una tabella aperta e scorrerla.
    Non devi aprire e chiudere nulla, devi usare l'oggetto connection per farti ritornare il recorset, vuoto o pieno dipende se la where è soddisfatta o meno. Tu invece cicli ad ogni iterazione i recordset fino a quando non trovi cio' che ti interessa, e questo non credi che sia lento rispetto ad una select mirata?

    Quanto a popolare la tabella via sql, ci devo lavorare un pochino.
    Si tratta di fare una semplice insert con l'oggetto connection.
    Ans.

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    361
    ok
    io ho sempre popolato le tabelle in questo modo,
    non riesci a postarmi un esempio stupido per fare un isert con sql ad una tabella?

  7. #7
    Utente di HTML.it L'avatar di Jupy64
    Registrato dal
    Sep 2004
    Messaggi
    1,151
    Ciao, ma il file di testo è creato da te o ti viene passato da altri?
    Se lo crei tu (o hai la possibilità di fartelo avere formattato come vuoi tu), farmatta le righe in modo da non doverle elaborare poi per l'inserimento via sql...
    Per quanto riguarda come usare le query vedi qui: http://www.html.it/sql/
    Jupy

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    361
    :P
    purtroppo il file viene passato, quindi alcune operazioni le dovrò sempre fare (tipo la conversione delle date etc) e lunico modo x farlo è quello di uno script (causa dei circa due milioni di righe x file.
    X sql, la sintassi la conosco un po', era come integrarla in vb che mi disorienta.
    L'unico modo in cui ho utilizzato sql dentro a vb è per fare query tipo:
    codice:
    Set conn = New ADODB.Connection
    conn.ConnectionString = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=C:\Documents and Settings\Administrator\db.mdb"
    conn.Open
    Dim chiamati As New ADODB.Recordset
    query = "select * from chiamati1 where numero = '" & txfile(8) & "';"
    chiamati.Open query, conn, 3, 3
    che ho sostituito ai 2 do del mio codice
    x inserire un nuovo record, come mi comporto?

  9. #9
    Utente di HTML.it L'avatar di Jupy64
    Registrato dal
    Sep 2004
    Messaggi
    1,151
    per inserire record usa direttamente l'oggetto connection:

    codice:
    query = "INSERT INTO TuaTabella (campo1, campo2, campo3,..campoN) VALUES (valore1, valore2, valore3,..valoreN)"
    conn.Execute query, , adExecuteNoRecords
    Ricordati che i valori stringa vanno tra apici e il valore stringa non deve contenere apici singoli...
    Jupy

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    361
    um, mi piace questo modo di seguire i comandi sql
    volendo posso in qualche modo utilizzare questo metodo anche per le query o devo aprirla per forza come ho postato prima?

    Grazie mille comunque

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.