2013-02-11 18 views
17

में संग्रहीत प्रक्रिया से वापसी मान जाओ मेरे पास है एक संग्रहीत प्रक्रियाasp.net

ALTER PROC TESTLOGIN 
    @UserName varchar(50), 
    @password varchar(50) 
As 
Begin 
    declare @return int; 

    set @return = (SELECT COUNT(*) 
        FROM CPUser 
        WHERE UserName = @UserName 
        AND Password = @password); 

    return @return; 
End 

और ग # में

SqlConnection con = db.con; 
SqlCommand cmd = new SqlCommand("TESTLOGIN", con); 
cmd.CommandType = CommandType.StoredProcedure; 

SqlParameter parm = new SqlParameter("@return", SqlDbType.Int); 
parm.Direction = ParameterDirection.ReturnValue; 

cmd.Parameters.Add(parm); 
cmd.Parameters.Add(new SqlParameter("@UserName", txtUserName.Text.ToString().Trim())); 
cmd.Parameters.Add(new SqlParameter("@password", txtPassword.Text.ToString().Trim())); 

cmd.ExecuteNonQuery(); 
con.Close(); 

int id = Convert.ToInt32(parm.Value); 

लेकिन यह हमेशा वापस आ 0. कृपया मेरी मदद इस समस्या को हल करने के लिए

+0

क्या आप सुनिश्चित हैं कि प्रक्रिया 0 वापस नहीं आ रही है? – adt

+0

@adt अगर SQL सर्वर में प्रक्रिया को सीधे निष्पादित करता है, तो यह सही तरीके से काम करता है लेकिन सी # में, यह हमेशा 0 –

+0

