我目前正在学习Enterprise Library 6的DataAccess块。
我试图了解如何使用ExecuteSprocAccessor
返回一系列对象这是我正在使用的代码:
using (DbCommand cmd = sqlServerDB.GetStoredProcCommand("SalesByCategory"))
{
//Pass parameters
cmd.Parameters.Clear();
sqlServerDB.AddInParameter(cmd,"CategoryName",DbType.String,"Beverages");
sqlServerDB.AddInParameter(cmd, "OrdYear", DbType.String, "1996");
IRowMapper <OrderName> resmapper = MapBuilder<OrderName>.MapAllProperties()
.Map(x => x.Name).ToColumn("ProductName")
.Map(x => x.PurchaseTotal).ToColumn("TotalPurchase")
.Build();
List<OrderName> procaccessor = sqlServerDB.ExecuteSprocAccessor<OrderName>("SalesByCategory", resmapper, cmd.Parameters).ToList<OrderName>();
}
当它运行时,我得到一个&#34;参数的数量与存储过程的值的数量不匹配。&#34;错误。当我检查cmd.Parameters集合时,我确实看到了上面提到的2个参数。
我很确定错误发生在最后一条指令的cmd.Parameters上。根据文档,我可以使用对象数组。我如何使用DBParameter集合?
==更新3-29-2014 ==
在寻找答案一段时间后,我决定尝试创建一个将DBParameter转换为对象数组的方法。我创造了这个....
public static object[] ParametertoObj(DbCommand cmd)
{
object[] obj = new object[cmd.Parameters.Count];
int i = 0;
foreach (DbParameter item in cmd.Parameters)
{
obj[i] = item.Value;
i++;
}
return obj;
}
此方法的重要之处在于必须以与存储过程中调用的顺序相同的顺序将参数添加到集合中。
我很确定必须有一种有效的方法来实现这一目标。
答案 0 :(得分:0)
您不需要命令对象 - 只需使用您要使用的值直接调用访问者:
IRowMapper <OrderName> resmapper = MapBuilder<OrderName>.MapAllProperties()
.Map(x => x.Name).ToColumn("ProductName")
.Map(x => x.PurchaseTotal).ToColumn("TotalPurchase")
.Build();
List<OrderName> procaccessor = sqlServerDB.ExecuteSprocAccessor<OrderName>(
"SalesByCategory", resmapper, "Beverages", 1996).ToList<OrderName>();
注意,参数必须与存储过程的顺序相同。