2010-10-01 29 views
5

Brakuje mi możliwości zwrócenia czytelnego zestawu rekordów z funkcji klasycznej ASP.Zestaw rekordów powrotu z funkcji w klasycznej ASP

To co wymyśliłem, ale to nie działa:

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 

Linia Response.Write Count.Fields(0).Value daje błąd Item cannot be found in the collection corresponding to the requested name or ordinal..

Zastąpienie go Response.Write Count.Status Dostaję błąd Operation is not allowed when the object is closed..

Dodanie Count.Open powoduje błąd The connection cannot be used to perform this operation. It is either closed or invalid in this context..

Edit po znak B za odpowiedź:

już spojrzał na odłączonych zestawów rekordów, ale nie wiem, jak ich używać w moim przykładzie: każdy poradnik zasila zapytanie bezpośrednio do rekordów z Recordset.Open, ale Używając sparametryzowanych zapytań, a nawet próbując na wiele sposobów, nie mogłem uzyskać tego samego wyniku, gdy w ten sposób jest ADODB.Command.

Co należy zrobić?

Z góry dziękuję.


Oto rozwiązanie oparte na Eduardo Molteni za odpowiedź:

Funkcja który współdziała z bazy danych:

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 

Kod, który wywołuje funkcję:

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

Twój końcowy fragment kodu brakuje 'Response.CodePage = 65001'. – AnthonyWJones

Odpowiedz

4

Oto funkcja, która zwraca odłączonego zestawu rekordów

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

Twój kod działa idealnie, dzięki. – Albireo

+0

Wiem, że to stary post, ale jak mogę osiągnąć to samo w JScript? Nie mogę zrobić "rs.Open cmd,, adOpenForwardOnly, adLockReadOnly" z pustym parametrem dla połączenia. Pojawia się błąd "Nie można zmienić właściwości ActiveConnection obiektu Recordset, którego obiektem Command jest jego źródło." – jpmorin

+0

@jpmorin: Przepraszam, ale nie znam JScript.Dlaczego po prostu nie zachowasz tej funkcji VBScript? Wierzę, że możesz mieć mieszane skrypty ... –

0

Cóż, zamykasz zestaw rekordów i połączenie natychmiast po ustawieniu zmiennej zwracanej przez funkcję, co wyjaśnia komunikaty o błędach.

Nie jestem programistą VB, ale myślę, że na co musisz zwrócić uwagę to Disconnected Recordsets. Spójrz na this article, robiąc dokładnie to, co chcesz.

+0

Witam, już sprawdziłem rozłączone zestawy rekordów - powinienem był o tym wspomnieć - ale nie wiem, jak z nich korzystać w moim przykładzie: każdy samouczek przesyła zapytanie bezpośrednio do zestawu rekordów za pomocą 'Recordset.Open', ale jestem używając sparametryzowanych zapytań, a nawet próbując na wiele sposobów, nie mogłem uzyskać tego samego wyniku, gdy na drodze jest 'ADODB.Command'. – Albireo

+0

Myślę, że musisz edytować swoje pytanie i uwzględnić wszystkie te informacje, wtedy ktoś z większą wiedzą na temat VB niż ja może Ci pomóc. –