2010-10-01 4 views
5

Ich bin ratlos, wie ich ein lesbares Re-Cord-Set von einer Funktion in klassischem ASP zurückgeben kann. DieseGibt Re-Cord-Set aus Funktion in klassischem ASP zurück

ist, was ich kam mit, aber es funktioniert nicht:

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 

Die Response.Write Count.Fields(0).Value Linie ergibt den Item cannot be found in the collection corresponding to the requested name or ordinal. Fehler.

Ersetzen Sie es mit Response.Write Count.Status Ich bekomme den Operation is not allowed when the object is closed. Fehler.

Hinzufügen Count.Open gibt den The connection cannot be used to perform this operation. It is either closed or invalid in this context. Fehler.

bearbeiten, nachdem Mark B Antwort:

ich bereits bei nicht verbundenen Datensatz gesucht, aber ich weiß nicht, wie sie in meinem Beispiel verwenden: jedes Tutorial führt die Abfrage direkt in den Re-Cord mit Recordset.Open, aber ich benutze parametrisierte Abfragen und versuche sogar viele Möglichkeiten, das gleiche Ergebnis nicht zu erhalten, wenn ein ADODB.Command im Weg ist.

Was soll ich tun?

Vielen Dank im Voraus.


Hier ist die Lösung auf Basis von Eduardo Molteni Antwort:

Die Funktion, die mit der Datenbank interagiert:

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 

Der Code, der die Funktion aufruft:

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

Ihr letztes Stück Code gibt 'Response.CodePage = 65001'. – AnthonyWJones

Antwort

4

Hier ist eine Funktion, die ein getrenntes Recordset fehlt

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

Ihr Code funktioniert perfekt, danke. – Albireo

+0

Ich weiß, das ist ein alter Beitrag, aber wie kann ich dasselbe in JScript erreichen? Ich kann "rs.Open cmd,, adOpenForwardOnly, adLockReadOnly" nicht mit einem leeren Parameter für die Verbindung tun. Ich erhalte den Fehler "Kann die ActiveConnection-Eigenschaft eines Recordset-Objekts, das ein Command-Objekt als Quelle hat, nicht ändern." – jpmorin

+0

@jpmorin: Sorry, aber ich kenne JScript nicht.Warum behalten Sie diese Funktion nicht einfach VBScript? Ich glaube, Sie können gemischte Skripts haben ... –

0

Nun, Sie schließen das Recordset und die Verbindung sofort nach dem Festlegen der Rückgabevariable der Funktion, so dass die Fehlermeldungen erläutert werden.

Ich bin kein VB-Entwickler, aber ich denke, was Sie sehen müssen, ist Disconnected Recordsets. Schauen Sie sich this article an, es macht ziemlich genau das, was Sie wollen.

+0

Hallo, ich habe bereits getrennte Recordsets betrachtet - ich hätte es erwähnen sollen -, aber ich weiß nicht, wie man sie in meinem Beispiel benutzt: jedes Tutorial füttert die Abfrage direkt in das Recordset mit 'Recordset.Open', aber ich bin Ich benutze parametrisierte Abfragen und versuche sogar viele Möglichkeiten, um das gleiche Ergebnis zu erhalten, wenn ein 'ADODB.Command' im Weg ist. – Albireo

+0

Ich denke, Sie müssen Ihre Frage bearbeiten und all diese Informationen einbeziehen, dann könnte jemand mit mehr VB Wissen als ich Ihnen helfen können. –