रिटर्न वैल्यू के साथ संग्रहित प्रक्रिया को कॉल करना


82

मैं अपने C # windows एप्लिकेशन से संग्रहीत कार्यविधि को कॉल करने का प्रयास कर रहा हूं। संग्रहीत कार्यविधि SQL Server 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उसी परिणाम के साथ वापसी मान प्राप्त करने के लिए एक का उपयोग करने की कोशिश की है । अपनी संग्रहीत कार्यविधि से वापसी मान प्राप्त करने के लिए मैं क्या याद कर रहा हूँ? यदि अधिक जानकारी की आवश्यकता है, तो कृपया मुझे बताएं।

जवाबों:


165

आपको कमांड में रिटर्न पैरामीटर जोड़ना होगा:

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

4
नहीं, आपको सपा में नहीं जोड़ना है (रिटर्न स्टेटमेंट रिटर्न पैरामीटर के साथ चिह्नित पैरामीटर को भरने के लिए ट्रिगर होता है)
ufosnowcat

10
इससे कोई फर्क नहीं पड़ता कि आप रिटर्न वैल पैरामीटर को क्या कहते हैं, btw।
क्ले

बहुत बहुत धन्यवाद, मैं ठीक से वापसी मूल्य प्राप्त करने के लिए एक रास्ता तलाश रहा था, यह वास्तव में मेरे लिए काम करता था। बहुत बढ़िया!
ओसवाल्डो

4
संग्रहीत कार्यविधि वापसी मान का उपयोग केवल सफलता (शून्य) या विफलता / चेतावनी (गैर-शून्य) को इंगित करने के लिए किया जाना चाहिए, न कि डेटा पर लौटें। OUTPUTउस उद्देश्य के लिए निर्धारित पैरामीटर या परिणाम का उपयोग करें ।
डैन गुज़मैन

5

मुझे पता है कि यह पुराना है, लेकिन मैंने Google के साथ इस पर ठोकर खाई।

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

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

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

2
हाय गैरी। क्या आपके पास एक प्रशस्ति पत्र होना है?
माइकल

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

4

मेरी मशीन पर 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;

3

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


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


2

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

@Result int OUTPUT

और सी#:

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

समस्या निवारण में, मुझे एहसास हुआ कि संग्रहीत कार्यविधि वास्तव में "InputOutput" की दिशा की तलाश में थी, इसलिए निम्न परिवर्तन ने समस्या को ठीक कर दिया।

            r

परिणाम। अप्रत्यक्ष = पैरामीटरडायरेक्शन। InputOutput;


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

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;
}

0

यह एक प्रक्रिया से एकल मान लौटाने का एक बहुत छोटा नमूना है:

SQL:

CREATE PROCEDURE [dbo].[MakeDouble] @InpVal int AS BEGIN 
SELECT @InpVal * 2; RETURN 0; 
END

C # -code:

int inpVal = 11;
string retVal = "?";
using (var sqlCon = new SqlConnection(
    "Data Source = . ; Initial Catalog = SampleDb; Integrated Security = True;"))
{
    sqlCon.Open();
    retVal = new SqlCommand("Exec dbo.MakeDouble " + inpVal + ";", 
        sqlCon).ExecuteScalar().ToString();
    sqlCon.Close();
}
Debug.Print(inpVal + " * 2 = " + retVal); 
//> 11 * 2 = 22

-8

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

Connection.open();
String cmd="DBO.test"; //the command
Sqlcommand mycommand;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.