2

私はEntity Frameworkを使用してASP.NET MVCでWebアプリケーションをコーディングしています。私のSQL Serverプロシージャは常に-1を返します

私はC#で、このようにプロシージャを呼び出す:contextは、Entity Frameworkのインスタンスである

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

私は常に-1を返しますが、実行する手順はUPDATEです。私はRETURNの代わりにSELECTを使用して私の価値を返そうとしましたが、役に立たなかった。ここで

は手順です:

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 

-1返された値が...

をコメント化されてできた部分は、私が手続きを返す場合は-1、それはそれが意味することを知っている場合でも、エラーでしたが、私はどこにも理由を理解することはできません...

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

ここでは、コメントに尋ねたようEFが発生したものです:

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

あなたの 'IF EXISTS'式は何を返しますか? – Shyju

+0

@Shyju更新ステートメントが実行されるのでtrueを返します。 – Chax

+0

'EditTechInfo'はどのように定義されていますか?私は、EFが直接的に、またはストアドプロシージャとの不一致のために、何かを突っついていると賭けても構わないと思います。 –

答えて

1

Tetsuya Yamamoto私はOUTPUTパラメータを使用することをお勧め6+ EF上で動作するこのコードを試してみてください。 the subjectについてもう少し読んだことがあります。私はこのアプローチを採用することにしました。

私はここでOUTPUTパラメータに

に気づく、新しいPARAMTERを追加、修正PROCEDUREです:ここでは

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 

は、あなたがc#内で呼び出す方法です: (それは単純化の上にあることに注意してくださいコード)

ここで大きなアドオンはresult変数タイプをに変更したことです。その後、結果のValueを取得する必要がありました。私はそれをintにキャストしました。それ以外の場合は単純な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

SET NOCOUNT ONのため-1が発生しています。それを削除するか、SET NOCOUNT OFFを指定して、procの影響を受ける行の数を取得してください。

SET NOCOUNT ONが広く普及していることは、従来のADODBに根ざしていることに注意してください。ここでは、rowcounts(実際にはDONE_IN_PROC TDSメッセージ)は、アプリケーションを予期していないものと混同していました。これは、開発の観点からAPIがより良く動作するため、SqlClientでは問題になりません。

+0

これは戻り値に影響しますか? – Chax

+1

いいえ、 'SET NOCOUNT ON'は戻り値に影響しません。それを使用することは、ネットワークトラフィックを減らすことができるため、良い考えです。 http://weblogs.asp.net/jongalloway/How-NOCOUNT-affects-ADO.NET –

+0

@ JonathanAllen、私はそれがストアドプロシージャの戻り値には影響しませんが、SET NOCOUNTに同意しますが、返される値に影響しますSqlCommand.ExecuteNonQueryによって。私はEFの人ではありませんが、ストアドプロシージャの戻り値ではなく実際に返されたものだと思いました。 –

1

は.ITは

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

ああ、すべてのEF問題に対する答えは、「あなたがDapperを使っているふりをする」ことです。 –

+0

これは回避策ですが、私はまだ自分のエラーを修正する方法と、常に-1を返す理由を知らない – Chax

関連する問題