2014-03-29 57 views
1

目前我正在學習的數據訪問塊企業庫6.企業庫6 ExecuteSprocAccessor與數據庫參數

我想了解如何返回使用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; 
} 

用這種方法最重要的是,這些參數都被添加到集合中的相同的順序,他們被稱爲存儲過程。

我非常肯定,必須有一個有效的方法來做到這一點。當你注意參數必須匹配相同的順序存儲過程

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

:只是直接與要使用的值調用訪問 -

回答

0

你並不需要一個命令對象。

+0

如果sp有輸出參數,如何獲取它的值 –

+0

@ShashankSood,我的頭頂,我不認爲你可以用訪問器做到這一點,因爲他們只能訪問IDataReader和獲取輸出參數需要訪問實際的輸出參數。如果你只是想使用ADO.NET獲取輸出參數,那麼這應該有所幫助:https://stackoverflow.com/questions/290652/get-output-parameter-value-in-ado-net。 –

+0

不,我只想用這種方法 –