2012-04-26 13 views
10

Ich versuche, den Rückgabewert einer gespeicherten Prozedur zu erhalten. Hier ist ein Beispiel für eine solche gespeicherte Prozedur:Entity Framework - Rückgabewert der gespeicherten Prozedur

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

if @@rowcount = 0 
    return 1  

return 

Dies ist eine einfache Auswahl. Wenn 0 Zeilen gefunden werden, ist meine Ergebnismenge null, aber ich habe immer noch einen Rückgabewert.

Dies ist ein schlechtes Beispiel, da dies eine Auswahl ist, so dass ich sicher finden konnte, wenn 0 Zeilen zurückgegeben wurden. Bei einem Einfügen, Löschen oder anderen Aufrufen benötigen wir diesen Rückgabewert, um zu wissen, ob ein Problem aufgetreten ist. Ich habe keine Möglichkeit gefunden, diesen Rückgabewert zu erhalten. Ich kann Ausgabewerte erhalten, ich kann Ergebnismengen erhalten, aber keinen Rückgabewert.

Ich kann den Rückgabewert erhalten, wenn ich SQL manuell aufrufen, oder auch wenn ich eine SqlCommand mit dem Entity Framework ausführen, aber das ist nicht das, was ich tun möchte.

Hat jemand jemals den Rückgabewert von einer gespeicherten Prozedur mit Entity Framework erhalten?

Danke für die Hilfe!

+3

Entity Framework ein ORM ist und ist nicht vollständig, um alle Anrufe an die aus Ihrer Anwendung hergestellt Datenbank zu ersetzen. – cadrell0

+3

_I den Rückgabewert erhalten kann, wenn ich anrufen SQL manuell, oder sogar wenn ich einen SQLCommand mit der Entity Framework_ ausführen - das ist Ihre Antwort – jrummell

+0

@Lamak - Whoops mein Fehler, sah ich es unter 50% und nahm das Schlimmste. –

Antwort

2

Nein. Entity Framework verfügt nicht über umfangreiche Stored Procedure-Unterstützung, da es ein ORM ist, kein SQL-Ersatz.

Wie Sie bereits festgestellt haben, wenn Sie weniger häufige (erweiterte?) Funktionen von gespeicherten Prozeduren verwenden müssen, müssen Sie gute altmodische ADO.NET verwenden.

+2

Um hinzuzufügen: @@ rowcount wird eine zurückgeben Skalarwert, oder jeder select @ value gibt einen skalaren Wert zurück Wenn Sie bereits eine Ergebnismenge haben, fügt dies eine neue Ergebnismenge hinzu Gegenwärtig unterstützt 4.0 nicht mehrere Ergebnismengen, sondern Framework 4.5 mit EF unterstützt mehrere Ergebnismengen. – bugnuker

-1

Um das Interesse Ergebnis in EF zu erhalten, sollten Sie eine gleiche Struktur zurückkehren (nicht 1 und Namen, IsEnabled) In dieser Abfrage sollen Sie ‚‘, beispielsweise 0 statt 1 in dem if Zustand zurück:

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

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

Hat das etwas mit der Frage zu tun? – SQLMason

3

Ich konnte den Rückgabewert (und auch Ausgabe- und Eingabeparameter) mit Entity Framework 5 (aber ich denke, es funktioniert ab Version 4.x) mit dem Code zuerst Ansatz. Von Ihrem Post aus sehe ich nicht, welche Version von EF Sie verwenden und wie Sie Ihr Mapping durchführen. wenn man bedenkt, hier Code-First-Ansatz verwenden, können Sie meine Post mit der Lösung zu finden:

Get return value from stored procedure

4

Ich denke, Unterstützung von Stored Procedure Rückgabewerte ist abhängig von Version von Entity Framework. Obwohl der direkte Rückgabewert für mich nicht funktionierte, konnte ich mit dem OUTPUT gespeicherten Prozedurparameter Werte erhalten. Beispiel:

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 

Dies ist Testcode:

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); 
    } 
} 

Und das ist Ausgabe:

SP returned -1 
Output param 123 

Wie Sie direkt funktioniert Parameter Wert Ausgabe einige Müll aber OUTPUT zurück sehen!

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

this helps

0

Sie müssen die „Context.Database verwenden.Sqlquery“, und geben Sie den Ausgabetyp der gespeicherten Prozedur

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

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