2011-10-14 12 views
6

मैं संग्रहित प्रक्रिया लिखने के लिए नया हूं। तो मैंने आउटपुट पैरामीटर के साथ एक लिखा और आउटपुट वैल्यू तक पहुंचना चाहता हूं, इसे करने के लिए गर्म।संग्रहित प्रक्रिया में OUTPUT पैरामीटर का उपयोग कैसे करें

मेरे संग्रहित प्रक्रिया:

ALTER PROCEDURE selQuery 
    (
     @id int, @code varchar(50) OUTPUT 
    ) 
AS 
    SELECT RecItemCode = @code, RecUsername from Receipt where RecTransaction = @id 
    RETURN @code 

सेट करने के लिए "@ कोड = RecItemCode" की कोशिश कर रहा है, तो के रूप में त्रुटि मिल रही है: "। एक SELECT कथन है कि एक चर के लिए एक मूल्य प्रदान करती है डेटा पुनर्प्राप्ति संचालन के साथ संयुक्त नहीं किया जाना चाहिए"

और मैं के रूप में संग्रहित प्रक्रिया का उपयोग कर रहा:

con.Open(); 
cmd.Parameters.AddWithValue("@id", textBox1.Text); 
SqlParameter code = new SqlParameter("@code", SqlDbType.Int); 
code.Direction = ParameterDirection.Output; 
cmd.Parameters.Add(code); 
SqlDataReader sdr = cmd.ExecuteReader(); 
MessageBox.Show(cmd.Parameters["@code"].Value.ToString()); // getting error 
con.Close(); 

त्रुटि: "ऑब्जेक्ट संदर्भ एक वस्तु का एक उदाहरण के लिए सेट नहीं।" मैं आउटपुट पैरामीटर का मान प्राप्त करना चाहता हूं। उसे कैसे प्राप्त करें?

धन्यवाद।

उत्तर

7

आपके एसपी में एसक्यूएल गलत है। आप शायद

Select @code = RecItemCode from Receipt where RecTransaction = @id 

चाहते हैं कि आपके बयान में आप @code की स्थापना नहीं कर रहे हैं, तो आप RecItemCode के मूल्य के लिए इसका इस्तेमाल करने की कोशिश कर रहे हैं। जब आप आउटपुट पैरामीटर का उपयोग करने का प्रयास करते हैं तो यह आपके NullReferenceException को समझाएगा, क्योंकि किसी मान को कभी भी असाइन नहीं किया गया है और आपको डिफ़ॉल्ट शून्य मिल रही है।

अन्य मुद्दा यह है कि अपने एसक्यूएल बयान करता है, तो के रूप में

Select @code = RecItemCode, RecUsername from Receipt where RecTransaction = @id 

यह चर असाइनमेंट और डेटा पुनर्प्राप्ति मिश्रण है फिर से लिखा है। यह कुछ बिंदुओं पर प्रकाश डाला गया है। यदि आपको डेटा के अन्य हिस्सों के अतिरिक्त @code को चलाने वाले डेटा की आवश्यकता है, तो आउटपुट पैरामीटर को भूलें और केवल डेटा का चयन करें।

Select RecItemCode, RecUsername from Receipt where RecTransaction = @id 

यदि आपको केवल कोड की आवश्यकता है, तो मैंने आपको दिखाए गए पहले SQL कथन का उपयोग करें।बेतकल्लुफ़ मौका पर आप वास्तव में और डेटा उत्पादन की जरूरत है, दो अलग अलग बयानों

Select @code = RecItemCode from Receipt where RecTransaction = @id 
Select RecItemCode, RecUsername from Receipt where RecTransaction = @id 

का उपयोग यह रूप में अच्छी तरह वापसी के रूप में डेटा के दो स्तंभों एक पंक्ति में उत्पादन पैरामीटर के लिए अपने मूल्य निर्दिष्ट करना चाहिए। हालांकि, यह मुझे बहुत अनावश्यक रूप से मारता है।

यदि आप अपने एसपी लिखते हैं जैसा कि मैंने शीर्ष पर दिखाया है, तो बस cmd.ExecuteNonQuery(); का आह्वान करें और फिर आउटपुट पैरामीटर मान पढ़ें।


के साथ अपने सपा और कोड एक और मुद्दा। आपके एसपी में, आपने @code को varchar घोषित कर दिया है। अपने कोड में, आप पैरामीटर प्रकार को Int के रूप में निर्दिष्ट करते हैं। प्रकारों को सुसंगत बनाने के लिए या तो अपने एसपी या अपने कोड को बदलें।


