簡體   English   中英

使用Entity Framework從存儲過程獲取數據

[英]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

使用以下步驟解決此問題:

  1. 您需要將存儲過程導入為函數。 右鍵單擊實體模型的工作區,然后選擇Add -> Function Import
  2. 在“添加函數導入”對話框中,輸入要在模型中引用存儲過程的名稱,例如Search_Products ,從下拉列表中選擇過程,然后將過程的返回值選擇為Entities並從中選擇Products 。下拉列表。
  3. 然后在后面的代碼中:

     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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM