SqlCommand. Параметры. Проблема AddWithValue: Процедура или функция X ожидают параметр @Y, который не был предоставлен

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

Когда это выполняет броски SQL Server ошибка при высказывании, что proc ожидает параметр, который не был обеспечен. Я знаю эту ошибку и понимаю это, и когда продвижение через код I видит что 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();
       }
7
задан Rory 27 July 2013 в 17:32
поделиться

2 ответа

Установлено ли значение .Value в null для любого из параметров? Если да, то они не отправляются. Попробуйте:

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

(обратите внимание на null-коалесценцию с DBNull.Value)

Также обратите внимание, что AddWithValue может повлиять на повторное использование плана запросов, поскольку (для строк и т.д.) он использует длину значения. Если вам нужна максимальная производительность, лучше настроить параметр вручную, используя определенные размеры.

Также обратите внимание, что потенциально некоторые параметры во входящем списке могут быть вход-выход, выход или результат. Я был бы очень склонен заменить их на что-то вроде:

SqlParameter newParam = cmdExecuteReader.Parameters.Add(
      param.ParameterName, param.SqlDbType, param.Size);
newParam.Value = param.Value ?? DBNull.Value;
newParam.Direction = param.Direction;
10
ответ дан 7 December 2019 в 01:18
поделиться

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

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 Sample) http://valueinjecter.codeplex.com/

0
ответ дан 7 December 2019 в 01:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: