我对下面的代码有疑问。我将参数(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();
}
答案 0 :(得分: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;
答案 1 :(得分: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
并下载样本解决方案(其中包含DAL示例项目) http://valueinjecter.codeplex.com/