2015-07-29 8 views
16
CREATE PROC spIsValidUser 
    @UserName varchar(50), 
    @Password varchar(50) 
AS 
    IF Exists(SELECT * FROM Users where [email protected] and [email protected]) 
    BEGIN 
     return 0 

    END 
    ELSE 
    BEGIN 
     return 1 
    END 
GO 

Ich habe diese Stored Procedure und Tring erstellt diese Stored Procedure mit Entity Framework zu nennen. Unten ist Code in C# geschrieben.Stored Procedure return -1 für alle Fälle in Entity Framework

MyBusEntities db = new MyBusEntities(); 
int empQuery = db.spIsValidUser("abc", "[email protected]"); 

spIsValidUserStored Procedure Rückkehr -1 in jedem Fall. Bitte lass mich einen Fehler wissen.

EDIT - Nach gegebener Antwort, Abspeicherprozedur nicht return-Anweisung verwendet, da Entity Framework nicht Procedure Return Stored unterstützen kann Einzelwerte aus dem box..Let mich wissen, wie kann ich skalare Daten aus Stored Procedure schicken?

+0

Haben Sie versucht, in den Code zu dem Schritt, aufzuzählen, das Verfahren oder manuell das Verfahren direkt auf dem SQL Server ausgeführt werden? Ich vermute es ist mit, aber es ist nicht möglich zu sagen, es sei denn, wir debuggen schnell durch. –

+0

ist db definiert und ordnungsgemäß instanziiert. (Wenn Sie aufzählen) Ist eine spIsValidUser-Prozedur aufgelistet. Was gibt diese Prozedur zurück, wenn Sie sie manuell auf dem SQL-Server aufrufen? –

+0

Ja. Ich habe spIsValidUser manuell unter Verwendung der Unteranweisung in sQL Server ausgeführt. EXEC spIsValidUser 'abc' 'abc @ 123' und es gibt mir Ausgabe 0. und ich habe auch Db überprüft. Es ist richtig definiert und instanziiert. – chirag

Antwort

7

Ihre gespeicherte Prozedur gibt derzeit einen Skalar Wert zurück. Verwenden Sie die folgenden Schritte, um dieses Problem zu lösen:

  • Ändern Sie Ihre gespeicherte Prozedur wie folgt aus (Verwenden Sie das Schlüsselwort nicht return in der gespeicherten Prozedur den Wert zurückkehren kann Entity Framework nicht unterstützen Stored Procedure Zurück Skalar Werte . aus dem Kasten heraus, aber es gibt eine Arbeit um):

    ALTER PROC spIsValidUser 
    @UserName varchar(50), 
    @Password varchar(50) 
    AS 
    SELECT Count(*) FROM Users where UserName= @UserName and Password= @Password 
    return 
    
  • Sie müssen die gespeicherte Prozedur als Function importieren. Klicken Sie mit der rechten Maustaste auf den Arbeitsbereich Ihres Entitätsmodells und wählen Sie Add -> Function Import.

  • Im Add Function Import Dialog geben Sie den Namen der gespeicherten Prozedur wollen in Ihrem Modell bezeichnet werden, wählen Sie Ihre Prozedur aus der Dropdown-Liste, und den Rückgabewert des Verfahrens wählen sein Scalar .

  • Schließlich schreiben Sie wie folgt Code:

    MyBusEntities db = new MyBusEntities(); 
    System.Nullable<int> empQuery = db.spIsValidUser("abc", "[email protected]").SingleOrDefault().Value; 
    MessageBox.Show(empQuery.ToString());// show 1 if Exist and 0 if not Exist 
    

Edit: Ich denke, Unterstützung von Stored Procedure Rückgabewerte ist abhängig von Version von Framework Entity. Auch Entity Framework verfügt nicht über umfangreiche Stored Procedure-Unterstützung, da es ein ORM, kein SQL-Ersatz ist.

5

Haben Sie Ihre gespeicherten Prozeduren korrekt in das EF-Modell importiert? und setzen Sie den korrekten Rückgabetyp auf gespeicherte Prozeduren?

Es gibt 4 mögliche Rückkehr Typ, den Sie Ihre Verfahren Die möglichen Rückgabetypen festlegen können: Sie

  1. keine
  2. Skalare
  3. Complex
  4. Entities

muss Skalar-Rückgabetyp festlegen.

wenn Sie nicht wissen, wie Sie den Rückgabetyp zu setzen, dann ist hier die vollständigen Tutorial http://www.binaryintellect.net/articles/30738a7c-5176-4333-aa83-98eab8548da5.aspx

kurzes Beispiel.

CREATE PROCEDURE CustOrderCount 
    @CustomerID nchar(5) 
AS 
BEGIN 
    SELECT COUNT(*) FROM ORDERS 
     WHERE [email protected]; 
END 


NorthwindEntities db = new NorthwindEntities(); 
var count = db.CustOrderCount("ALFKI"); 
int ordercount = count.SingleOrDefault().Value; 

Dies wird int Count-Anzahl zurückgeben.

+0

Ich versuche schon dieses Ding. Ich habe gespeicherte Prozedur in EF-Modell importiert und Rückgabetyp festgelegt. lassen Sie mich wissen, welchen Rückgabetyp ich in diesem Fall einstellen muss? Zur Zeit habe ich "keine" Rückgabetyp eingestellt. Auch ich habe versucht, skalare Typ (Int32) zu ändern, aber es gibt mir Laufzeitausnahme. – chirag

+0

Wären Sie in der Lage, Ihr Problem als Beispiellösung in github zu setzen und uns einen Zugang zu geben. Das ist der einzige Weg, ich könnte Ihnen sagen, warum es zurückgibt -1 –

+0

danke Vijay ... – chirag

5

Haben Sie versucht:

CREATE PROC spIsValidUser 
    @UserName varchar(50), 
    @Password varchar(50) 
AS 
    IF Exists(SELECT * FROM Users where [email protected] and [email protected]) 
    BEGIN 
     SELECT 0 

    END 
    ELSE 
    BEGIN 
     SELECT 1 
    END 
GO 
+0

es funktioniert gut. Es gibt ObjectResult zurück und nach Anwendung der SingleOrDefault() - Funktion gibt es korrekte Ergebnisse. – chirag