2011-06-02 13 views
52

मैं अपने सी # विंडोज़ एप्लिकेशन से संग्रहीत प्रक्रिया को कॉल करने का प्रयास कर रहा हूं। संग्रहीत प्रक्रिया SQL सर्वर 2008 के स्थानीय उदाहरण पर चल रही है। मैं संग्रहित प्रक्रिया को कॉल करने में सक्षम हूं लेकिन मैं संग्रहीत प्रक्रिया से मूल्य वापस पुनर्प्राप्त करने में सक्षम नहीं हूं। यह संग्रहीत प्रक्रिया अनुक्रम में अगले नंबर को वापस करने के लिए माना जाता है। मैंने ऑनलाइन शोध किया है और मैंने देखी सभी साइटों ने इस समाधान को काम करने की ओर इशारा किया है।वापसी मूल्य के साथ संग्रहीत प्रक्रिया को कॉल करना

संग्रहित प्रक्रिया कोड:

ALTER procedure [dbo].[usp_GetNewSeqVal] 
     @SeqName nvarchar(255) 
as 
begin 
     declare @NewSeqVal int 
     set NOCOUNT ON 
     update AllSequences 
     set @NewSeqVal = CurrVal = CurrVal+Incr 
     where SeqName = @SeqName 

     if @@rowcount = 0 begin 
print 'Sequence does not exist' 
      return 
     end 

     return @NewSeqVal 
end 

कोड संग्रहीत प्रक्रिया बुला:

SqlConnection conn = new SqlConnection(getConnectionString()); 
conn.Open(); 

SqlCommand cmd = new SqlCommand(parameterStatement.getQuery(), conn); 
cmd.CommandType = CommandType.StoredProcedure; 

SqlParameter param = new SqlParameter(); 

param = cmd.Parameters.Add("@SeqName", SqlDbType.NVarChar); 
param.Direction = ParameterDirection.Input; 
param.Value = "SeqName"; 

SqlDataReader reader = cmd.ExecuteReader(); 

मैं भी एक ही परिणाम के साथ वापसी मान प्राप्त करने के लिए एक DataSet उपयोग करने की कोशिश की है। मेरी संग्रहीत प्रक्रिया से वापसी मूल्य प्राप्त करने के लिए मुझे क्या याद आ रही है? यदि अधिक जानकारी की आवश्यकता है, तो कृपया मुझे बताएं।

उत्तर

99

आप कमांड के लिए वापसी पैरामीटर जोड़ना:

using (SqlConnection conn = new SqlConnection(getConnectionString())) 
using (SqlCommand cmd = conn.CreateCommand()) 
{ 
    cmd.CommandText = parameterStatement.getQuery(); 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.Parameters.AddWithValue("SeqName", "SeqNameValue"); 

    var returnParameter = cmd.Parameters.Add("@ReturnVal", SqlDbType.Int); 
    returnParameter.Direction = ParameterDirection.ReturnValue; 

    conn.Open(); 
    cmd.ExecuteNonQuery(); 
    var result = returnParameter.Value; 
} 
+3

क्या आपको संग्रहीत प्रक्रिया में '@ ReturnVal' भी जोड़ना है? – muttley91

+3

नहीं, आपको स्पैमवैल्यू के साथ चिह्नित पैरामीटर भरने वाले वापसी कथन ट्रिगर को जोड़ने की आवश्यकता नहीं है) – ufosnowcat

+0

thanx मुझे इस – varsha

3

ExecuteScalar() काम करेगा, लेकिन आउटपुट पैरामीटर एक बेहतर समाधान होगा।

+3

ExecuteScalar() काम नहीं करता है, जब तक आप वापसी मूल्य का चयन नहीं करते हैं। – Soori

0

या यदि आप मानक ADO.NET EnterpriseLibrary बजाय ...

Database db = DatabaseFactory.CreateDatabase(); 
using (DbCommand cmd = db.GetStoredProcCommand("usp_GetNewSeqVal")) 
{ 
    db.AddInParameter(cmd, "SeqName", DbType.String, "SeqNameValue"); 
    db.AddParameter(cmd, "RetVal", DbType.Int32, ParameterDirection.ReturnValue, null, DataRowVersion.Default, null); 

    db.ExecuteNonQuery(cmd); 

    var result = (int)cmd.Parameters["RetVal"].Value; 
} 
4

