2012-12-11 15 views
12

इम के लिए इकाई की रूपरेखा का उपयोग कर 4.3 कोड पहले प्रक्रिया जिस तरह से मैं फोन संग्रहीत प्रक्रिया इस तरह है संग्रहीत कॉलिंग:एसक्यूएल पैरामीटर आदेश बदलने पर इकाई फ्रेमवर्क अपवाद फेंकता है?

var parameters = new[] 
{ 
    new SqlParameter("member", 1), 
    **new SqlParameter("Code","0165210662660001"),** 
    new SqlParameter("PageSize", 1), 
    new SqlParameter("PageNumber",1) 
}; 

var result = context.Database.SqlQuery<resultClass>(
    "mySpName @member, @Code, @PageSize,@PageNumber" parameters).ToList(); 

यह SqlServer पर निष्पादित हो जाता है और मैं परिणाम मिलता है।

लेकिन अगर मैं इस तरह paramaters का क्रम बदल:

var result = context.Database.SqlQuery<resultClass>("mySpName @Code, @member,@PageSize,@PageNumber" parameters).ToList(); 

var parameters = new[] 
{ 
    **new SqlParameter("Code","0165210662660001"),** 
    new SqlParameter("Member", 1), 
    new SqlParameter("PageSize", 1), 
    new SqlParameter("PageNumber",1) 
}; 

मैं इस तरह एक त्रुटि मिली:

Error converting data type nvarchar to int 

संग्रहीत प्रक्रिया इस तरह है:

ALTER PROCEDURE [c].[mySpName] 
    @Member INT , 
    @Code VARCHAR (50) , 
    @PageSize INT , 
    @PageNumber INT 
AS 

मुझे यह आदेश क्यों मिलता है? पैरामीटर ऑर्डर रखना महत्वपूर्ण है? मैं क्या कर सकता हूं ताकि मैं पैरामीटर ऑर्डर के बारे में चिंतित किए बिना संग्रहीत प्रक्रिया को कॉल कर सकूं?

============ मैं एक समाधान खोजने के लिए और यह पूरी तरह से काम करता है ============

public class blahContext<T> 
{ 
    int i = 0; 
    public IEnumerable<T> ExecuteStoreQuery(string SPname, SqlParameter[] parameters) 
    { 

     using (var context = new CADAContext()) 
     { 


      string para = string.Join(", ", (from p in parameters 
              where !"NULL".Equals(p.Value) 
              select string.Concat(new object[] { "@", p.ParameterName, "={", this.i++, "}" })).ToList<string>()); 

      object[] x = (from p in parameters 
          where !"NULL".Equals(p.Value) 
          select p.Value).ToArray<object>(); 

      return context.Database.SqlQuery<T>(SPname + " " + para, x).ToList(); 

     } 
    } 
+0

ऐसा इसलिए है क्योंकि आपने एसपी का आह्वान करते समय पैरामीटर का क्रम बदल दिया - स्पष्टीकरण के लिए नीचे मेरा उत्तर देखें। –

उत्तर

6

की वजह से इसे नहीं है पैरामीटर ऑर्डर आपके पैरामीटर ऑब्जेक्ट में - ऐसा इसलिए है क्योंकि आपके दूसरे कोड स्निपेट में आप स्पष्ट रूप से @Code मान को पहले पैरामीटर के रूप में पास कर रहे हैं जब एसपी Member INT मान की अपेक्षा कर रहा है।

var result = context.Database.SqlQuery<resultClass>("mySpName @Code, @member,@PageSize,@PageNumber" parameters).ToList(); 

... आप पहले पैरामीटर के रूप "0165210662660001" में गुजर रहे हैं और INT करने के लिए रूपांतरण विफल हो रहा है।

अपने मापदंडों के लिए अपने मानकों में आपत्ति एफई (ADO.NET वास्तव में) के रूप में अप्रासंगिक है आपकी क्वेरी स्ट्रिंग में @parametername मूल्यों के उन मानकों को मैप कर देंगे। तो new SqlParameter("Code","0165210662660001") को आपकी क्वेरी में @Code स्थिति में मैप किया जाएगा - जो कि दूसरा कोड छीन लिया गया है वास्तव में एसपी द्वारा अपेक्षित सदस्य मूल्य की स्थिति है।

हालांकि ... तुम भी नाम वाले पैरामीटर का उपयोग कर एक सपा निष्पादित कर सकते हैं और उस मामले में आप नीचे के रूप में किसी भी क्रम में करने के लिए सपा पैरामीटर पास कर सकते हैं:

db.Database.SqlQuery<resultClass>("mySpName [email protected],[email protected],[email protected],[email protected]", parameters).ToList(); 

आप देखते हैं कि मैं नहीं कर रहा हूँ एसपी को पैरा को पारित करने के क्रम में [एसपी द्वारा] परिभाषित किया गया था, लेकिन क्योंकि उनका नाम है, मुझे परवाह नहीं है।

पारित होने के विभिन्न तरीकों के लिए देखें: यह Answer कुछ अच्छे उदाहरणों के लिए।

+0

यह एक कामकाज नहीं है, मैंने प्रश्न – 1AmirJalali

+0

संपादित करके वर्कअराउंड जोड़ा है जैसे पैरामीटर का क्रम बिल्कुल मायने रखता है ... उदा। यदि एसपी के पास इस क्रम में पैरा हैं: ए, बी, सी - तो यह ए, बी, सी – mmcrae

+0

के पहले 3 पैराम्स को मानचित्र करता है यदि आप तर्क मानों को पार करते समय नामित पैरामीटर का उपयोग नहीं करते हैं। जैसे। exec mySpName पेज नम्बर = 1, कोड = 2, पेजसाइज = 3, सदस्य = 'अल्फा' –

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