भी ध्यान रखें: सब आप कर रहे हैं एक मान लौट रहा है, तो यह है कि उत्पादन मानकों पर सभी को शामिल नहीं करता यह करने के लिए एक और तरीका है। आप

Select RecItemCode from Receipt where RecTransaction = @id 

लिख सकता है और फिर object obj = cmd.ExecuteScalar(); का उपयोग परिणाम प्राप्त करने, सपा में या अपने कोड में एक आउटपुट पैरामीटर के लिए कोई जरूरत नहीं।

+0

धन्यवाद एंथनी, इससे बहुत मदद मिली .... बहुत धन्यवाद – Sandy

+0

धन्यवाद और +1। 'ऑब्जेक्ट obj = cmd.ExecuteScalar();' पूरी तरह से काम किया। मैं सी # कोड की दो पंक्तियों में जो कुछ चाहिए उसे पूरा करने में सक्षम था, दूसरा 'myString = obj.ToString();' है। – FumblesWithCode

24

वहाँ एक कई चीजें आप इसे

  1. काम कर पाने के संबोधित करने की आवश्यकता कर रहे हैं नाम गलत है इसकी नहीं @ouput अपने @code
  2. आप आउटपुट पैरामीटर दिशा निर्धारित करने की आवश्यकता।
  3. AddWithValue का उपयोग न करें क्योंकि इसकी कीमत केवल Add है।
  4. उपयोग ExecuteNonQuery यदि आप नहीं लौटा रही हैं पंक्तियों

SqlParameter output = new SqlParameter("@code", SqlDbType.Int); 
output.Direction = ParameterDirection.Output; 
cmd.Parameters.Add(output); 
cmd.ExecuteNonQuery(); 
MessageBox.Show(output.Value.ToString()); 
+0

अच्छा, लेकिन आउटपुट पैरामीटर का मूल्य कैसे प्राप्त करें ?? output.Value.ToString() त्रुटि दे रहा है "ऑब्जेक्ट संदर्भ किसी ऑब्जेक्ट के उदाहरण पर सेट नहीं है।" – Sandy

+0

और "आप भूल गए" नहीं कहें क्योंकि मैं नहीं भूल गया, वास्तव में मुझे नहीं पता :-( – Sandy

+0

@rapsalands, * * क्वेरी के निष्पादित करने के बाद, पैरामीटर से मान पुनर्प्राप्त करें। 'Cmd.ExecuteNonQuery(); int value = (int) output.Value; ' –

1

आप ParameterDirection.Output गणन के साथ कोड में एक आउटपुट पैरामीटर के रूप में उत्पादन पैरामीटर परिभाषित करने की जरूरत की कोशिश करो। इसके बारे में कई उदाहरण हैं, लेकिन यहां MSDN पर एक है।

1
SqlCommand yourCommand = new SqlCommand(); 
yourCommand.Connection = yourSqlConn; 
yourCommand.Parameters.Add("@yourParam"); 
yourCommand.Parameters["@yourParam"].Direction = ParameterDirection.Output; 

// execute your query successfully 

int yourResult = yourCommand.Parameters["@yourParam"].Value; 
+0

मुझे त्रुटि मिल रही है। पोस्ट संपादित करें देखें ... धन्यवाद – Sandy

+0

@rapsalands आप कोड को निष्पादित नहीं कर सकते हैं। यह कोड का एक स्टैंडअलोन ब्लॉक नहीं है। यह त्रुटि कह रही है कि आपने किसी ऑब्जेक्ट को तुरंत चालू नहीं किया है (यानी इसका एक नया उदाहरण बनाएं)।यह आपको सामान्य संग्रह देने के लिए था कि संग्रहित प्रो के आउटपुट पैरामीटर से मूल्य कैसे प्राप्त करें। –

+0

असल में मैं एसपी सीखने की कोशिश कर रहा हूं और पहले कभी नहीं किया है। यह बहुत अच्छा होगा अगर आप बता सकते हैं कि मेरे कोड में क्या गलत है। मेरा मतलब है कि मुझे उदाहरण बनाना है ?? – Sandy

0

आउटपुट पैरामीटर का उपयोग करने से पहले आपको कनेक्शन बंद करना होगा। इस तरह कुछ

con.Close(); 
MessageBox.Show(cmd.Parameters["@code"].Value.ToString()); 
संबंधित मुद्दे