【问题标题】:Enterprise Library 6 ExecuteSprocAccessor with database parametersEnterprise Library 6 ExecuteSprocAccessor 与数据库参数
【发布时间】:2014-03-29 18:19:17
【问题描述】:

我目前正在学习 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>();

        }

当它运行时,我得到一个“参数的数量与存储过程的值的数量不匹配”。错误。当我检查 cmd.Parameters 集合时,我确实看到了上述 2 个参数。

我很确定错误出现在最后一条指令中的 cmd.Parameters 上。根据文档,我可以使用对象数组。如何使用 DBParameter 集合?

== 2014 年 3 月 29 日更新 ==

在寻找了一段时间的答案后,我决定尝试创建一个将 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;
}

此方法的重要之处在于,参数必须按照在存储过程中被调用的顺序添加到集合中。

我很确定一定有一种有效的方法来做到这一点。

【问题讨论】:

    标签: enterprise-library


    【解决方案1】:

    您不需要命令对象——只需使用您要使用的值直接调用访问器即可:

    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>();
    

    正如您所注意到的,参数必须与存储过程的顺序相同。

    【讨论】:

    • 如果sp有输出参数,如何获取它的值
    • @ShashankSood,我不以为然,我认为您不能使用访问器来执行此操作,因为它们只能访问 IDataReader 并且要获取输出参数需要访问实际输出范围。如果您只想使用 ADO.NET 获取输出参数,那么这应该会有所帮助:stackoverflow.com/questions/290652/….
    • 不,我只想要这种方法
    猜你喜欢
    • 2011-10-28
    • 2011-09-29
    • 1970-01-01
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多