2014-02-20 175 views
7

我有一個如下所示的存儲過程,它接受1個輸入參數(Name)並返回2個輸出參數(EmployeeId和Salary)。我們的存儲過程將Name插入到Employee表中,並將EmployeeId和Salary返回給我們。Database.SqlQuery調用具有多個輸出參數的存儲過程

CREATE PROCEDURE dbo.insertemployee 
@iName varchar(500), 
@OEmployeeId int OUTPUT, 
@OSalary Money OUTPUT 

我們正在使用EF Code First方法。我能夠將記錄插入員工表中,並且無法找到我如何訪問我的兩個輸出參數。我知道我需要像下面這樣使用。任何人都可以告訴我什麼是結果。根據MSDN,它可以是一個具有列名稱作爲屬性的類。但我的情況是,我們沒有返回我的表的列,但我們使用兩個輸出參數,我需要知道如何訪問@OEmployeeId和@OSalary這兩個輸出參數。

context.Database.SqlQuery<Result>(" exec dbo.insertemployee....); 

public class Result 
{ 
    // what properties I must give here  
} 

回答

20

您嘗試使用的方法僅適用於查詢結果。它不能將輸出參數的值自動放入一個新的對象中。

您必須顯式創建參數並在存儲過程運行後讀取它們的值。

所以,如果你有這樣一個存儲過程:

CREATE PROCEDURE dbo.insertemployee 
(
    @iName varchar(500), 
    @OEmployeeId int OUTPUT, 
    @OSalary Money OUTPUT 
) 
AS 
BEGIN 
    SELECT @OEmployeeId = 1337; 
    SELECT @OSalary = 1000; 
END 

...你可以執行它,並得到的參數是這樣的結果:

using (var ctx = new Context()) 
{ 
    var nameParam = new SqlParameter("iName", "TestName"); 

    var employeeIdParam = new SqlParameter("OEmployeeId", SqlDbType.Int) 
    { 
     Direction = System.Data.ParameterDirection.Output 
    }; 

    var salaryParam = new SqlParameter("OSalary", SqlDbType.Money) 
    { 
     Direction = System.Data.ParameterDirection.Output 
    }; 

    ctx.Database.ExecuteSqlCommand(
     "insertemployee @iName, @OEmployeeId out, @OSalary out", 
     nameParam, employeeIdParam, salaryParam); 

    var employeeId = (int)employeeIdParam.Value; 
    var salary = (decimal)salaryParam.Value; 
} 
+0

非常感謝彼得·漢森。這解決了我的問題。對於使用EF Code First調用具有輸出參數的存儲過程的問題,我很難找到任何帖子和博客。 – Ziggler

相關問題