2010-10-01 18 views
5

Non riesco a restituire un recordset leggibile da una funzione nel classico ASP.Restituire il recordset dalla funzione nel classico ASP

Questo è quello che mi è venuta, ma non funziona:

Response.Clear 
Response.CharSet = "utf-8" 
Response.ContentType = "text/plain" 

Dim Count 

Set Count = Test 

Response.Write Count.Fields(0).Value 


Function Test 

    Dim Query, Connection, Command, Recordset 

    Query = " blah blah blah " 

    Set Connection = Server.CreateObject("ADODB.Connection") 
    Set Command = Server.CreateObject("ADODB.Command") 
    Set Recordset = Server.CreateObject("ADODB.Recordset") 

    Connection.ConnectionString = "blah blah blah" 
    Connection.Open 

    Set Command.ActiveConnection = Connection 
    Command.CommandText = Query 

    Set Recordset = Command.Execute 

    Set Test = Recordset 

    Recordset.Close 
    Connection.Close 

    Set Recordset = Nothing 
    Set Command = Nothing 
    Set Connection = Nothing 

End Function 

La linea Response.Write Count.Fields(0).Value cede l'errore Item cannot be found in the collection corresponding to the requested name or ordinal..

Sostituirlo con Response.Write Count.Status Viene visualizzato l'errore Operation is not allowed when the object is closed..

L'aggiunta di Count.Open dà l'errore The connection cannot be used to perform this operation. It is either closed or invalid in this context..

Modifica dopo la risposta di Mark B:

ho già guardato record disconnessi, ma non so come usarli nel mio esempio: ogni esercitazione alimenta la query direttamente nel set di record con Recordset.Open, ma io sto usando le query parametrizzate, e anche provando in molti modi non sono riuscito a ottenere lo stesso risultato quando c'è un ADODB.Command nel modo.

Cosa devo fare?

Grazie in anticipo.


Ecco la soluzione basata sulla risposta di Eduardo Molteni:

La funzione che interagisce con il database:

Function Test 

    Dim Connection, Command, Recordset 

    Set Connection = Server.CreateObject("ADODB.Connection") 
    Set Command = Server.CreateObject("ADODB.Command") 
    Set Recordset = Server.CreateObject("ADODB.Recordset") 

    Connection.ConnectionString = "blah blah blah" 
    Connection.Open 

    Command.ActiveConnection = Connection 
    Command.CommandText = "blah blah blah" 

    Recordset.CursorLocation = adUseClient 
    Recordset.Open Command, , adOpenForwardOnly, adLockReadOnly 

    Set Recordset.ActiveConnection = Nothing 

    Set Test = Recordset 

    Connection.Close 

    Set Recordset = Nothing 
    Set Command = Nothing 
    Set Connection = Nothing 

End Function 

Il codice che chiama la funzione:

Response.Clear 
Response.CharSet = "utf-8" 
Response.ContentType = "text/plain" 

Dim Recordset 

Set Recordset = Test 

Response.Write Recordset.Fields(0).Value 

Recordset.Close 

Set Recordset = Nothing 
+0

tuo pezzo finale di codice manca 'Response.CodePage = 65001'. – AnthonyWJones

risposta

4

Ecco una funzione che restituisce un recordset disconnesso

Function RunSQLReturnRS(sqlstmt, params()) 
    On Error Resume next 

    ''//Create the ADO objects 
    Dim rs , cmd 
    Set rs = server.createobject("ADODB.Recordset") 
    Set cmd = server.createobject("ADODB.Command") 

    ''//Init the ADO objects & the stored proc parameters 
    cmd.ActiveConnection = GetConnectionString() 
    cmd.CommandText = sqlstmt 
    cmd.CommandType = adCmdText 
    cmd.CommandTimeout = 900 

    ''// propietary function that put params in the cmd 
    collectParams cmd, params 

    ''//Execute the query for readonly 
    rs.CursorLocation = adUseClient 
    rs.Open cmd, , adOpenForwardOnly, adLockReadOnly 
    If err.number > 0 then 
     BuildErrorMessage() 
     exit function 
    end if 

    ''// Disconnect the recordset 
    Set cmd.ActiveConnection = Nothing 
    Set cmd = Nothing 
    Set rs.ActiveConnection = Nothing 

    ''// Return the resultant recordset 
    Set RunSQLReturnRS = rs 

End Function 
+0

Il tuo codice funziona perfettamente, grazie. – Albireo

+0

So che questo è un vecchio post, ma come posso ottenere lo stesso in JScript? Non riesco a eseguire "rs.Open cmd,, adOpenForwardOnly, adLockReadOnly" con un parametro vuoto per la connessione. Viene visualizzato l'errore "Impossibile modificare la proprietà ActiveConnection di un oggetto Recordset che ha un oggetto Command come origine." – jpmorin

+0

@jpmorin: Scusa ma non conosco JScript.Perché non tieni semplicemente questa funzione in VBScript? Credo che tu possa avere script misti ... –

0

Bene, si sta chiudendo il recordset e la connessione immediatamente dopo aver impostato la variabile di ritorno della funzione, in modo da spiegare i messaggi di errore.

Non sono uno sviluppatore VB, ma penso che ciò che è necessario guardare è Recordset disconnessi. Dai uno sguardo allo this article, sta facendo esattamente quello che vuoi.

+0

Ciao, ho già guardato i recordset disconnessi - avrei dovuto dirlo - ma non so come usarli nel mio esempio: ogni tutorial alimenta la query direttamente nel recordset con 'Recordset.Open', ma io sono utilizzando query parametrizzate, e anche provando in molti modi non ho potuto ottenere lo stesso risultato quando c'è un 'ADODB.Command' nel modo. – Albireo

+0

Penso che sia necessario modificare la domanda e includere tutte quelle informazioni, quindi qualcuno con più conoscenza VB di me potrebbe essere in grado di aiutare. –