Newsgroup: it.comp.lang.visual-basic
Titolo: [?] - Database rovinato

    Ho creato un db come sotto
    Numero di tipo stringa  |  Frequenza di tipo Currency
    Nel campo numero ci salvo un a stringa di 1, 2, 3, 4 o 5 numeri separati
da uno spazio e con la formattazione obbligatoria a due caratteri (es. 4 =
04), in frequenza ci salvo una certa frequenza calcolata in un certo modo.
    L'operazione che faccio è semplice:
    in un ciclo che va da 1 a 1000 faccio le seguenti operazioni :
    apertura database
    apertura recordset con filtro per il numero che cerco ed in modalità
Dynaset
    verifica se numero trovato (quindi se recordset pieno)
    se recordset pieno allora frequenza = frequenza + 1
    altrimenti aggiungo numero e metto frequenza a 1
    chiudo recordset
    chiudo database
    passo ad esaminare numero successivo.
    A volte però il programma si blocca, perché dice che il db è già aperto,
ed esce. Vado a controllare il db tramite Access ed Acces mi dice che il db
è irriconoscibile e mi chiede di ripristinare.
    Mi sapreste dire come fare per non rovinare il db ?
    Visto che il db quando si rovina contiene circa 17000 record, potreste
dirmi come gestire correttamente db grandi ?
    Grazie 208.740.238.165.028.641.671.644.314.346 a chi mi da una mano
 
rdim...@tdi.it

Dimenticavo, il db che ho creato, non possiede ne filtri ne chiavi di nessun
genere. Cosa mi consigliate per velocizzare la ricerca su db grandi ?
        grazie (Come messaggio originale)^3297 a chi mi darà una mano
 
rdim...@tdi.it

    L'operazione che faccio è semplice:
[SNIP]
Non so se ho capito bene il problema ma come primo consiglio ti direi di aprire
il database all'avvio e chiuderlo una volta terminato il tuo ciclo; aprirlo e
chiuderlo tutte le volte e' inutile e rallenta il tutto, se poi possa causare
anche la corruzione dello stesso non l'ho mai provato ma non mi stupirei...
Quindi qualcosa tipo:
apertura db
for ...
    apertura recordset
    controlli vari
    chiusura recordset
next
chiusura db
Ciao
--
Luca Dormio
l...@ig-la.com
ldo...@tin.it

1 prova a non chiudere il data base ogni volta
cosa usi per accedere al data base?
se possibile inserisci le modifiche in una transazione
begintrans
....
committrans

 wrote in message
7qok18$bcf$1...@fe2.cs.interbusiness.it...

    scusa la mia ignoranza, ma stiamo parlando di VB ? Se si, indirizzami
come imparare ad usare le transazioni, o spiegami meglio che cosa sono,
perchè non ho capito cosa volevi dirmi.
    Comunque grazie. Da qualche parte qualcuno mi legge.

 anche la corruzione dello stesso non l'ho mai provato ma non mi
stupirei...
Apro e chiudo il db perché almeno così non mi dice che il db è già aperto.
Per quanto riguarda la velocità, è molto lento lo stesso. E' possibile che
con un PII 300 e 128 Mb di RAM perde circa 20 secondi per cercare una
stringa tra circa 17000 ?

    A volte però il programma si blocca, perché dice che il db è già


stringa tra circa 17000 ?
Dipende dal tipo di query (nel tuo campo stringa fai un '=' secco o un 'LIKE'?);
in ogni caso prova a mettere un indice sul campo di ricerca (meglio ancora una
chiave primaria se non hai problemi di duplicati)





> Se non e' troppo lungo potresti provare a postare il pezzo di codice
incriminato
    Mi connetto ad Internet dal negozio dove lavora un mio amico, ed ho i
sorgenti a casa. Ma domani mattina massimo per le 10:00 posto tutta la
funzione, cosě mi potete dire anche se il mio modo di programmare č
"Ortodosso" o se faccio casini che incasinano il povero programmino.

> Se non e' troppo lungo potresti provare a postare il pezzo di codice
incriminato
questa è la sub incriminata:
    Base      è il DB che deve essere aggiornato
    Tabella  è la tabella Access che deve essere aggiornata
    Uno, Due, Tre, Quattro, Cinque sono i numeri che devono essere
esaminati.
    p,o,i,u,y sono variabili intere dichiarate globali nel progetto