संभावित डुप्लिकेट देता है [सी # में संग्रहीत प्रक्रिया से वापसी मूल्य प्राप्त करना) (http://stackoverflow.com/questions/706361/ हो रही-वापसी-मूल्य-से-संग्रहीत-प्रक्रिया-इन-सी-तेज) –

उत्तर

30

आपको दिशा में ParameterDirection.ReturnValue पर दिशा सेट के साथ पैरामीटर की आवश्यकता है लेकिन एसपी में अतिरिक्त पैरामीटर जोड़ने की आवश्यकता नहीं है। इस

SqlParameter returnParameter = cmd.Parameters.Add("RetVal", SqlDbType.Int); 
    returnParameter.Direction = ParameterDirection.ReturnValue; 
    cmd.ExecuteNonQuery(); 

    int id = (int) returnParameter.Value; 
+0

धन्यवाद, ठीक चल रहा है। (इस समय की तुलना में नोटिस 'पैरामीटर। जोड़ें' बहिष्कृत है) – danihp

+1

'पैरामीटर्स। जोड़ें (स्ट्रिंग पैरामीटरनाम, ऑब्जेक्ट वैल्यू) 'को बहिष्कृत किया गया है, लेकिन' पैरामीटर्स। जोड़ें (स्ट्रिंग पैरामीटरनाम, एसक्यूएलडीबी टाइप एसक्यूएलडीबी टाइप) 'नहीं है। –

+0

मैं स्ट्रिंग वैल्यू लौटा रहा हूं लेकिन यह एक एक्सपशन दे रहा है 'वर्चुअल वैल्यू' मेरा लौटा मूल्य 'डेटा प्रकार int में परिवर्तित करते समय रूपांतरण विफल रहा। – SMI

1

आप इसे आजमा सकते हैं। आउटपुट दिशा के रूप में पैरामीटर जोड़ें और क्वेरी निष्पादित करने के बाद आउटपुट पैरामीटर मान प्राप्त करें।

SqlParameter parmOUT = new SqlParameter("@return", SqlDbType.Int); 
    parmOUT.Direction = ParameterDirection.Output; 
    cmd.Parameters.Add(parmOUT); 
    cmd.ExecuteNonQuery(); 
    int returnVALUE = (int)cmd.Parameters["@return"].Value; 
-3

यह इस तरह से (कोड में आवश्यक परिवर्तन करें) करो ..

  SqlConnection con = new SqlConnection(GetConnectionString()); 
      con.Open(); 
      SqlCommand cmd = new SqlCommand("CheckUser", con); 
      cmd.CommandType = CommandType.StoredProcedure; 
      SqlParameter p1 = new SqlParameter("username", username.Text); 
      SqlParameter p2 = new SqlParameter("password", password.Text); 
      cmd.Parameters.Add(p1); 
      cmd.Parameters.Add(p2); 
      SqlDataReader rd = cmd.ExecuteReader(); 
      if(rd.HasRows) 
      { 
       //do the things 
      } 
      else 
      { 
       lblinfo.Text = "abc"; 
      } 
+0

यह एक अच्छा विकल्प नहीं है क्योंकि यह डेटा रीडर के ओवरहेड को जोड़ता है।एक आउटपुट पैरामीटर सबसे प्रभावी तरीका है। – Lukos

0

प्रक्रिया एक value.You रिटर्न कभी नहीं की दुकान प्रक्रिया में एक उत्पादन पैरामीटर का उपयोग करने के लिए है।

ALTER PROC TESTLOGIN 
@UserName varchar(50), 
@password varchar(50) 
@retvalue int output 
as 
Begin 
    declare @return  int 
    set @return = (Select COUNT(*) 
    FROM CPUser 
    WHERE UserName = @UserName AND Password = @password) 

    set @[email protected] 
    End 

फिर आपको सी # से एक एसक्लपरमीटर जोड़ना होगा जिसका पैरामीटर दिशा समाप्त हो गई है। आशा है कि यह समझ में आता है।

+8

आप गलत हैं, SQL सर्वर * में संग्रहीत प्रक्रिया हमेशा एक मान देता है, जो हमेशा एक 'int' मान भी होता है। आपने कभी भी अपने प्रश्नों में वापसी मूल्य पुनर्प्राप्त नहीं किया हो सकता है, लेकिन इसका मतलब यह नहीं है कि एक एसपी में कोई नहीं है। कृपया [रिटर्न मैनुअल] (http://msdn.microsoft.com/en-us/library/ms174998.aspx "रिटर्न (ट्रांजैक्ट-एसक्यूएल)" पर एक (नोटर) देखें।)। –

+0

मैंने अपने प्रश्नों में वापसी मूल्य पुनर्प्राप्त कर लिया है। लेकिन मैं इसका जिक्र करना भूल गया हूं। इसके अलावा मैंने रिटर्न मैनुअल पर अध्ययन किया है जिसका लिंक आपके द्वारा प्रदान किया गया है। लिंक के लिए धन्यवाद और मेरे उत्तर में सुधार। – user1990587

+0

यह काम नहीं कर रहा है –

2

2 चीजें आज़माएं।

  • वापसी मूल्य भेजने से पहले क्वेरी को SQL सर्वर पर पूरा करना होगा।

  • परिणाम कैप्चर किए जाने हैं और फिर से पहले निष्पादन समाप्त करना ऑब्जेक्ट पर वापसी मूल्य प्राप्त होता है।

अंग्रेजी में, काम खत्म करें और फिर मूल्य पुनर्प्राप्त करें।

इस काम करेंगे नहीं:

   cmm.ExecuteReader(); 
       int i = (int) cmm.Parameters["@RETURN_VALUE"].Value; 

यह काम करेगा:

     SqlDataReader reader = cmm.ExecuteReader(); 
         reader.Close(); 

         foreach (SqlParameter prm in cmd.Parameters) 
         { 
          Debug.WriteLine(""); 
          Debug.WriteLine("Name " + prm.ParameterName); 
          Debug.WriteLine("Type " + prm.SqlDbType.ToString()); 
          Debug.WriteLine("Size " + prm.Size.ToString()); 
          Debug.WriteLine("Direction " + prm.Direction.ToString()); 
          Debug.WriteLine("Value " + prm.Value); 

         } 

यदि आप के दौरान पहले और बाद में परिणाम द्वारा संसाधित किया गया है पैरामीटर का मूल्य जाँच सुनिश्चित नहीं हैं पाठक।

-2

यदि आप जानना चाहते हैं कि संग्रहित प्रक्रिया से मूल्य को Basic Basic.NET पर कैसे वापस करना है। कृपया इस ट्यूटोरियल को पढ़ें: How to return a value from stored procedure

मैंने मान वापस करने के लिए निम्न संग्रहीत प्रक्रिया का उपयोग किया।

CREATE PROCEDURE usp_get_count 

AS 
BEGIN 
DECLARE @VALUE int; 

SET @VALUE=(SELECT COUNT(*) FROM tblCar); 

RETURN @VALUE; 

END 
GO 
+0

[इसलिए] में आपका स्वागत है। प्रश्नों का उत्तर देते समय, कृपया किसी भी संदर्भ या पोस्ट में लिंक के साथ किसी भी संबद्धता का खुलासा करना सुनिश्चित करें। धन्यवाद! –