2011-10-05 11 views
7

मेरे पास एक्सेल में निम्नलिखित यूडीएफ है जो मेरे एमएसएसक्यूएल सर्वर से कनेक्ट करने के लिए एडीओ का उपयोग करता है। वहां इसे स्केलर udf "D100601RVDATABearingAllow" निष्पादित करना चाहिए।एडीओडीबी ओपन रिकॉर्डसेट विफल रहता है/"ऑब्जेक्ट बंद होने पर ऑपरेशन की अनुमति नहीं है"

किसी कारण से पैरामीटर जिन्हें मैं संलग्न करने का प्रयास करता हूं, एसक्यूएल सर्वर को नहीं भेजता है। सर्वर पर केवल:

SELECT dbo.D100601RVDATABearingAllow 

आता है।

मेरी एक्सेल यूडीएफ:

Function RVDATA(Fastener) As Long 

    Dim cnt As ADODB.Connection 
    Dim rst As ADODB.Recordset 
    Dim Cmd1 As ADODB.Command 
    Dim stSQL As String 

Const stADO As String = "Provider=SQLOLEDB.1;Data ................" 
'---------------------------------------------------------- 
Set cnt = New ADODB.Connection 
With cnt 
    .ConnectionTimeout = 3 
    .CursorLocation = adUseClient 
    .Open stADO 
    .CommandTimeout = 3 
End With 
'---------------------------------------------------------- 
Set Cmd1 = New ADODB.Command 
    Cmd1.ActiveConnection = cnt 
    Cmd1.CommandText = "dbo.D100601RVDATABearingAllow" 
    Cmd1.CommandType = adCmdStoredProc 
'---------------------------------------------------------- 
Set Param1 = Cmd1.CreateParameter("Fastener", adInteger, adParamInput, 5) 
Param1.Value = Fastener 
Cmd1.Parameters.Append Param1 
Set Param1 = Nothing 
'---------------------------------------------------------- 
Set rst = Cmd1.Execute() 
RVDATA = rst.Fields(0).Value  
'---------------------------------------------------------- 
    rst.Close 
    cnt.Close 
    Set rst = Nothing 
    Set cnt = Nothing 
'---------------------------------------------------------- 
End Function 

जब मैं adCmdStoredProc का उपयोग पूरी बात में विफल रहता है और VBA डिबगर में recordset के गुणों "ऑपरेशन का एक बहुत है अनुमति नहीं है जब वस्तु बंद कर दिया है "(कुछ अलग लग सकता है, संदेश में अनुवाद किया है)

जब मैं adCmdStoredProc का उपयोग नहीं करते मैं संदेश मिलता है कि चर फास्टनर प्रदान नहीं किया गया

मुझे लगता है कि रिकॉर्डसेट खोलने के तरीके में कुछ गलत हो सकता है। अन्य ट्रेडों में मैंने "SET NOCOUNT ON" विकल्प का उपयोग करने के बारे में पढ़ा है, लेकिन यह भी काम नहीं करता है।

क्या किसी के पास कोई विचार है? सादर Lumpi

उत्तर

1

तुम सिर्फ उसका नाम प्रदान, सर्वर साइड समारोह SELECT की जरूरत नहीं है ("[tra-CAE400-1] .dbo.D100601RVDATABearingAllow") .CommandText संपत्ति में। आपको .CommandType संपत्ति को "संग्रहीत प्रक्रिया" (property reference on w3schools.com) पर सेट करना चाहिए।

फिर adodb पता चलेगा कि आप एक समारोह को कॉल करने के बारे में बात कर रहे हैं, और एक सादा sql-command भेजने की कोशिश नहीं कर रहे हैं।

संभावना है कि यह आपको कमांड ऑब्जेक्ट पर पैरामीटर को परिभाषित करने की अनुमति देगा। लेकिन कमांड ऑब्जेक्ट पर परिभाषित पैरामीटर को एसक्यूएल सर्वर में फ़ंक्शन के तर्क के रूप में परिभाषित किए गए लोगों को बिल्कुल (नाम और प्रकार में) अनुरूप होना चाहिए।

