• User Attivo

    aprire chiudere db

    Salve a tutti,
    ho una pagina asp, dove faccio una ricerca su più database, volevo sapere da voi se faccio giusto in questo modo:

    pseudo```

    //apro la connessione al primo db
    set conn = Server.CreateObject("ADODB.Connection")
    conn.Open("Provider = Microsoft.Jet.OLEDB.4.0; Data Source = "& server.MapPath("/mioDatabase/db1.mdb"))

    //apro il recordset
    set recset = Server.CreateObject("ADODB.Recordset")

    //faccio la query di ricerca e la eseguo
    set recset = conn.Execute("Select...

    //chiudo il recordset
    recset.Close
    set recset = Nothing

    //apro la connesione al secondo db
    set conn = Server.CreateObject("ADODB.Connection")
    conn.Open("Provider = Microsoft.Jet.OLEDB.4.0; Data Source = "& server.MapPath("/mioDatabase/db2.mdb"))

    //apro recordset
    set recset = Server.CreateObject("ADODB.Recordset")

    //eseguo query ricerca
    set recset = conn.Execute("Select...

    //chiudo recordset
    recset.Close
    set recset = Nothing

    chiudo la connessione
    conn.close
    set conn = nothing

    
    praticamente apro la connessione all'inizio, poi senza chiuderla, imposto il valore conn ad un nuovo oggetto.
    
    che dite? faccio qualche danneggio???
    
    Grazie, ciao.

  • Super User

    Per sicurezza puoi chiuderla prima di riaprirla.


  • User Attivo

    il problema a dire il vero sta nel fatto che il caricamento della pagina è molto lungo, figurati che con l'adsl mi mette quasi un minuto ad aprirla, penso che ci sia qualcosa che rallenti il caricamento della pagina, vorrei provare a fare come mi hai consigliato te, solo che mi ci vorrà parecchio tempo per fare le modifiche. Se avessi la certezza che dipende da questo, lo farei.

    Grazie per la risposta, ciao.


  • User Attivo

    @DarioMarco said:

    il problema a dire il vero sta nel fatto che il caricamento della pagina è molto lungo, figurati che con l'adsl mi mette quasi un minuto ad aprirla, penso che ci sia qualcosa che rallenti il caricamento della pagina, vorrei provare a fare come mi hai consigliato te, solo che mi ci vorrà parecchio tempo per fare le modifiche. Se avessi la certezza che dipende da questo, lo farei.

    Grazie per la risposta, ciao.

    99 su 100 la lentezza dipende o dalla query troppo pesante o da molti risultati restituiti al recordset.
    Che apri e chiudi prima o dopo non influenza più di tanto. Al massimo assorbe in modo diverso la memoria.


  • User Attivo

    è vero, query troppo pesanti, e molti recordset restituiti, purtroppo, ho cercato di limitare i campi su cui effettuare la ricerca, ma più di questo non posso, la restituzione dei recordset non dipende da me.
    Dal tronde, le ricerche devono essere soddisfacenti.
    Secondo te cosa potrei fare per migliorare un pò la situazione???

    grazie, ciao.


  • User Attivo

    quanti record vengono restituiti? Ti servono proprio tutti? Li spari tutti nelle pagina?


  • User Attivo

    no, non li sparo tutti nella pagina, ma devo sempre aprire un recordset per spulciarvi dentro...


  • User Attivo

    Ecco allora mi sa che è quello "spulciare" che ti rallenta tutto.
    Che operazioni ci fai sopra?


  • User Attivo

    Beh, adesso ti faccio mettere le mani ai capelli:D, questo è il codice di un solo database.

    
    //------------------------------------------------------------Database infoterritoriali
    set conn = server.createobject("ADODB.Connection")
    conn.open("Provider = Microsoft.Jet.OLEDB.4.0; Data Source = "& server.MapPath("/database/***.mdb"))
    //-----------------------------------------------------------Personaggi Storici
    set recset = Server.createobject("ADODB.Recordset")
    //gestione contatore
    set recCount = Server.CreateObject("ADODB.Recordset")
    set recCount = conn.execute ("Select count(*) as recTot from personaggiStorici") 
    
    if TipoDiRicerca = "FraseIntera" then
    
        sql = "SELECT * FROM personaggiStorici WHERE nome LIKE '%"&ParoleDaCercare&"%' OR nm LIKE '%"&ParoleDaCercare&"%' OR descrizione LIKE '%"&ParoleDaCercare&"%'"
    else    
        sql = "Select * FROM personaggiStorici Where(("
    
        x=0
        for each word in ArrSearch
            word = trim(word)
            sql = sql &  "nome LIKE '%"&word&"%' OR nm LIKE '%"&word&"%' OR descrizione LIKE '%"&word&"%'"
    sql = sql & ")"
    
            if Not x=UBound(ArrSearch) then sql = sql & cond &"("
                x = x+1
    
            next
    
            sql = sql & ")"
            sql=sql
            end if
    
    recset.Open sql, conn, 1, 3
    
    if recset.eof then 
        TrovatoRisultati = False
    else 
        TrovatoRisultati = True
        do while not recset.eof
        conto = lcase(recset("nome"))&lcase(recset("descrizione"))&lcase(recset("nm"))
        call contoParoleTrovate(conto)
        call mettiArr()
    
        //trova gli apici da mettere nella querystring
        nome = replace(recset("nome"),"'","%27%27")
        // sostituisci il segno - con a.C.
        if instr(recset("anno"),"-") > 0 then
            intAnno = replace(recset("anno"),"-","a.C. ")
            strAnno = split(intAnno," ")
            anno = strAnno(1)&strAnno(0)
        end if 
    
        //Aggiungi il risultato negli array
        ArrayRisultatiRicerca(ArrayPosizioneRisultati) = "<table width=""100%"" ><tr><td><a href='mioSito.it/storia/personaggistorici.asp?termine="&nome&"&cat=libera' target='_self'>"&recset("nome")&" - "&anno&"</a>    <em><font color=""#666666"" size=""2""> "&conteggio&" occorrenze trovate</font></em>   </td><td align=""right"" width=""120""><font size='2'><a href='mioSito.it/storia/personaggistorici.asp' target='_self'>Ricerca Avanzata</a></font></td><tr><td colspan=""2"">"&VbCrlf&"I personaggi storici dal 500 a.C. fino al 1900 d.C. </td></tr></table>"
    
        recset.movenext
        Loop
    
    //chiude if trovatoriusltato
    end if
    
    //contatore records in database
    recTot = recCount("recTot") + recTot
    //chiudo pulisco va chiuso ogni volta che si cambia tabella
    recCount.Close
    set recCount = nothing
    recset.Close
    set recset = nothing
    
    //----------------------------------------------------------- Fine Tabella
    
    // chiudo e pulisco la connessione va chiusa e riaperta ogni volta che si cambia database
    conn.Close
    set conn = nothing
    
    
    

    Purtoppo non posso eliminare nulla, che dici, sono proprio inguaiato???

    :ciauz:


  • User Attivo

    Ho dato un'occhiata al codice.
    Confermo la mia ipotesi sul fatto che il tutto rallenta per le operazioni che fai dopo e non per il recordset.

    L'uso degli array di sicuro ti rallenta.
    Poi non posso vedere alcune funzioni che chiami nel codice perchè non ci sono nel listato che hai incollato.
    Ti consiglio di cominciare ad isolare le cose.
    Commenta una alla volta le funzioni nel "do while not recset.eof"


  • User Attivo
    
    do while not recset.eof
    
    // somma tutte le occorrenze trovate tra i campi
        conto = lcase(recset("nome"))&lcase(recset("descrizione"))&lcase(recset("nm"))
    
    // chiama la funzione passando il parametro di sopra, serve per contare quane parole sono state trovate
    // la riporto sotto 
    call contoParoleTrovate(conto)
    
    // chiama una funzione che mette questa riga in un'array, che verrà stampato nella pagina
        call mettiArr()
    
    //questo passo non è molto importante, serve a sostituire alcuni caratteri che potrebbero darmi fastidio
        
    //trova gli apici da mettere nella querystring
        nome = replace(recset("nome"),"'","%27%27")
        // sostituisci il segno - con a.C.
        if instr(recset("anno"),"-") > 0 then
            intAnno = replace(recset("anno"),"-","a.C. ")
            strAnno = split(intAnno," ")
            anno = strAnno(1)&strAnno(0)
        end if 
    
    //qui mi costruisco un'array formato da una tabella, con i valori principali dei recordset trovati, con link alla pagina.
        //Aggiungi il risultato negli array
        ArrayRisultatiRicerca(ArrayPosizioneRisultati) = "<table width=""100%"" ><tr><td><a href='mioSito.it/storia/personaggistorici.asp?termine="&nome&"&cat=libera' target='_self'>"&recset("nome")&" - "&anno&"</a>    <em><font color=""#666666"" size=""2""> "&conteggio&" occorrenze trovate</font></em>   </td><td align=""right"" width=""120""><font size='2'><a href='mioSito.it/storia/personaggistorici.asp' target='_self'>Ricerca Avanzata</a></font></td><tr><td colspan=""2"">"&VbCrlf&"I personaggi storici dal 500 a.C. fino al 1900 d.C. </td></tr></table>"
    
        recset.movenext
    
        Loop 
    
    

    riporto qui le due funzioni:
    questa funzione ordina l'array tramite metodo bubble sort in base alle occorrenze trovate

    
    // conta quante parole sono state trovate
    Public function contoParoleTrovate(conto)
    
    corrCount = 0
        conteggio=0
        for each word In ArrSearch
            word = trim(word)
            word = lcase(word)
            tet=0
            for y=1 to len(conto)
                tet=instr(conto, word)
                if tet > 0 then
                    conteggio=conteggio+1 
                    conto=mid(conto,tet+1) 
                end if
            next
            corrCount=corrCount+1
        next
        
    end function
    
    ```questa funzione serve per mettere il risultato negli array, è stata fatta una funzione, per evitare la ripetizione di queste righe in tutti i database
    
    

    //Questa Sub evita le ripetizioni dentro le molteplici ricerche e contiene il codice per mettere il risultato negli array
    Public Sub mettiArr()

    //Calcola il totale dei file nei quali è stata effettuata la ricerca
    TotaleFileCercati = TotaleFileCercati + 1
    
    //Calcola il totale dei file trovati
    TotaleFileTrovati = TotaleFileTrovati + 1
    
    //Calcola che i file visualizzati non superino il numero di file da visualizzare per pagina
    If FileVisualizzati < (RecordsPerPagina + NumeroFile) and TotaleFileTrovati > FileVisualizzati Then
    
        //Incrementa il numero di file visualizzati
        FileVisualizzati = FileVisualizzati + 1
    
        //Mette i risultati della ricerca nell' Array dei risultati e calcola la posizione nell'Array del risultato ottenuto
        ArrayPosizioneRisultati = ArrayPosizioneRisultati + 1
    
    end if
    //Dichiara di aver trovato una corrispondenza
    CorrispondenzaTrovata = True
    

    end Sub

    
    Vorrei ringraziarti di cuore per il tuo interesse.
    un saluto.

  • User Attivo

    Purtroppo io non posso provare il codice ma mi sembra che sia un po incasinato.
    Per ottimizzarlo dovrei mettermi a testarlo.
    Isola il problema commentando righe di codice e funzioni. Così scopri chi è che perde troppo tempo.
    Almeno ci si focalizza solo su quello


  • User Attivo

    allora, io ad esempio, provo a fare a meno della funzione contoparole, se lo script va più veloce, vuol dire che il problema sta li, se no, provo ad isolare un'altra funzione, o a semplificarla al massimo o a bypassare parti del codice.

    Ti ringrazio, anche se ci vorrà del tempo, posterò in futuro il problema che troverò.

    Se vuoi comunque, posso inviarti il codice intero.

    Un saluto.


  • User Attivo

    Esatto devi fare proprio quello che hai detto.
    Purtroppo non ho molto tempo. Cerco di dare una mano quando richiede pochi minuti. Sono a lavoro e lo faccio nei ritagli di tempo.
    Trova la parte di codice che rallenta e magari si vede di ottimizzare quella.
    A mio avviso comunque fai troppi passaggi.
    Per riscrivere il codice bisognerebbe capire cosa deve fare la pagina e come sono strutturati i dati nel database...ci vorrebbe un po di tempo che non ho.
    Magari c'è qualcun altro disponibile.

    Ciao


  • User Attivo

    Ti ringrazio per la tua disponibilità, hai già fatto molto per aiutarmi.
    Un saluto.