• User Attivo

    Microsoft OLE DB Provider for ODBC Drivers error '8007000e'

    sul mio sito ho questo messaggio,

    Microsoft OLE DB Provider for ODBC Drivers error '8007000e'
    [Microsoft][ODBC Microsoft Access Driver] Not enough space on temporary disk.
    /offerte/Index.asp, line 8

    please, aiutatemi!

    il codice è:

    <%@LANGUAGE="VBSCRIPT"%>
    <!--#include virtual="/Connections/linkofferte.asp" -->
    <%
    Dim Recordset1
    Dim Recordset1_numRows

    Set Recordset1 = Server.CreateObject("ADODB.Recordset")
    Recordset1.ActiveConnection = MM_linkofferte_STRING
    Recordset1.Source = "SELECT testo FROM Url WHERE id=1"
    Recordset1.CursorType = 0
    Recordset1.CursorLocation = 2
    Recordset1.LockType = 1
    Recordset1.Open()

    Recordset1_numRows = 0

    [...cut by paocavo ...]

    <%
    Recordset1.Close()
    Set Recordset1 = Nothing
    %>


  • User

    prima dell'edit del messaggio ho visto che la parte che chiude i recordset era dopo il tag finale </html>. Io proverei a spostarli prima.
    Se questo non funziona, cercando su GG "Not enough space on temporary disk" (completo di virgolette) ci sono vari risultati che suggeriscono operazioni che può valere la pena provare.


  • Moderatore

    generalmente questo errore è causato quando l'utente IUSR non ha permessi nella directory dove vengono creati i file .tmp solitamente %windir%\temp\ o %systemdrive%\temp\

    Ciao:ciauz:


  • Moderatore

    Ho editato il primo post perchè supera il limite max di righe di codice che è possibile inserire in un singolo post. Leggete il regolamento ed le discussioni in evidenza (Sticky) poste in cime alla lista delle discussioni.

    Ritornando al tema della discussione ritengo che il problema sia nella gestione della apertura e chiusura dei recodset.
    fre2004 apre 5 recodset uno dietro l'atro e poi li chiude e distrugge (Set Recordset=Nothing) tutti insieme alla fine dello script.
    Prova a chiudere i recodset ed a porli a "Nothing", ad uno ad uno, subito dopo il loro utilizzo e prima di aprirne un altro.

    :ciauz:


  • User

    non ho mica detto che non dovevi editare 🙂

    in ogni caso scusa 🙂


  • User

    @paocavo said:

    Ritornando al tema della discussione ritengo che il problema sia nella gestione della apertura e chiusura dei recodset.
    fre2004 apre 5 recodset uno dietro l'atro e poi li chiude e distrugge (Set Recordset=Nothing) tutti insieme alla fine dello script.
    Prova a chiudere i recodset ed a porli a "Nothing", ad uno ad uno, subito dopo il loro utilizzo e prima di aprirne un altro.

    :ciauz:

    A mio parere...
    Sono nulla per il server.
    Non c'è nessuna differenza nel fare 5 close e 5 nothing oppure 5 close+nothing.

    My 2 cents

    P.S. Aggiungo questo: se in una funzione dichiari una variabile locale recordset, la apri e non la chiudi mai, comunque l'oggetto viene chiuso quando la funzione termina.
    Se invece usi 50 variabili globali, allora è importante chiudere il recordset: impostarlo a nothing non serve più di tanto. Al close non hai più una connessione attiva al db, che è quella che ti consuma risorse. vbscript non ha un garbage collector differito, come .NET.
    In .NET è vitale chiudere l'oggetto e rimuovere ogni riferimento all'oggetto stesso, pena uno spreco di risorse esagerato.
    Cioè, in vbscript/vb appena un oggetto non è più usato viene liberato (close + nothing).
    In .NET questa operazione viene fatta in un secondo momento, a piacimento del garbage collector, quindi anche dopo diversi minuti e quindi la risorsa rimane allocata.
    Quindi, in .NET se usi una variabile locale recordset, devi assicurarti che l'oggetto sia chiuso, anche nel caso si verifichi un'errore e la tua funzione sia terminata preventivamente (vale a dire, devi gestire nell'on error la chiusura di tutti gli oggetti).
    Una menata galattica.


  • Moderatore

    @vins78 said:

    A mio parere...
    Sono nulla per il server.
    Non c'è nessuna differenza nel fare 5 close e 5 nothing oppure 5 close+nothing.

    Dipende da cosa fai con i recordset è quanti record ciascuno di essi gestisce nella select. In ogni caso è buona norma disfarsi degli oggetti non più necessari non appena possibile sia per motivi di efficienza del codice sia per motivi di "efficacia" e "manutenibilità" dello stesso.

    Se invece usi 50 variabili globali, allora è importante chiudere il recordset: impostarlo a nothing non serve più di tanto.

    Infatti nel caso del nostro amico si tratta di Variabili Globali (tutte)

    Al close non hai più una connessione attiva al db, che è quella che ti consuma risorse. vbscript non ha un garbage collector differito, come .NET.
    In .NET è vitale chiudere l'oggetto e rimuovere ogni riferimento all'oggetto stesso, pena uno spreco di risorse esagerato.
    Cioè, in vbscript/vb appena un oggetto non è più usato viene liberato (close + nothing).
    In .NET questa operazione viene fatta in un secondo momento, a piacimento del garbage collector, quindi anche dopo diversi minuti e quindi la risorsa rimane allocata.
    Quindi, in .NET se usi una variabile locale recordset, devi assicurarti che l'oggetto sia chiuso, anche nel caso si verifichi un'errore e la tua funzione sia terminata preventivamente (vale a dire, devi gestire nell'on error la chiusura di tutti gli oggetti).

    Grazie per l'utilissimo mini-tutorial sul Garbage Collector di ASP.NET 😉

    :ciauz: