У меня есть проблема с 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();
}
Установлено ли значение .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;
Я сделал то, что вы пытаетесь сделать, вот несколько примеров:
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/