SqlCommand.Parameters.AddWithValue проблема: процедура или функция X ожидает параметр @Y, который не был предоставлен - PullRequest
7 голосов
/ 06 мая 2010

У меня проблема с следующим фрагментом кода. Я передаю параметр (List<SqlParameter>) методу, выполняющему следующий код.

При выполнении 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();
       }

Ответы [ 2 ]

10 голосов
/ 06 мая 2010

Установлено ли для .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 голосов
/ 24 августа 2010

Я сделал то, что вы пытаетесь сделать, вот несколько примеров:

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/

...