12

Linq でストアド プロシージャの戻り値にアクセスしようとしています。

DECLARE @ValidToken int = 0 //I have also tried using a bit instead of an int here.

IF EXISTS(SELECT 1 FROM Tests WHERE TestToken = @Token)
    select @ValidToken = 1

return @ValidToken

これは、SQL Studio を介して SP を実行するときに機能します。ただし、datacontext クラスを使用して linq で実行しようとすると、常に -1 が返されます。

using (DataEntities dataEntities = new DataEntities())
    {
        int query = data.ValidateToken(id);
        Response.Write(query.ToString());
    }

query は常に -1 になりますが、その理由はわかりません。

オンラインで調べたところ、戻り値を取得する簡単な方法があるように見えますが、プログラムの残りの部分が使用しているため、Linq に固執したいと思います。

4

5 に答える 5

5

ストアド プロシージャを関数として使用するのはなぜですか?

ストアド プロシージャには がありますがreturn、関数ではないため、returnデータを返すために使用しないでください。

むしろ、 MSDN に記載されているように、出力パラメーターやその他の方法でデータを返す必要があります。

の使用についてreturn、MSDN で文書化されています。

おそらく誤用returnが、LINQ がストアド プロシージャを認識しない理由です。

于 2013-05-25T14:29:52.233 に答える
0

RETURN 0/1 ステートメントを SELECT 0/1 に変更してみてください

于 2013-04-17T11:25:51.497 に答える
0
CREATE PROCEDURE [dbo].[MyProc]         
AS
BEGIN
    DECLARE @Ret INT

    // use of IF EXISTS instead of IF
    IF EXISTS(SELECT * from Tests WHERE TestToken = @Token)
        SELECT @Ret =  0
    ELSE
        SELECT @Ret =  1

    RETURN @Ret
END
于 2013-05-27T10:07:45.557 に答える
0

あなたのコードの問題は、あなたIF(query)がそれを好きなように使う必要がある代わりにあなたが使うことIF EXISTS(query)です。あなたのコードは以下のようになります

CREATE PROCEDURE [dbo].[MyProc]         
AS
BEGIN
      DECLARE @Ret INT

      //use of IF EXISTS instead of IF
      IF EXISTS(SELECT * from Tests WHERE TestToken = @Token)
        SELECT @Ret =  0
      ELSE
        SELECT @Ret =  1

      RETURN @Ret
END

コードは次のようになります。

using (TestDBDataContext db = new TestDBDataContext())
{
    //For Stored Procedure with Return value (for Integer)
    //returns Int
    var q = db.MyProc();
    Console.WriteLine(q);               

}

これがうまくいかない場合は、他の解決策を試してください

  • 出力パラメータ
  • スカラー値関数の使用

ここで議論されているもの: LINQ to SQL: ストアド プロシージャからスカラー値を返す

于 2013-04-17T11:32:31.297 に答える