2010-05-06 29 views
7

我遇到下面這段代碼有問題。我將一個參數(List<SqlParameter>)傳遞給執行以下代碼的方法。SqlCommand.Parameters.AddWithValue問題:過程或函數X需要參數@Y,它沒有提供

當它執行SQL Server時會拋出一個錯誤,指出proc需要一個未提供的參數。我知道這個錯誤並理解它,並且在單步執行代碼時,我可以看到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字符串值作爲NVARCHAR傳遞) – AdaTheDev 2010-05-06 11:41:58

0

我這樣做你正在嘗試做的東西,這裏的一些例子:我建議你看看here

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

並下載樣本解決方案(其中包含DAL示例項目) http://valueinjecter.codeplex.com/

相關問題