Try   HackMD

前言

在自己嘗試去寫 Entity Framework 時,也以目前工作的專案現況作為研究方向,剛好在專案的預存程序有用到輸出參數,所以研究了一下在 EF 的框架下如何設定。

範例準備

  • 建立範例預存程序,Script 如下
CREATE PROCEDURE [dbo].[SimpleProcedure] @Message nvarchar(max) OUTPUT, @Nubmer int OUTPUT AS BEGIN SET @Message = 'This is output messgae' SET @Nubmer = 50 END
  • 建立 Console 專案 & 安裝 EntityFramework,並以 Database First 進行操作

執行預存程序,並取得輸出參數

各別使用以下作法來執行預存程序,並取得輸出參數。

預存程序方法

在 EntityFramework 設定完成後,預存程序會建立成 Entity 類別中的方法,並且傳入的參數就是預存程序的參數。

public virtual int SimpleProcedure(ObjectParameter message, ObjectParameter number)

使用預存程序方法來操作的程式碼如下

using (SimpleDBEntities context = new SimpleDBEntities()) { ObjectParameter message = new ObjectParameter("Message", typeof(string)); ObjectParameter number = new ObjectParameter("Number", typeof(int)); context.SimpleProcedure(message, number); Console.WriteLine(message.Value); Console.WriteLine(number.Value); }

上述程式重點整理:

  • SimpleProcedure 方法的參數型態為 ObjectParameter
  • ObjectParameter 建構子設定參數名稱及輸出參數型態
  • 執行完預存程序方法後,以 ObjectParameter.Value 取得輸出值

EXEC指令

EntityFramework 框架依然有支援直接執行 TSQL 指令的用法,程式如下

using (SimpleDBEntities context = new SimpleDBEntities()) { SqlParameter message = new SqlParameter(); message.ParameterName = "Message"; message.Direction = System.Data.ParameterDirection.Output; message.Size = -1; SqlParameter number = new SqlParameter(); number.Direction = System.Data.ParameterDirection.Output; number.ParameterName = "Number"; number.SqlDbType = System.Data.SqlDbType.Int; context.Database.ExecuteSqlCommand("EXEC SimpleProcedure @Message OUTPUT,@Number OUTPUT", message, number); Console.WriteLine(message.Value.ToString()); Console.WriteLine(number.Value.ToString()); }

上述程式重點說明:

  • 使用 SqlParameter,設定預存程序使用的參數
  • 輸出參數 Message 型態為 nvarchar(max),程式中要將 SqlParameter.Size 設為-1
  • 使用 SqlParameter.Value.ToString() 取得輸出參數值

參考資料

tags: Entity Framework