2017-07-13 16 views
2

Ich versuche, eine gespeicherte Prozedur in SQL Server aus einem Datenbank zuerst MVC Entity Framework-Projekt aufzurufen, aber die Rückgabewerte gibt immer -1 zurück.Gespeicherte Prozedur gibt immer -1 zurück (asp.net MVC, Entität, SQL)

Ich habe viele verschiedene Möglichkeiten versucht, dies zu beheben und waren bisher nicht erfolgreich. Ich habe unten meinen Code aufgelistet, den ich für meinen relevanten Code halte. Lassen Sie mich wissen, wenn mehr Code erforderlich ist. Danke an alle, die helfen können!

Dies ist nur mein Testcode, um zu sehen, ob es richtig funktioniert.

public ActionResult Index() 
{ 
    Cust_Entities cse = new Cust_Entities(); 

    if (cse.DoesCustomerNumberExist("1") == 1) 
    { 
     return RedirectToAction("Index", "Home"); 
    } 
    else 
    { 
     return RedirectToAction("About", "Home"); 
    }   
} 

public virtual int DoesCustomerNumberExist(string customer_Number) 
{ 
    var customer_NumberParameter = customer_Number != null ? 
     new ObjectParameter("Customer_Number", customer_Number) : 
     new ObjectParameter("Customer_Number", typeof(string)); 

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("DoesCustomerNumberExist", customer_NumberParameter); 
} 

SQL Server gespeicherte Prozedur Code:

ALTER PROCEDURE [dbo].[DoesCustomerNumberExist] 
     @Customer_Number VARCHAR(20) 
AS 
BEGIN 
     SET NOCOUNT ON; 

     DECLARE @Exists INT 

     IF EXISTS(SELECT Customer_Number 
         FROM business_Final.dbo.AR_Customer 
         WHERE Customer_Number = @Customer_Number) 
     BEGIN 
      SET @Exists = '1' 
     END 
     ELSE 
     BEGIN 
      SET @Exists = '0' 
     END 

     RETURN @Exists 
END 
+0

Siehe https://stackoverflow.com/questions/10289626/execute-stored-proc-in-executestorequery-ef-is-this-a-bug-in-ef – Serg

+0

Seitennotiz: seit '@ Exists 'ist deklariert als 'INT' sollten Sie * NOT * keine einfachen Anführungszeichen verwenden (da Sie mit einem ** numerischen ** Wert arbeiten - keine Zeichenkette), wenn Sie Werte setzen - benutzen Sie 'SET @Exists = 1' - keine einfachen Anführungszeichen, keine unnötige Konvertierung von String zu Int usw. –

Antwort

3

Sie sind die nicht typisierte Version von ExecuteFunction verwenden. Nach dem Dokument:

Führt eine gespeicherte Prozedur oder Funktion aus, die in der Datenquelle definiert und im konzeptionellen Modell ausgedrückt wird; verwirft alle Ergebnisse zurückgegeben von der Funktion; und gibt die Anzahl der Zeilen zurück, die von der Ausführung betroffen sind.

Wenn keine Änderungen vorgenommen wurden, ist dies normalerweise -1.

Hier ist das doc auf die verschiedenen Formen der ExecuteFunction: https://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.executefunction(v=vs.110).aspx

+1

Sehr informativ und hilfreich. Vielen Dank!!! – snapper

2

Der Rückgabewert des nicht-generic ExecuteFunction ist die Anzahl der betroffenen Zeilen, nicht der Rückgabewert der gespeicherten Prozedur. Mit anderen Worten, es ist nur für Dinge wie Updates, Löschungen, etc., nicht ausgewählt.

Um Daten zurückzugeben, müssen Sie die generische Version verwenden, d. H. ExecuteFunction<TElement>, wobei TElement der Typ Ihrer Rückgabe ist. Dies liegt an der Tatsache, dass die Methode wissen muss, wie sie die Werte bindet, die sie von SQL Server zurückerhält.

Verwandte Themen