+ Rispondi al Thread
Pagina 1 di 2 12 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12

Discussione: [ASP]Errore Rs.Open - Dov'è?!

  1. #1
    L'avatar di daniele-puma
    daniele-puma non è in linea Scolaretto
    Luogo
    Milano
    Post
    262

    [ASP]Errore Rs.Open - Dov'è?!

    Ciao!

    Ho una tabella, dalla quale devo estrarre il totale dei record, e il totale raggruppato per IP, per ottenere il classico visite ricevute ed il raggruppamento per utenti.

    La procedura Sql funziona correttamente sul server.

    Qualcuno sa indicarmi/spiegarmi dove l'errore:

    Asp:
    codice:
    strCn = "Provider=sqlOleDB; Network Library=DBMSSOCN; Data Source=[TOLTO PER PRIVACY],1433; Initial Catalog=[TOLTO PER PRIVACY]; User Id=[TOLTO PER PRIVACY]; Password=[TOLTO PER PRIVACY];"
    Set Cn = Server.CreateObject("ADODB.Connection")
    Set Rs = Server.CreateObject("ADODB.Recordset")
    Cn.open strCn
    
    strSql = "EXEC sel_contatore_ip"
    Response.Write strSql
    'Response.end
    Rs.Open strSql, Cn ' ERRORE QUI - NON APRE IL RECORDSET
    If Not Rs.Eof Then
    	Response.Write Rs(0)
    End If
    Rs.Close
    Stored Procedure:
    codice:
    USE [TOLTO PER PRIVACY]
    GO
    
    IF EXISTS(SELECT name FROM sysobjects WHERE name = 'sel_contatore_ip')
    drop procedure sel_contatore_ip
    GO
    
    CREATE PROCEDURE sel_contatore_ip
    AS
    
    DECLARE
    	@w_conteggio		VARCHAR(5)
    ,	@w_conteggioIP		VARCHAR(5)
    
    SELECT	@w_conteggio		= COUNT(ID)
    FROM	tblContatore
    
    SELECT	IP AS IPCOUNT
    INTO         #TEMP
    FROM	tblContatore
    GROUP BY IP
    
    SELECT	@w_conteggioIP		= COUNT(IPCOUNT)
    FROM	#TEMP
    
    DROP TABLE #TEMP
    
    SELECT  @w_conteggio, @w_conteggioIP
    
    GRANT EXECUTE ON sel_contatore_ip TO public
    GO
    Ringrazio già da ora per quanti risponderanno!
    Daniele Puma
    http://www.danielepuma.com

    Se l'intervento ti è stato utile, clicca su .

  2. #2
    Luogo
    Lazio
    Post
    1,599
    Blogs
    21
    Quote Originariamente inviato da daniele-puma Visualizza il messaggio
    Ciao!
    ...........
    Ciao,

    usa un command per richiamare le sp ed inserisci SET NOCOUNT ON nella sp

    P.S.
    se non sai come si fa cerca "adCmdStroredProc" nella sezione del vb6

    HTH
    Ultima modifica di sspintux; 15-03-2008 11:40 
    Ciao sspintux
    ------------------------------------------------------------

    O Santo Protettore dell'informatico quadratico medio, se puoi allontana da me questo cetriolo amaro!
    Azz! ... questo è un grande porck-around; potremmo addirittura farlo passare per una funzionalità avanzata

  3. #3
    L'avatar di daniele-puma
    daniele-puma non è in linea Scolaretto
    Luogo
    Milano
    Post
    262
    Ho provato come indichi con un oggetto command. Un errore differente:
    - Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another.

    Set Cmd = Server.CreateObject("ADODB.Command")
    Set Rs = Server.CreateObject("ADODB.Recordset")

    Cmd.ActiveConnection = strCn
    Cmd.CommandText = "EXEC sel_contatore_ip"
    Cmd.CommandTimeout = 15
    Cmd.CommandType = adCmdText

    Set Rs = Cmd.Execute()
    If Not Rs.Eof Then
    Response.Write Rs(0)
    End If
    Perchè non può andare il primo esempio, con Rs.Open... Dove è il problema, nel codice ASP oppure logico in SP (..nel Sql mi estrae correttamente un record con i due campi valorizzati!)?
    Daniele Puma
    http://www.danielepuma.com

    Se l'intervento ti è stato utile, clicca su .

  4. #4
    Luogo
    Lazio
    Post
    1,599
    Blogs
    21

    Thumbs down

    Quote Originariamente inviato da daniele-puma Visualizza il messaggio
    Ho provato come indichi con un oggetto command. Un errore differente:
    - Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another.
    questo errore è probabilmente dovuto al fatto che non hai incluso adovb.inc
    per cui adCmdText vale 0 invece di 1;

    ...prova così:

    codice:
    dim sCn, Rs , Cmd
    
    sCn=<tua stringa di connessione>
    
    set Cmd=Server.CreateObject("ADODB.Command")
    
    With Cmd
       .ActiveConnection=sCn
       .CommandType=4 'adCmdStoredProc
       .CommandText="sel_contatore_ip"
        Set  Rs=.Execute()
    End With
    
    etc...
    Quote Originariamente inviato da daniele-puma Visualizza il messaggio
    Perchè non può andare il primo esempio, con Rs.Open...)?
    ...credo che dovrebbe funzionare anche come hai fatto tu, ma mi sembra una forzatura
    visto che si ha a disposizione il Command che permette di specificare anche i parametri
    di una sp senaz bisogno di costruirsi una stringa da codice
    Ciao sspintux
    ------------------------------------------------------------

    O Santo Protettore dell'informatico quadratico medio, se puoi allontana da me questo cetriolo amaro!
    Azz! ... questo è un grande porck-around; potremmo addirittura farlo passare per una funzionalità avanzata

  5. #5
    L'avatar di daniele-puma
    daniele-puma non è in linea Scolaretto
    Luogo
    Milano
    Post
    262
    Provato...

    Set Cmd = Server.CreateObject("ADODB.Command")
    Set Rs = Server.CreateObject("ADODB.Recordset")
    set Cmd = Server.CreateObject("ADODB.Command")

    strCn = "Provider=sqlOleDB; Network Library=DBMSSOCN; Data Source=....."

    With Cmd
    .ActiveConnection = strCn
    .CommandType = 4
    .CommandText = "sel_contatore_ip"
    Set Rs = .Execute()
    End With

    If Not Rs.Eof Then
    Response.Write Rs(0)
    End If
    Ho provato il codice, ed il problema è lo stesso, nell' If Not Rs.Eof Then va in errore.
    Daniele Puma
    http://www.danielepuma.com

    Se l'intervento ti è stato utile, clicca su .

  6. #6
    Luogo
    Lazio
    Post
    1,599
    Blogs
    21
    Quote Originariamente inviato da daniele-puma Visualizza il messaggio
    Provato...



    Ho provato il codice, ed il problema è lo stesso, nell' If Not Rs.Eof Then va in errore.
    ...mi sembra che almeno ora riesca ad eseguire la Cmd.Execute o sbaglio ?

    ...il testo dell'errore è qualcosa tipo : "non puoi farlo perchè il recordset è chiuso" ?

    se sì devi inserire SET NOCOUNT ON nella sp
    oppure , in alternativa, spostarti tra i recordset (metodo NextRecordset) fino a trovare quello aperto
    ( ma è meglio usare set nocount)

    HTH
    Ultima modifica di sspintux; 15-03-2008 17:56 
    Ciao sspintux
    ------------------------------------------------------------

    O Santo Protettore dell'informatico quadratico medio, se puoi allontana da me questo cetriolo amaro!
    Azz! ... questo è un grande porck-around; potremmo addirittura farlo passare per una funzionalità avanzata

  7. #7
    L'avatar di daniele-puma
    daniele-puma non è in linea Scolaretto
    Luogo
    Milano
    Post
    262
    Si, l'errore è dovuto al fatto che l'Rs risulta chiuso.

    Ho già inserito il NoCount da quando mi hai post la prima risposta.

    Ho provato con il Do While .. Loop ma l'errore è lo stesso.

    Non riesco a capire perchè non apre l'Rs.. dato che da SQL funge; potrebbe essere un problema dovuto all'esecuzione nella #TEMP o qualcosa di simile?! Non so più cosa provare!
    Daniele Puma
    http://www.danielepuma.com

    Se l'intervento ti è stato utile, clicca su .

  8. #8
    Luogo
    Lazio
    Post
    1,599
    Blogs
    21
    Quote Originariamente inviato da daniele-puma Visualizza il messaggio
    Si, l'errore è dovuto al fatto che l'Rs risulta chiuso.

    Ho già inserito il NoCount da quando mi hai post la prima risposta.

    Ho provato con il Do While .. Loop ma l'errore è lo stesso.

    Non riesco a capire perchè non apre l'Rs.. dato che da SQL funge; potrebbe essere un problema dovuto all'esecuzione nella #TEMP o qualcosa di simile?! Non so più cosa provare!

    Ciao Daniele-Puma,

    la questione incomincia a farsi strana

    proviamo ad eseguire i seguenti due tests :

    Test 1) lo scopo è verificare se il recorset viene creato correttamente... condizione 'sine qua non'

    codice:
    dim sCn,Cn,tmpCmd,tmpRs,sSql
    
    sCn = <tua stringa di connessione>
    
    Response.Write "Prima di apertura recordset..." & " <BR>"
    
    Set tmpCmd = Server.CreateObject("ADODB.Command")
    
    With tmpCmd
        .ActiveConnection = sCn
        .CommandType = 4 'adCmdStoredProc
        .CommandText =   "sp_Test_1"
        .CommandTimeout = 15
         Set tmpRs = .Execute()
    End With
    
    Response.Write "Creazione recordset OK..."  & " <BR>"
    
    Response.End
    ...se non ti compare "Creazione recordset OK..." è inutile continuare con quanto segue.


    Test 2) lo scopo è trovare il recordset aperto tra tutti quelli che ti ritorna la tua sp
    ... e mi sembra strano che ci siano quelli chiusi se hai inserito SET NOCOUNT ON nella tua sp (che in effetti non sembra delle migliori)


    codice:
    dim sCn,Cn,tmpCmd,tmpRs,sSql
    
    sCn = <tua stringa di connessione>
    
    Response.Write "Prima di apertura recordset..." & " <BR>"
    
    Set tmpCmd = Server.CreateObject("ADODB.Command")
    
    With tmpCmd
        .ActiveConnection = sCn
        .CommandType = 4 'adCmdStoredProc
        .CommandText =   "sp_Test_1"
        .CommandTimeout = 15
         Set tmpRs = .Execute()
    End With
    
    Response.Write "Apertura recordset OK..."  & " <BR>"
    
    '''Response.End
    
    dim i
    
    i=0
    while (tmpRs.state & 0 = 0) and (i<>-1)
        i=i+1
        Response.Write "tmpRs N " & i & " Closed..."  & " <BR>"
        set tmpRs=tmpRs.NextRecordset
        if tmpRs is Nothing then i=-1         
    wend
    
    if tmpRs is Nothing then 
       Response.Write "AZZ!!! tmpRs is Nothing"
       Response.End
    end if
    
    
    if not tmpRs.EOF then
        Response.Write "EUREKA!!! tmpRs.Fields(0)=" & tmpRs.Fields(0)  & " <BR>"
    else
        Response.Write "AZZ!!!...tmpRs.EOF=True" & " <BR>"
    end if
    
    Response.End
    ...riporta cosa vedi nel browser nei due tests ed anche eventuali descrizioni di errori
    Ultima modifica di sspintux; 15-03-2008 21:43 
    Ciao sspintux
    ------------------------------------------------------------

    O Santo Protettore dell'informatico quadratico medio, se puoi allontana da me questo cetriolo amaro!
    Azz! ... questo è un grande porck-around; potremmo addirittura farlo passare per una funzionalità avanzata

  9. #9
    L'avatar di daniele-puma
    daniele-puma non è in linea Scolaretto
    Luogo
    Milano
    Post
    262
    Funziona stavolta!

    Browser:
    Prima di apertura recordset...
    Apertura recordset OK...
    tmpRs N 1 Closed...
    EUREKA!!! tmpRs.Fields(0)=1192
    EUREKA!!! tmpRs.Fields(1)=474
    Ti ringrazio, anche se non ho ancora capito perchè non funzionava in precedenza.
    Sicuramente fare il debug è una buona alternativa.. cosa che sottovaluto spesso.

    Adatterò il codice! ..però lo farò domani mattina, ora vado a nanna!
    Daniele Puma
    http://www.danielepuma.com

    Se l'intervento ti è stato utile, clicca su .

  10. #10
    L'avatar di daniele-puma
    daniele-puma non è in linea Scolaretto
    Luogo
    Milano
    Post
    262
    ..si, lo so, avevo detto che andava a letto e invece sono ancora qui..!

    Funziona tutto.. Questa news solo per conoscenza.. ho notato che mi genera l'errore se elimino la seguente parte di codice:
    i = 0
    While (tmpRs.state & 0 = 0) and (i<>-1)
    i = i + 1
    set tmpRs = tmpRs.NextRecordset
    if tmpRs is Nothing then i = -1
    wend
    Ringrazio!
    Daniele Puma
    http://www.danielepuma.com

    Se l'intervento ti è stato utile, clicca su .

+ Rispondi al Thread
Pagina 1 di 2 12 ultimoultimo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi