2010-05-06 10 views
7

प्रदान नहीं किया गया था मुझे कोड के फोल्डविंग टुकड़े में कोई समस्या है। मैं निम्नलिखित कोड निष्पादित करने के लिए एक पैरामीटर (List<SqlParameter>) पास कर रहा हूं।SqlCommand.Parameters.AddWithValue समस्या: प्रक्रिया या फ़ंक्शन एक्स पैरामीटर @Y की अपेक्षा करता है, जिसे

जब यह SQL सर्वर निष्पादित करता है तो एक त्रुटि फेंकता है कि यह जांच एक पैरामीटर की अपेक्षा करता है जो प्रदान नहीं किया गया था। मुझे यह त्रुटि पता है और इसे समझते हैं, और कोड के माध्यम से कदम उठाने पर मैं देख सकता हूं कि cmdExecuteReader ऑब्जेक्ट में सही नाम और मान वाले पैरामीटर का संग्रह है। क्या समस्या हो सकती है?

 public SqlDataReader ExecuteReader(string storedProcedure, List<SqlParameter> parameters = null) 
     { 
        SqlCommand cmdExecuteReader = new SqlCommand() 
        { 
         CommandType = System.Data.CommandType.Text, 
         Connection = conn, 
         CommandText = storedProcedure 
        }; 

        if (parameters != null) 
        { 
         foreach (SqlParameter param in parameters) 
         { 
          cmdExecuteReader.Parameters.AddWithValue(param.ParameterName, param.Value); 
         } 
        } 

        if (conn.State == System.Data.ConnectionState.Closed) 
         conn.Open(); 
        return cmdExecuteReader.ExecuteReader(); 
     } 

उत्तर

10

.Value मानकों से किसी के लिए null करने के लिए सेट है? यदि ऐसा है, तो वे नहीं भेजे जाते हैं। प्रयास करें:

cmdExecuteReader.Parameters.AddWithValue(param.ParameterName, 
     param.Value ?? DBNull.Value); 

(ध्यान दें अशक्त-वालों DBNull.Value के साथ),

ही, ध्यान दें AddWithValue आपकी क्वेरी योजना फिर से उपयोग को प्रभावित कर सकता है कि (तार आदि के लिए) के रूप में यह की लंबाई का उपयोग करता है मूल्य। यदि आपको अधिकतम प्रदर्शन की आवश्यकता है तो परिभाषित आकारों के साथ पैरामीटर मैन्युअल रूप से सेटअप करना बेहतर है।

यह भी ध्यान दें कि संभावित आने वाली सूची में से कुछ पैरामीटर इनपुट-आउटपुट, आउटपुट या परिणाम हो सकते हैं।

SqlParameter newParam = cmdExecuteReader.Parameters.Add(
     param.ParameterName, param.SqlDbType, param.Size); 
newParam.Value = param.Value ?? DBNull.Value; 
newParam.Direction = param.Direction; 
+0

+1। मैं व्यक्तिगत रूप से AddWithValue का उपयोग नहीं करता, डेटाटाइप (और आकार) को स्पष्ट रूप से परिभाषित करने के लिए पसंद करता हूं - अन्यथा आप गलत धारणाओं (जैसे .NET स्ट्रिंग मानों को एनवीएआरएआरएआर के रूप में पारित किया जा रहा है) के साथ समाप्त हो सकते हैं, जिन्हें मैं पागल हूं – AdaTheDev

0

मैं सामान है कि आप क्या करने की कोशिश कर रहे हैं, यहाँ कुछ उदाहरण किया:

public int ChangeState(int id, int stateId) 
{ 
    return DbUtil.ExecuteNonQuerySp("changeDossierState", Cs, new { id, stateId }); 
} 

public IEnumerable<Dossier> GetBy(int measuresetId, int measureId, DateTime month) 
{ 
    return DbUtil.ExecuteReaderSp<Dossier>("getDossiers", Cs, new { measuresetId, measureId, month }); 
} 

मैं तुम्हें सलाह देते हैं here

देखने के लिए मैं बहुत अधिक की तरह कुछ के लिए स्थानापन्न करने के लिए परीक्षा की जाएगी

और नमूने समाधान डाउनलोड करने के लिए (जहां एक डीएएल नमूना प्रोजेक्ट शामिल है) http://valueinjecter.codeplex.com/

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