Sub Aggiorna(Base As String, Tabella As String, Uno As Integer, Due As
Integer, Tre As Integer, Quattro As Integer, Cinque As Integer)
Dim Db As Database
Dim Rs As Recordset
Dim Numeri(5) As Integer
Dim Merrore As String
    On Error Resume Next
    Numeri(1) = Uno
    Numeri(2) = Due
    Numeri(3) = Tre
    Numeri(4) = Quattro
    Numeri(5) = Cinque
    'Ordino i numeri inseriti in ordine crescente
    For i = 1 To 4
        For y = i + 1 To 5
            If Numeri(y) < Numeri(i) Then
                u = Numeri(y)
                Numeri(y) = Numeri(i)
                Numeri(i) = u
            End If
        Next y
    Next i
    If Numeri(1) = 0 Then Exit Sub
    'salvataggio dei dati
    'Salvataggio Ambate
    For i = 1 To 5
        Set Db = OpenDatabase(Base)
        Set Rs = Db.OpenRecordset("Select * From " & Tabella & " Where
Numero = '" & Format(Numeri(i), "00") & "'")
        If Not Rs.EOF Then
            Rs.Edit
            Rs("Frequenza") = Rs("Frequenza") + 1
            Rs.Update
        Else
            Rs.AddNew
            Rs("Numero") = Format(Numeri(i), "00")
            Rs("Frequenza") = 1
            Rs.Update
        End If
        Rs.Close: Db.Close
        If Err.Number <> 0 Then
            Merrore = "Errore " & Str(Err.Number) & " generato da " _
                    & Err.Source & Chr(13) & Err.Description
            MsgBox Merrore, vbCritical, "Errore"
        End If
        Err.Number = 0
    Next i
    'Salvataggio Ambi
    For i = 1 To 4
        For y = i + 1 To 5
            Set Db = OpenDatabase(Base)
            Set Rs = Db.OpenRecordset("Select * From " & Tabella & " Where
Numero = '" & Format(Numeri(i), "00") & " " & Format(Numeri(y), "00") & "'")
            If Not Rs.EOF Then
                Rs.Edit
                Rs("Frequenza") = Rs("Frequenza") + 1
                Rs.Update
            Else
                Rs.AddNew
                Rs("Numero") = Format(Numeri(i), "00") & " " &
Format(Numeri(y), "00")
                Rs("Frequenza") = 1
                Rs.Update
            End If
            Rs.Close: Db.Close
            If Err.Number <> 0 Then
                Merrore = "Errore " & Str(Err.Number) & " generato da " _
                        & Err.Source & Chr(13) & Err.Description
                MsgBox Merrore, vbCritical, "Errore"
            End If
            Err.Number = 0
        Next y
    Next i
    'Salvataggio Terni
    For i = 1 To 3
        For y = i + 1 To 4
            For u = y + 1 To 5
                Set Db = OpenDatabase(Base)
                Set Rs = Db.OpenRecordset("Select * From " & Tabella & "
Where Numero = '" & Format(Numeri(i), "00") & " " & Format(Numeri(y), "00")
& " " & Format(Numeri(u), "00") & "'")
                If Not Rs.EOF Then
                    Rs.Edit
                    Rs("Frequenza") = Rs("Frequenza") + 1
                    Rs.Update
                Else
                    Rs.AddNew
                    Rs("Numero") = Format(Numeri(i), "00") & " " &
Format(Numeri(y), "00") & " " & Format(Numeri(u), "00")
                    Rs("Frequenza") = 1
                    Rs.Update
                End If
                Rs.Close: Db.Close
                If Err.Number <> 0 Then
                    Merrore = "Errore " & Str(Err.Number) & " generato da "
_
                            & Err.Source & Chr(13) & Err.Description
                    MsgBox Merrore, vbCritical, "Errore"
                End If
                Err.Number = 0
            Next u
        Next y
    Next i
End Sub

questa è la sub incriminata:
[SNIP]
Ehmm... non vorrei farti preoccupare ma qui la tua routine funziona
perfettamente!
In Access ho creato una tabella "Test" con due colonne:
Numero - Testo(15)
Frequenza - Intero Lungo
e ho chiamato la tua sub con:
Aggiorna "C:\Atemp\dummy.mdb", "Test", 10, 33, 4, 21, 90
dopo averla lanciata 5 volte il risultato e' stato:
Numero Frequenza
04 - 5
04 10 - 5
04 10 33 - 5
04 10 35 - 5
04 10 90 - 5
04 33 - 5
04 33 35 - 5
04 33 90 - 5
04 35 - 5
04 35 90 - 5
04 90 - 5
10 - 5
10 33 - 5
10 33 35 - 5
10 33 90 - 5
10 35 - 5
10 35 90 - 5
10 90 - 5
33 - 5
33 35 - 5
33 35 90 - 5
33 90 - 5
35 - 5
35 90 - 5
90 - 5
che mi sembra sia corretto.
ovviamente non avevo i tuoi 17000 record di riferimento ma la sub ha fatto il
suo dovere senza errori (ho commentato 'On error...' all'inizio per essere
sicuro)
In un secondo momento ho cambiato la chiamata facendo eseguire 'Aggiorna' per
500 volte con 5 numeri random (da 1 a 90 giusto?):nessun problema; ho provato
anche ad aprire il DB all'inizio (subito dopo "If Numeri(1) = 0 Then Exit Sub")
e a chiuderlo in fondo alla routine eliminando quindi tutte le aperture/chiusure
intermedie: anche in questo caso nessun problema... non so che dirti... se mi
dici il tuo indirizzo email posso provare a mandarti il mio test (pochi Kb)
