# 前言 在自己嘗試去寫 Entity Framework 時,也以目前工作的專案現況作為研究方向,剛好在專案的預存程序有用到輸出參數,所以研究了一下在 EF 的框架下如何設定。 # 範例準備 * 建立範例預存程序,Script 如下 ```sql= 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 進行操作 # 執行預存程序,並取得輸出參數 各別使用以下作法來執行預存程序,並取得輸出參數。 * [預存程序方法](#預存程序方法) * [EXEC 指令](#EXEC指令) ## 預存程序方法 在 EntityFramework 設定完成後,預存程序會建立成 Entity 類別中的方法,並且傳入的參數就是預存程序的參數。 ```csharp= public virtual int SimpleProcedure(ObjectParameter message, ObjectParameter number) ``` 使用預存程序方法來操作的程式碼如下 ```csharp= 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](https://learn.microsoft.com/zh-tw/dotnet/api/system.data.objects.objectparameter?view=netframework-4.8.1) * ObjectParameter 建構子設定參數名稱及輸出參數型態 * 執行完預存程序方法後,以 ObjectParameter.Value 取得輸出值 ## EXEC指令 EntityFramework 框架依然有支援直接執行 TSQL 指令的用法,程式如下 ```csharp= 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](https://learn.microsoft.com/zh-tw/dotnet/api/system.data.sqlclient.sqlparameter?view=netframework-4.6.2),設定預存程序使用的參數 * 輸出參數 Message 型態為 nvarchar(max),程式中要將 `SqlParameter.Size` 設為-1 * 使用 `SqlParameter.Value.ToString()` 取得輸出參數值 # 參考資料 > * [Get output parameter value](https://stackoverflow.com/questions/9367688/get-output-parameter-value) > * [Executing SQL Stored Procedure with Output Parameter from Entity Framework](https://stackoverflow.com/questions/22068027/executing-sql-stored-procedure-with-output-parameter-from-entity-framework) ###### tags: `Entity Framework`