2011-02-21 215 views
8

我有一個存儲過程返回一個值,而不是數據集,我有問題讓它與EF4一起工作。使用參數調用存儲過程

我已經看到了這一點:http://dotnet.dzone.com/news/how-retrieve-stored-procedure

這裏是我所做的:我添加了一個過程模型,並導入功能。

我遇到的第一個問題是,我的過程中的參數被命名爲@_Parameter_in。這使得EF將它們作爲p_Parameter_in帶入,因爲它不會與下劃線一起作爲第一個字符。然後,當我調用存儲過程時,我可以在SQL Profiler調用中看到它尋找@p_Parameter_in,當然還有一個問題。

現在我重新命名了這些參數並查看了SQL Trace - 一切都看起來很棒。問題是我無法獲得價值。這裏是我的代碼的外觀:

System.Data.Objects.ObjectParameter newKey = new System.Data.Objects.ObjectParameter("NewKey_out", typeof(Int32)); 
newKey.Value = 0; 
context.GetNextSurrogateKey_v2("tTest", newKey); 

調用newKey.Value後,它總是0或任何值我將其設置爲。它不會帶來價值。我懷疑我的問題是如何導入功能。我使用標量和數據類型Int32。出於某種原因,「爲我創建新的複雜類型」已禁用。有人有這個問題嗎?

回答

7

我在這裏猜測,因爲我看不到你打電話的存儲過程。我想你想要檢索存儲過程返回的標量值,而不是存儲過程中定義的輸出參數的值。

我相信你想在EDM中定義一個新的函數,並將其指向存儲過程。快速谷歌有這個可能的解決方案:http://www.devtoolshed.com/using-stored-procedures-entity-framework-scalar-return-values

HTH

+0

這是值得關注的東西,我可能只是修改程序來這樣工作。目前我不會返回標量值。我將值賦給存儲過程中的OUTPUT參數。 – katit

+0

這也行不通。我得到錯誤「由商店數據提供商返回的數據讀取器沒有足夠的列來查詢請求」 – katit

+0

好吧,我讓它工作。在存儲過程的末尾放置選擇@MyValue。如果可以在EF中使用OUTPUT參數,問題仍然是開放的。 – katit

2

的問題是,DataReader的後EF過程輸出參數結束閱讀。通常在調用DataBind()函數後。 我有更長的處理程序相同的問題。我通過在ObjectResult上使用.ToList()函數解決了這個問題。

var rowsCount = new ObjectParameter("RowsCount", typeof(Int32));  
var result = db.GetProductList(pageSize, pageNumber, rowsCount).ToList(); 
this.ProductsCount = (int?)rowsCount.Value; 

單行或值可以用FirstOrDefault()函數解決。

0

我與Jan Remunda所述的問題相同。有人將返回類型從Integer更改爲Entity.Core.Objects.ObjectResult(Integer?),導致始終不返回任何內容。

對於我們來說,解決方案是強制EF通過向返回中添加.FirstOrDefault()函數來讀取存儲過程的返回值。

相關問題