An example from microsoft.com on using the command-object with a stored procedure

ADO Reference on microsoft.com

+0

मैंने SELECT कथन हटा दिया। क्या पैराम 2 को विज्ञापन के रूप में परिभाषित करना सही है जब सर्वर पर फ़्लोट फ़्लोट होता है? adChar = varchar (20) के लिए एक ही सवाल? – Lumpi

+0

रुचि रखने वाले सभी के लिए: मैंने एक ही प्रश्न पोस्ट किया: http://www.codeproject.com/Questions/265573/ADODB-open-recordset-fails- ऑपरेशन-is-not-allowe और कुछ रोचक टिप्स प्राप्त हुए लेकिन , समस्या अभी भी हल नहीं है .. – Lumpi

13

रूप में अच्छी तरह इस त्रुटि का सामना किया (मेरे मामले में मैं कोई जानकारी फिर से एक संग्रहीत प्रक्रिया का उपयोग कर रहा)। मैंने कुछ बदलाव किए हैं जिससे निष्पादन खराब हो गया।

जब मैं संग्रहीत प्रक्रिया के पहले कथन के रूप में सेट करता हूं तो त्रुटि गायब हो जाती है।

+0

धन्यवाद! मुझे तुरंत मदद की! – SalientBrain

0

मैं भी संग्रहीत प्रक्रिया के साथ इसमें भाग गया। क्या आपने एनओसीटी = बंद कर दिया था; अपने कोड के नीचे? बहुत सारे गुगल के बाद यही मेरे लिए काम किया। साथ ही, यदि आपके पास कोई अन्य कोड है जो चलता है, तो आपको इसे सम्मिलित और अद्यतन कथन सहित, नॉकउंट = चालू/बंद में लपेटना होगा। आपको लगता है कि एक सम्मिलित बयान कोई फर्क नहीं पड़ता है, लेकिन इस तरह कोड को लपेटना मुझे आज आत्महत्या करने से रोकता है।

1

इसका एक और संभावित कारण डीबग स्टेटमेंट है। मैंने अभी तक काम करने की कोशिश करने में बहुत लंबा समय बिताया है कि यह मेरे लिए क्यों काम नहीं करेगा, डेटाबेस पर प्रो ठीक काम करता है, जिस डेटा को डालने वाला था उसे डाला गया था, वीबीए कोड ठीक काम करता था, लेकिन रिकॉर्डसेट में कुछ भी नहीं था । अंतिम समाधान उन प्रोसेस के माध्यम से जाना था जो प्रिंट किए गए बयान बनाए और हटा दिए गए थे। यह समस्या है कि यह समस्या है या नहीं, तो अपनी प्रक्रिया को मैन्युअल रूप से SQL सर्वर पर चलाएं, फिर परिणामों के संदेश टैब को देखें, यदि "कमांड सफलतापूर्वक पूर्ण हो गया है।" आपको उन संदेशों को खत्म करने की जरूरत है। "सेट पर खाता" पंक्ति गणना संदेशों से छुटकारा पा जाएगा, लेकिन अन्य भी हो सकते हैं।

मुझे लगता है कि 5 वर्षों के बाद ओपी ने इस विशेष समस्या को हल कर लिया है, इसलिए यह सिर्फ मेरे जैसा ही है जो एक ही समस्या की खोज करते समय इसे पाता है।

0

हमारी दुकान में हम अक्सर डिबगिंग के साथ आपकी सहायता करने के लिए हमारे संग्रहित प्रक्रियाओं में इस तरह लाइनों का उपयोग करें:

RAISERROR('Debug message here',0,1) WITH NOWAIT; 

यह भी एक्सेल VBA में एक recordset खोलने टूट जाता है। मेरा मानना ​​है कि इस प्रश्न के लिए पूरा जवाब संग्रहीत प्रक्रिया में है:

  1. उपयोग सेट ROWCOUNT बंद
  2. निकालें सभी प्रिंट बयान
  3. सभी RAISEERROR (0 की यानी गंभीरता) डीबगिंग के लिए इस्तेमाल किया बयानों को दूर
संबंधित मुद्दे