Возврат набора записей из функции в классическом ASP

Я не понимаю, как вернуть читаемый набор записей из функции в классическом ASP.

Вот что я придумал, но это не работает:

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

Строка Response.Write Count.Fields(0).Value выдает ошибку Item cannot be found in the collection corresponding to the requested name or ordinal..

Заменив его на Response.Write Count.Status, я получаю ошибку Operation is not allowed when the object is closed..

Добавление Count.Open дает ошибку The connection cannot be used to perform this operation. It is either closed or invalid in this context..

Изменить после ответа Марка Б:

Я уже смотрел на несвязанные наборы записей, но я не знаю, как их использовать в моем примере: каждое руководство передает запрос непосредственно в набор записей с помощью Recordset.Open, но я использую параметризованные запросы и даже пробую многие способы, которые я не мог получить тот же результат, когда на пути есть ADODB.Command.

Что я должен делать?

Заранее спасибо.


Вот решение, основанное на ответе Эдуардо Молтени:

Функция, которая взаимодействует с базой данных:

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

Код, который вызывает функцию:

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

person Albireo    schedule 01.10.2010    source источник
comment
В вашем последнем фрагменте кода отсутствует Response.CodePage = 65001.   -  person AnthonyWJones    schedule 01.10.2010


Ответы (2)


Вот функция, которая возвращает отключенный набор записей

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
person Eduardo Molteni    schedule 01.10.2010
comment
Я знаю, что это старый пост, но как мне добиться того же в JScript? Я не могу сделать rs.Open cmd, adOpenForwardOnly, adLockReadOnly с пустым параметром для Connection. Я получаю сообщение об ошибке Невозможно изменить свойство ActiveConnection объекта Recordset, источником которого является объект Command. - person jpmorin; 13.04.2013
comment
@jpmorin: Извините, но я не знаю JScript. Почему бы вам просто не оставить эту функцию на VBScript? Я считаю, что у вас могут быть смешанные сценарии... - person Eduardo Molteni; 15.04.2013
comment
@EduardoMolteni: я смог вручную установить параметры в объекте набора записей и вызвать метод open только с параметром команды. Мне также пришлось написать SET NOCOUNT ON; в моей хранимой процедуре, чтобы заставить ее работать. - person jpmorin; 15.04.2013

Ну, вы закрываете набор записей и соединение сразу после установки возвращаемой функции переменной, так что это объясняет сообщения об ошибках.

Я не разработчик VB, но я думаю, что вам нужно обратить внимание на Disconnected Recordsets. Взгляните на эту статью, она делает именно то, что вам нужно.

person Mark Bell    schedule 01.10.2010
comment
Привет, я уже смотрел на несвязанные наборы записей - я должен был упомянуть об этом - но я не знаю, как их использовать в моем примере: каждое руководство передает запрос непосредственно в набор записей с помощью Recordset.Open, но я использую параметризованные запросы и даже испробовав множество способов, я не смог получить тот же результат, когда на пути есть ADODB.Command. - person Albireo; 01.10.2010
comment
Я думаю, вам нужно отредактировать свой вопрос и включить всю эту информацию, тогда кто-то с большим знанием VB, чем я, сможет помочь. - person Mark Bell; 01.10.2010