उपयोग कर रहे हैं मैं जानता हूँ कि यह पुराना है, लेकिन मैं गूगल के साथ उस पर ठोकर खाई।

यदि आपके पास संग्रहीत प्रक्रिया में वापसी मूल्य है तो "रिटर्न 1" कहें - आउटपुट पैरामीटर का उपयोग नहीं।

आप निम्न कार्य कर सकते हैं - "@RETURN_VALUE" चुपचाप प्रत्येक कमांड ऑब्जेक्ट में जोड़ा जाता है।

cmd.ExecuteNonQuery(); 
    rtn = (int)cmd.Parameters["@RETURN_VALUE"].Value; 
+2

हाय गैरी। क्या आपको उद्धरण होना है? – Michael

+1

मुझे विश्वास नहीं है कि cmd उदाहरण में SqlParameterCollection में RETURN_VALUE में नामित पैरामीटर होगा जब तक कि इसे स्पष्ट रूप से जोड़ा नहीं जाता है। इसलिए, यदि आप गैरी द्वारा ऊपर दिए गए दृष्टिकोण को लेने पर विचार कर रहे हैं, तो सुनिश्चित करें कि आपने cmd.Parameters जोड़ दिया है। जोड़ें (नया SqlParameter ("@ RETURN_VALUE", SqlDbType.Int)); सेमीडी। पैरामीटर ["@ RETURN_VALUE"]। दिशा = पैरामीटर डायरेक्शन। रिटर्नवैल्यू; हालांकि, मुझे विश्वास है कि आपको संग्रहीत प्रक्रिया परिभाषा में @RETURN_VALUE को जोड़ना नहीं है। शायद गैरी का मतलब यही था। – joey

-6

मुझे अन्य को बंद करने की आवश्यकता नहीं है। तो मूल रूप से यहां मेरे कोड का मोटा है। मुझे लगता है कि आप स्ट्रिंग cmd टिप्पणी खो रहे हैं। उदाहरण के लिए यदि मेरी स्टोर प्रक्रिया कॉल है: DBO.Test। मुझे cmd = "DBO.test" लिखना होगा। फिर आदेश प्रकार की दुकान प्रक्रिया के बराबर करते हैं, और ऐसा ऐसा

Connection.open(); 
String cmd="DBO.test"; //the command 
Sqlcommand mycommand; 
+0

मैं सो रहा हूं, इसलिए अब आपको पूरा कोड प्राप्त करने में सक्षम नहीं है। लेकिन मेरा विश्वास करो, टिप्पणी करने वाले अन्य लोगों की तुलना में आसान तरीका है। – Rain

2

EnterpriseLibrary की पर मेरी मशीन अन्य पैरामीटर था संस्करण। यह काम कर रहा था:

 SqlParameter retval = new SqlParameter("@ReturnValue", System.Data.SqlDbType.Int); 
     retval.Direction = System.Data.ParameterDirection.ReturnValue; 
     cmd.Parameters.Add(retval); 
     db.ExecuteNonQuery(cmd); 
     object o = cmd.Parameters["@ReturnValue"].Value; 
+0

यह सही जवाब है - मेरे लिए :-) धन्यवाद। –

0

मैं एक त्रुटि है कि एक उम्मीद पैरामीटर शामिल नहीं किया गया लौटने सपा कॉल के साथ एक समान समस्या थी। मेरा कोड इस प्रकार था।
संग्रहित प्रक्रिया:

@Result पूर्णांक आउटपुट

और सी #:

  SqlParameter result = cmd.Parameters.Add(new SqlParameter("@Result", DbType.Int32)); 
      result.Direction = ParameterDirection.ReturnValue; 

समस्या निवारण में, मैंने महसूस किया कि संग्रहीत प्रक्रिया वास्तव में एक दिशा के लिए देख रहा था "इनपुट आउटपुट" का इसलिए निम्नलिखित परिवर्तन ने समस्या को ठीक किया।

  r 

Result.Direction = ParameterDirection.InputOutput;

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