2010-10-01 22 views
5

No sé cómo puedo devolver un conjunto de registros legible de una función en ASP clásico.Regrese conjunto de registros de la función en ASP clásico

Esto es lo que se me ocurrió, pero que no está funcionando:

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 línea Response.Write Count.Fields(0).Value produce el error Item cannot be found in the collection corresponding to the requested name or ordinal..

Reemplazando con Response.Write Count.Status Aparece el error Operation is not allowed when the object is closed..

Al agregar Count.Open aparece el error The connection cannot be used to perform this operation. It is either closed or invalid in this context..

Edición después de la respuesta de Mark B:

que ya se veía en registros desconectados, pero no sé cómo usarlos en mi ejemplo: cada tutorial alimenta la consulta directamente en el conjunto de registros con Recordset.Open, pero Estoy usando consultas parametrizadas, e incluso tratando de muchas maneras no pude obtener el mismo resultado cuando hay un ADODB.Command en el camino.

¿Qué debo hacer?

Gracias de antemano.


Aquí está la solución basada en la respuesta de Eduardo Molteni:

La función que interactúa con la base de datos:

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 

El código que llama a la función:

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

Su porción final del código no se encuentra 'Response.CodePage = 65001'. – AnthonyWJones

Respuesta

4

Aquí es una función que devuelve un conjunto de registros desconectado

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

Tu código funciona perfectamente, gracias. – Albireo

+0

Sé que esta es una publicación anterior, pero ¿cómo puedo lograr lo mismo en JScript? No puedo hacer "rs.Open cmd,, adOpenForwardOnly, adLockReadOnly" con un parámetro vacío para Connection. Aparece el error "No se puede cambiar la propiedad ActiveConnection de un objeto Recordset que tiene un objeto Command como origen". – jpmorin

+0

@jpmorin: Lo siento pero no sé JScript.¿Por qué no mantienes esta función en VBScript? Creo que puede tener scripts mixtos ... –

0

Bueno, está cerrando el conjunto de registros y la conexión inmediatamente después de establecer la variable de retorno de la función, de modo que se explican los mensajes de error.

No soy un desarrollador de VB, pero creo que lo que debe ver es Disconnected Recordsets. Eche un vistazo al this article, está haciendo exactamente lo que usted quiere.

+0

Hola, ya he visto los conjuntos de registros desconectados, debería haberlo mencionado, pero no sé cómo usarlos en mi ejemplo: cada tutorial alimenta la consulta directamente en el conjunto de registros con 'Recordset.Open', pero estoy usando consultas parametrizadas, e incluso intentando muchas formas, no pude obtener el mismo resultado cuando hay un 'ADODB.Command' en el camino. – Albireo

+0

Creo que necesitas editar tu pregunta e incluir toda esa información, entonces alguien con más conocimientos de VB que yo podría ayudarte. –