2013-02-06 18 views
7

मेरी संग्रहीत प्रक्रिया है:एंटरप्राइज़ लाइब्रेरी में ExecuteNonQuery से आउटपुट पैरामीटर मान कैसे प्राप्त करें (सी #)?

create Procedure spSetUser 
(
    @Name NVarchar(50), 
    @OrganicTitle NVarchar(30), 
    @UserName NVarchar(20), 
    @Password NVarchar(16), 
    @Result Int Output 
) 
As 
Begin 
    Set @Result = -1  
    If Not Exists(Select UserId From dbo.Users Where [email protected]) 
    Begin 
     Insert Into dbo.Users (Name,OrganicTitle,UserName,[Password]) 
     Values(@Name,@OrganicTitle,@UserName,@Password) 
     Set @Result = SCOPE_IDENTITY() 
    End 
    Return 
End 
Go 

और मेरी कक्षा (Microsft उद्यम पुस्तकालय में) है:

[DataObjectMethod(DataObjectMethodType.Insert)] 
public Int32 SetUser(UserFieldSet Data) 
{ 
    Int32 Result = 0; 
    object[] values = new object[] { Data.Name, Data.OrganicTitle, Data.UserName, Data.Password, Data.UserId }; 
    Result = Db.ExecuteNonQuery("spSetUser", values); 
    return Result; 
} 

परिणाम संग्रहीत प्रक्रिया निष्पादित की roweffected है, लेकिन मैं @Result का मूल्य प्राप्त करना चाहते हैं (उत्पादन प्रक्रिया का पैरामीटर), मैं इसे कैसे प्राप्त कर सकता हूं?

UserFieldClass है:

public class UserFieldSet 
{ 
    public Int32 UserId; 
    public String Name; 
    public String OrganicTitle; 
    public String UserName; 
    public String Password; 
} 

युक्ति: मैं के लिए @Result पाने के लिए इस कोड का उपयोग करना चाहिए पता है:

public Int32 SetUser(UserFieldSet Data) 
{   
    Int32 Result = 0; 
    DbCommand DbCmd = Db.GetStoredProcCommand("spSetUser"); 
    Db.AddInParameter(DbCmd, "@Name", DbType.String, Data.Name); 
    Db.AddInParameter(DbCmd, "@OrganicTitle", DbType.String, Data.OrganicTitle); 
    Db.AddInParameter(DbCmd, "@UserName", DbType.String, Data.UserName); 
    Db.AddInParameter(DbCmd, "@Password", DbType.String, Data.Password); 
    Db.AddOutParameter(DbCmd, "@Result", DbType.Int32, Int32.MaxValue); 
    Db.ExecuteNonQuery(DbCmd); 
    Result = (Int32)Db.GetParameterValue(DbCmd, "@Result"); 
    return Result; 
} 

लेकिन मैं इस methd साथ प्राप्त कर सकते हैं:

Result = Db.ExecuteNonQuery("spSetUser", values); 
+0

क्या आपने कॉल के बाद मूल्यों [4] 'को देखने का प्रयास किया है? क्या यह अद्यतन हो जाता है? हालांकि: यह अच्छी तरह से हो सकता है कि उस हस्ताक्षर का उपयोग करते समय, सभी पैरामीटर केवल इनपुट के रूप में जोड़े जाते हैं। –

उत्तर

3

क्या आपने इसके बजाय ExecuteScalar का उपयोग करने का प्रयास किया है?

+0

ExecuteScalar उपयोगी हो सकता है यदि आप एकल 'चयन' मान के बाद हैं; मैं किसी भी –

+1

को संभालने वाले 'आउट' पैरामीटर को बदलने की अपेक्षा नहीं करता, कृपया अपना कोड अपडेट करें, मैं अपनी तालिका में डेटा सम्मिलित करना चाहता हूं और उपयोगकर्ता आईडी का मूल्य प्राप्त करना चाहता हूं। मैं यह कैसे कर सकता हूँ –

+0

क्या आपको यह काम करने के लिए मिला? मैं वही कर रहा हूं जो आप हैं और इसे निष्पादित स्केलर का उपयोग करने के लिए भी बदल दिया है, लेकिन फिर भी आउट पैरामीटर खाली है। यदि आपको यह काम करने के लिए मिला है, तो क्या आप कृपया साझा करेंगे जो आपने किया था। धन्यवाद! – ptn77

1

जैसा कि मैंने सवाल पढ़ा है, आपके पास SetUser के दो कार्यान्वयन हैं; एक जो पैरामीटर को मैन्युअल रूप से AddInParameter और AddOutParameter का उपयोग करके कॉन्फ़िगर करता है, और वह केवल एक सरणी पास करता है। अगर मैं सही तरीके से प्रश्न समझता हूं, तो पहला दृष्टिकोण काम करता है, और दूसरा नहीं। और आप जानना चाहते हैं कि इसे कम वर्बोज़ दूसरे दृष्टिकोण के साथ कैसे काम करना है।

मेरी सलाह: नहीं। वर्बोज कोड काम करता है, और अधिक: यह सही कारणों से काम करता है - विशेष रूप से, यह पास-बाय-इंडेक्स की बजाय पास-बाय-नाम का उपयोग कर रहा है, जिसे हमेशा प्राथमिकता दी जानी चाहिए।

मेरा सबसे बड़ा सवाल, हालांकि, होगा: एंटरप्राइज़ लाइब्रेरी क्यों? - जो कच्चे ADO.NET की तुलना में बहुत कम जोड़ता है। अगर मैं सुविधा चाहता था, मैं शायद "व्यवसायिक" पर विचार करना होता, लेकिन फिर भी इस out मानकों के साथ एक faff का एक सा कर रहे हैं:

var args = new DynamicParameters(
    new { Data.Name, Data.OrganicTitle, Data.UserName, Data.Password}); 
// note: ^^ are actually specifying implicit names 
args.Add("Result", direction: ParameterDirection.Output); 

connection.Execute("spSetUser", args, commandType: CommandType.StoredProcedure); 
return args.Get<int>("Result"); 

आम तौर पर यह थोड़ा कि तुलना में आसान है, उदाहरण के लिए:

connection.Execute("spFoo", new { id = -1, name }, 
     commandType: CommandType.StoredProcedure);