2

Ich codiere eine Webanwendung mit ASP.NET MVC mit Entity Framework.Meine SQL Server-Prozedur gibt immer -1

Ich nenne das Verfahren, wie dies in C#:

var result = context.EditTechInfo(user.id, user.telephone, user.email); 

Wo context die Instanz Entity Framework ist.

Ich habe eine Prozedur, die immer -1 zurückgibt, aber es führt die UPDATE es soll tun. Ich habe versucht, meinen Wert unter Verwendung SELECT anstelle RETURN aber vergebens zurückzugeben. Hier

ist das Verfahren:

ALTER PROCEDURE EditTechInfo 
    (@tech INT, 
    @telephone CHAR(10), 
    @email VARCHAR(64)) 
AS 
BEGIN 
    SET NOCOUNT ON 
    DECLARE @result INT = 0 

    IF EXISTS (SELECT * FROM Techs WHERE id = @tech AND statut = 1) 
    BEGIN 
     UPDATE Techs 
     SET telephone = @telephone, email = @email 
     WHERE id = @tech 

     SET @result = 1 
    END 
    --ELSE 
    --BEGIN 
     --SET @result = -1 
    --END 

    SELECT @result 
END 

Auch wenn der Teil, wo -1 der zurückgegebene Wert wird kommentiert werden kann ...

Ich weiß, dass, wenn eine Prozedur gibt -1 es bedeutet, dass es ein Fehler war, aber ich kann nicht verstehen, wo und warum ...

---- EDIT -------

Wie im Kommentar gefragt, hier ist was EF generiert:

public virtual int EditTechInfo(Nullable<int> tech, string telephone, string email) 
     { 
      var techParameter = tech.HasValue ? 
       new ObjectParameter("tech", tech) : 
       new ObjectParameter("tech", typeof(int)); 

      var telephoneParameter = telephone != null ? 
       new ObjectParameter("telephone", telephone) : 
       new ObjectParameter("telephone", typeof(string)); 

      var emailParameter = email != null ? 
       new ObjectParameter("email", email) : 
       new ObjectParameter("email", typeof(string)); 

      return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("EditTechInfo", techParameter, telephoneParameter, emailParameter); 
     } 
+0

Was ist Ihr 'IF EXISTS' Ausdruck? – Shyju

+0

@Shyju Von was ich abziehe, gibt es wahr zurück, weil die Update-Anweisung ausgeführt wird – Chax

+0

Wie ist 'EditTechInfo' definiert?Ich wette, dass EF etwas vermasselt, entweder direkt oder wegen einer Diskrepanz zwischen ihm und Ihrer gespeicherten Prozedur. –

Antwort

1

Tetsuya Yamamoto vorgeschlagen arbeiten, dass ich OUTPUT Parameter verwenden. Ich habe ein bisschen mehr über the subject gelesen. Ich entschied mich für diesen Ansatz und es funktionierte.

habe ich eine neue Paramter, die OUTPUT Parameter bemerken

Hier ist die PROCEDURE modifiziert:

CREATE PROCEDURE EditTechInfo 
(
    @tech   INT, 
    @telephone  CHAR(10), 
    @email   VARCHAR(64), 
    @result   INT OUTPUT --- this is new 
) 
AS 
BEGIN 
    SET NOCOUNT ON 
    SET @result = 0; 

    IF EXISTS (SELECT * FROM Techs WHERE id = @tech AND statut = 1) 
    BEGIN 
     UPDATE Techs 
      SET telephone = @telephone, email = @email 
     WHERE id = @tech 

     SET @result = 1 
    END 
    ELSE 
    BEGIN 
     SET @result = -1 
    END 

    RETURN @result -- I don't know if i have to actually return it since it is an output param 
END 

Hier ist, wie Sie es in c# nennen: (beachten Sie, dass es sich um eine über vereinfachtes Code)

Das große Addon hier ist, dass ich den variablen Typ result zuänderte. Danach musste ich die Value meines Ergebnisses abrufen. Ich habe es in eine int gegossen, ansonsten ist es eine einfache Object.

public int GetEditTechInfoValue(int id, string telephone, string email) 
     { 
      var result = new ObjectParameter("result", 0); 
      var type = result.ParameterType; 

      // This is an instance of my EntityFramework entities...you get the point 
      context.EditTechInfo(id, telephone, email, result); 

      return (int)result.Value; 
     } 
-1

Die bekommen -1 wegen der SET NOCOUNT ON. Entweder entfernen Sie sie oder geben Sie SET NOCOUNT OFF an, um die Anzahl der vom proc betroffenen Zeilen zu ermitteln.

Beachten Sie, dass die weit verbreitete Verwendung von SET NOCOUNT ON ihre Wurzeln im klassischen ADODB hat, wo die Rowcounts (eigentlich DONE_IN_PROC TDS-Nachrichten) Anwendungen verwechselten, die sie nicht erwarteten. Dies ist kein Problem mit SqlClient, da die API aus Entwicklungssicht besser spielt.

+0

Dies beeinflusst den Rückgabewert? – Chax

+1

Nein, 'SET NOCOUNT ON 'wirkt sich nicht auf den Rückgabewert aus. Und es ist eine gute Idee, weil es den Netzwerkverkehr reduzieren kann. http://weblogs.asp.net/jongalloway/How-NOCOUNT-effects-ADO.NET –

+0

@ JonathanAllen, stimme ich 'SET NOCOUNT' es wird nicht den Rückgabewert der gespeicherten Prozedur beeinflussen, aber es wird den Wert zurückgegeben von SqlCommand.ExecuteNonQuery. Ich bin nicht viel von einem EF-Typ, aber ich dachte, das ist, was tatsächlich zurückgegeben wurde, anstatt die gespeicherte Prozedur Rückgabewert. –

1

diesen Code Versuchen .it auf EF 6+

String spQuery = String.Format("EditTechInfo {0},'{1}','{2}'", 0, "telephone ", "email"); 
int result = context.Database.SqlQuery<int>(spQuery).FirstOrDefault(); 
+0

Ah ja, die Antwort auf jedes EF-Problem ist so ziemlich "so tun Sie Dapper". –

+0

Das ist eine Arbeit, aber ich weiß immer noch nicht, wie ich meinen Fehler korrigieren soll und warum er immer -1 zurückgibt – Chax

Verwandte Themen