![](/img/trans.png)
[英]Entity Framework not getting Spatial type data in result from Sql Server stored procedure
[英]Getting data from stored procedure with Entity Framework
我正在嘗試使用從數據庫上下文對象(使用Entity Framework 6.1.1)調用的動態SQL存儲過程來獲取表的內容,以便填充GridView
控件。 我無法檢索數據。
這是存儲過程。 這是一個有關存儲過程中SQL注入的學生演示,所以我知道這是可注入的,也很好。
ALTER PROCEDURE dbo.SearchProducts
@SearchTerm VARCHAR(max)
AS
BEGIN
DECLARE @query VARCHAR(max)
SET @query = 'SELECT * FROM dbo.Products WHERE Name LIKE ''%' + @SearchTerm + '%'''
EXEC(@query)
END
我隨后用來執行存儲過程的C#代碼是:
var db = new MyEntities();
var TEST_SEARCH_TERM = "product";
var result = db.SearchProducts(TEST_SEARCH_TERM);
MyGridView.DataSource = result;
MyGridView.DataBind();
在執行時,在Visual Studio的數據庫資源管理器中,存儲過程可以正常工作。 但是,當在運行中的ASP.NET應用程序中執行時,我在DataBind()
方法中得到了一個異常,因為result
返回-1
而不是包含存儲過程的SELECT所產生對象的IEnumerable
DataSet
。
如何檢索數據並填充GridView
?
使用以下步驟解決此問題:
Add -> Function Import
。 Search_Products
,從下拉列表中選擇過程,然后將過程的返回值選擇為Entities
並從中選擇Products
。下拉列表。 然后在后面的代碼中:
var db = new MyEntities(); var TEST_SEARCH_TERM = "product"; var result = db.Search_Products(TEST_SEARCH_TERM);//Search_Products is the name that you specified in Function Import dialog MyGridView.DataSource = result; MyGridView.DataBind();
結果為-1
的原因是Entity Framework無法直接支持存儲過程返回值。 我認為對存儲過程返回值的支持取決於Entity Framework的版本。 另外,Entity Framework不具有豐富的存儲過程支持,因為它是ORM而不是SQL的替代品。
在使用動態SQL的存儲過程中,我曾經遇到過這種情況。 如果添加“ SET FMTONLY OFF;”行,則我在使用復雜類型方面取得了成功。 (請參閱https://msdn.microsoft.com/zh-cn/library/ms173839.aspx ),然后將其添加到EF模型中。 使用復雜類型設置模型后,請確保刪除此行。
例:
ALTER PROCEDURE dbo.SearchProducts
@SearchTerm VARCHAR(max)
AS
BEGIN
SET FMTONLY OFF;
DECLARE @query VARCHAR(max)
SET @query = 'SELECT * FROM dbo.Products WHERE Name LIKE ''%' + @SearchTerm + '%'''
EXEC(@query)
END
驗證您的EDMX是否具有返回類型:轉到Function Imports-> SearchProducts,然后雙擊它。
為了利用復雜返回類型,實體框架將要求您在存儲過程中顯式定義列名,而不是使用*。
一旦修改了存儲過程以定義列名,就可以在項目中更新模型。 (請注意,執行完整的SP刪除,然后將其重新添加到edmx可能是最佳途徑。)
編輯
也許您可以像下面這樣修改您的SP:
ALTER PROCEDURE dbo.SearchProducts
@SearchTerm VARCHAR(max)
AS
BEGIN
SELECT * FROM dbo.Products WHERE Name LIKE '%' + @SearchTerm + '%'
END
您似乎已經解決了問題,下面的鏈接提供了Microsoft的官方文檔:
如何將存儲過程導入到實體數據模型: https : //msdn.microsoft.com/zh-cn/library/vstudio/bb896231(v=vs.100).aspx
EF設計器中的復雜類型: https : //msdn.microsoft.com/en-gb/data/jj680147.aspx
確保使用最新版本的.net,並且在更改數據庫時保持模型最新。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.