2012-04-26 74 views
10

我想獲取存儲過程的返回值。這是一個這樣的存儲過程的例子:實體框架 - 存儲過程返回值

select 
    Name, 
    IsEnabled 
from 
    dbo.something 
where 
    ID = @ID 

if @@rowcount = 0 
    return 1  

return 

這是一個簡單的選擇。如果找到0行,我的結果集將爲空,但我仍然會有一個返回值。

這是一個不好的例子,因爲這是一個選擇,所以我確定我可以找到是否返回0行。但是,在插入,刪除或其他調用時,我們需要此返回值來知道是否有問題。我一直無法找到獲得此返回值的方法。我可以得到輸出值,我可以得到結果集,但沒有返回值。

如果我手動調用SQL,或者即使使用實體框架運行SqlCommand,但我不想這樣做,我可以得到返回值。

有沒有人能夠使用實體框架從存儲過程獲取返回值?

感謝您的幫助!

+3

實體框架是一個ORM,並不打算完全替代,從您的應用程序的數據庫中的所有調用的輸出類型。如果我叫 – cadrell0 2012-04-26 19:17:00

+3

_I可以得到的返回值SQL,或者即使我使用實體framework_運行SQLCommand - 這就是你的答案 – jrummell 2012-04-26 19:22:12

+0

@Lamak - 哎呦,我的錯誤,我看到它低於50%,並且被認爲是最差的 – 2012-04-26 21:36:17

回答

2

編號實體框架沒有豐富的存儲過程支持,因爲它是一個ORM而不是SQL替換。正如你已經發現的那樣,如果你需要使用存儲過程中不太常見的(更高級的)特性,你將不得不使用老式的ADO.NET。

+2

要補充:@@ rowcount將返回一個標量值,或者就此而言,任何select @value都會返回一個標量值,如果你已經有了一個結果集,這將會添加一個新的結果集,目前4.0不支持多個結果集,但是帶EF的Framework 4.5支持多個結果集 – bugnuker 2012-04-26 22:42:46

-1

爲了讓有興趣的結果在EF,你應該返回相同的結構(沒有1名,的IsEnabled) 在這個查詢,你應該在if條件,例如返回「」,0而不是1:

 
select 
    Name, 
    IsEnabled 
from 
    dbo.something 
where 
    ID = @ID 

if @@rowcount = 0 
    return '',0 
+1

這與這個問題有什麼關係? – SQLMason 2012-05-02 20:29:37

3

我已經能夠使用代碼優先方法獲得實體框架5的返回值(以及輸出和輸入參數)(但我認爲它適用於版本4.x)。從你的文章中,我看不到你使用的是什麼版本的EF,以及你如何做你的映射;如果你考慮使用代碼,第一種方法在這裏,你可以找到我的帖子與解決方案:

Get return value from stored procedure

4

我想支持存儲過程返回的值取決於實體框架的版本。儘管直接返回值對我無效,但我設法使用OUTPUT存儲過程參數獲取了值。例如:

USE [YOUR_DB_NAME] 
GO 

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

CREATE PROCEDURE [dbo].[TestReturnValue] 
    @InputValue int = 0, 
    @Result int OUTPUT 
AS 
BEGIN 
    SET NOCOUNT ON; 
    SELECT @Result = @InputValue 
    RETURN(@InputValue); 
END 

這是測試代碼:

void TestReturnValue() 
{ 
    using (var db = new YourDBContext()) 
    { 
     var result = new System.Data.Objects.ObjectParameter("Result", 0); 
     Console.WriteLine("SP returned {0}", db.TestReturnValue(123, result)); 
     Console.WriteLine("Output param {0}", result.Value); 
    } 
} 

這是輸出:

SP returned -1 
Output param 123 

正如你看到的,直接返回值輸出一些垃圾,但OUTPUT參數的工程!

This article provides general info on two ways of returning values from SP

希望這有助於

0

您必須使用「Context.Database。SqlQuery類」,並指定存儲過程

 var spReturnVaue = Context.Database.SqlQuery<Type>("[schema].YourSp").FirstOrDefault(); 

     int firstId = Context.Database.SqlQuery<int>("[dbo].GetFirstId").FirstOrDefault();