我试图使用循环将值从对象params数组传递到存储过程的每个参数,但出现此错误
“过程或函数Proc_GetPaging_Product指定的参数过多。”
问题是cmd.Parameters
使用时已经有参数,SqlCommandBuilder.DeriveParameters(cmd)
因此无需添加值即可分配。
public ServiceResult<T> GetPaging<T>(params object[] values)
{
var result = new ServiceResult<T>();
using(_conn)
{
_conn.Open();
using (SqlCommand cmd = _conn.CreateCommand())
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "[SalesLT].[Proc_GetPaging_Product]";
SqlCommandBuilder.DeriveParameters(cmd);
int lengthParams = cmd.Parameters.Count;
for (int i = 1; i < lengthParams; i++)
{
cmd.Parameters.AddWithValue(cmd.Parameters[i].ParameterName, values[i - 1]);
}
using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
var item = Activator.CreateInstance<T>();
var properties = typeof(T).GetProperties();
foreach (var property in properties)
{
//Type convertTo = Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType;
property.SetValue(item, reader[property.Name], null);
}
result.ListResult.Add(item);
}
reader.NextResult();
}
}
}
return result;
}
您要两次添加参数。
在该行中:
SqlCommandBuilder.DeriveParameters(cmd);
并为循环中的每个参数设置一次:
for (int i = 1; i < lengthParams; i++) { cmd.Parameters.AddWithValue(cmd.Parameters[i].ParameterName, values[i - 1]); }
不用使用AddWithValue
,只需做cmd.Parameter[i].Value = values[i]
。
同样,参数集合与.Net中的任何其他内置集合一样,都是从零开始而不是从一个开始。
您的循环应如下所示:
for (int i = 0; i < lengthParams; i++)
{
cmd.Parameters[i].Value = values[i];
}
另外,我应该在循环之前添加一个条件,以确保您拥有的值数与存储过程具有的参数数相匹配。
还有一点需要注意:您应该考虑在代码中设置参数,而不要使用DeriveParameters
:官方文档明确指出:
DeriveParameters需要对数据库的附加调用才能获取信息。如果预先知道参数信息,则通过显式设置信息来填充参数集合会更有效。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句