2010-10-01 24 views
5

में फ़ंक्शन से रिटर्न रिकॉर्डसेट क्लासिक एएसपी में किसी फ़ंक्शन से मैं एक पठनीय रिकॉर्डसेट कैसे लौटा सकता हूं इस पर एक नुकसान है।क्लासिक एएसपी

यह है कि मैं क्या के साथ आया है, लेकिन यह काम नहीं कर रहा:

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. त्रुटि देता है।

संपादित मार्क बी के जवाब के बाद:

मैं पहले से ही कट recordsets को देखा है, लेकिन मैं कैसे मेरे उदाहरण में उन्हें इस्तेमाल करना नहीं आता: हर ट्यूटोरियल सीधे Recordset.Open साथ recordset में क्वेरी खिलाती है, लेकिन मैं मैं parametrized प्रश्नों का उपयोग कर रहा हूं, और यहां तक ​​कि कई तरीकों की कोशिश कर रहा हूं, जिस तरह से मुझे ADODB.Command रास्ते में एक ही परिणाम प्राप्त नहीं हो सका।

मुझे क्या करना चाहिए?

अग्रिम धन्यवाद।


यहाँ समाधान एडुआर्डो Molteni के उत्तर के आधार पर दिया गया है:

समारोह जो डेटाबेस के साथ सूचना का आदान प्रदान:

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 
+0

आपका कोड के अंतिम हिस्सा 'याद आ रही है Response.CodePage = 65001' देता है। – AnthonyWJones

उत्तर

4

यहाँ एक समारोह है कि एक कट recordset

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

आपका कोड पूरी तरह से काम करता है, धन्यवाद। – Albireo

+0

मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन मैं जेस्क्रिप्ट में इसे कैसे प्राप्त कर सकता हूं? मैं कनेक्शन के लिए खाली पैरामीटर के साथ "rs.Open cmd, adOpenForward केवल, adLockReadOnly" नहीं कर सकता। मुझे त्रुटि मिलती है "रिकॉर्ड्स ऑब्जेक्ट की ActiveConnection प्रॉपर्टी को नहीं बदला जा सकता है जिसमें कमांड ऑब्जेक्ट इसके स्रोत के रूप में होता है।" – jpmorin

+0

@jpmorin: क्षमा करें, लेकिन मुझे जेस्क्रिप्ट नहीं पता है।आप इस समारोह को वीबीस्क्रिप्ट क्यों नहीं रखते हैं? मेरा मानना ​​है कि आपके पास मिश्रित स्क्रिप्ट हो सकती हैं ... –

0

ठीक है, आप फ़ंक्शन के रिटर्न वैरिएबल को सेट करने के तुरंत बाद रिकॉर्डसेट और कनेक्शन बंद कर रहे हैं, ताकि त्रुटि संदेशों को समझाया जा सके।

मैं वीबी डेवलपर नहीं हूं, लेकिन मुझे लगता है कि आपको जो देखने की आवश्यकता है वह डिस्कनेक्ट रिकॉर्ड्स है। this article पर एक नज़र डालें, यह वही कर रहा है जो आप चाहते हैं।

+0

हाय, मैंने डिस्कनेक्ट किए गए रिकॉर्ड्स को पहले ही देखा है - मुझे इसका उल्लेख करना चाहिए था - लेकिन मुझे नहीं पता कि मेरे उदाहरण में उनका उपयोग कैसे किया जाए: प्रत्येक ट्यूटोरियल सीधे रिकॉर्ड्स में 'रिकॉर्ड्सेट.ऑपन' के साथ क्वेरी को फ़ीड करता है, लेकिन मैं हूं parametrized प्रश्नों का उपयोग करके, और कई तरीकों से भी कोशिश कर रहा है जब मैं एक 'ADODB.Command' रास्ते में एक ही परिणाम प्राप्त नहीं कर सका। – Albireo

+0

मुझे लगता है कि आपको अपने प्रश्न को संपादित करने और उस सारी जानकारी को शामिल करने की आवश्यकता है, तो मेरे से अधिक वीबी ज्ञान वाला कोई व्यक्ति मदद करने में सक्षम हो सकता है। –

संबंधित मुद्दे