2010-10-01 32 views
5

Je suis à une perte sur la façon dont je peux retourner un jeu d'enregistrements lisibles à partir d'une fonction dans ASP classique.Renvoyer jeu d'enregistrements à partir de la fonction dans ASP classique

C'est ce que je suis venu avec, mais il ne fonctionne pas:

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 ligne Response.Write Count.Fields(0).Value cède l'erreur Item cannot be found in the collection corresponding to the requested name or ordinal.. Remplacement avec Response.Write Count.Status Je reçois l'erreur Operation is not allowed when the object is closed.. L'ajout de Count.Open donne l'erreur The connection cannot be used to perform this operation. It is either closed or invalid in this context..

Modifier après la réponse de Mark B:

Je l'ai déjà regardé recordsets mode déconnecté, mais je ne sais pas comment les utiliser dans mon exemple: chaque tutoriel alimente la requête directement dans le jeu d'enregistrements avec Recordset.Open, mais je J'utilise des requêtes paramétrées, et même en essayant de nombreuses façons, je ne pouvais pas obtenir le même résultat quand il y avait un ADODB.Command dans le chemin.

Que dois-je faire?

Merci d'avance.


est ici la solution basée sur la réponse de Eduardo Molteni:

La fonction qui interagit avec la base de données:

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 

Le code qui appelle la fonction:

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

Votre morceau final de code est manquant 'Response.CodePage = 65001'. – AnthonyWJones

Répondre

4

Voici une fonction qui renvoie un jeu d'enregistrements déconnecté

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

Votre code fonctionne parfaitement, merci. – Albireo

+0

Je sais que c'est un ancien article, mais comment puis-je obtenir la même chose dans JScript? Je ne peux pas faire "rs.Open cmd,, adOpenForwardOnly, adLockReadOnly" avec un paramètre vide pour la connexion. Je reçois l'erreur "Impossible de modifier la propriété ActiveConnection d'un objet Recordset qui a un objet Command comme source." – jpmorin

+0

@jpmorin: Désolé mais je ne connais pas JScript.Pourquoi ne gardez-vous pas simplement cette fonction est VBScript? Je crois que vous pouvez avoir des scripts mixtes ... –

0

Eh bien, vous fermez le jeu d'enregistrements et la connexion immédiatement après avoir défini la variable de retour de la fonction, ce qui explique les messages d'erreur.

Je ne suis pas un développeur VB, mais je pense que ce que vous devez regarder est Disconnecté Recordsets. Jetez un oeil à this article, il fait à peu près exactement ce que vous voulez.

+0

Salut, j'ai déjà regardé les jeux d'enregistrements déconnectés - j'aurais dû le mentionner - mais je ne sais pas comment les utiliser dans mon exemple: chaque tutoriel transmet la requête directement dans le jeu d'enregistrements avec 'Recordset.Open', mais je suis en utilisant des requêtes paramétrées, et même en essayant de nombreuses façons, je ne pouvais pas obtenir le même résultat quand il y avait un 'ADODB.Command' dans le chemin. – Albireo

+0

Je pense que vous devez modifier votre question et inclure toutes ces informations, alors quelqu'un avec plus de connaissances VB que moi pourrait être en mesure d'aider. –