2016-05-01 11 views
1

ストアドプロシージャから最後に挿入されたIDを取得しようとしていますが、できません。ストアドプロシージャから最後に挿入された行を返すことはできません

私がしたいのはSCOPE_IDENTITY()です。

私のストアドプロシージャは、次のようになります。

CREATE PROCEDURE [dbo].[sp_InsertProduct] 
    @ProductName varchar(30), 
    @ProductPrice decimal , 
    @ProductQuantity int, 
    @id int output 
AS 
BEGIN 
    INSERT INTO Product (ProductName, ProductPrice, ProductQuantity) 
    VALUES (@ProductName, @ProductPrice, @ProductQuantity) 

    SET @id = SCOPE_IDENTITY() 
    RETURN @id 
END 

、ここでは、私のC#のコード

var ProductParameters = new[] { 
    new SqlParameter("@ProductName", Product.ProductName), 
    new SqlParameter ("@ProductPrice", Product.ProductPrice), 
    new SqlParameter ("@ProductQuantity", Product.ProductQuantity) 
}; 

var y = db.Database.ExecuteSqlCommand("EXEC sp_InsertProduct @ProductName, @ProductPrice, @ProductQuantity", ProductParameters); 
+0

@idは、OUTPUTパラメータであってはなりません。単純に値を返します。私は、SQLコマンドの呼び出しがエラーをスローすると思われる:そのような "何がうまくいかない"結果に注意を払う。 – user2864740

+1

サイドノート:ストアドプロシージャのプレフィックス 'sp_'を使用しないでください**。マイクロソフトは、[*ストアドプロシージャの名前付け*を参照してください](http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx)、およびあなたはいつか名前衝突のリスクを将来実行します。 [ストアドプロシージャのパフォーマンスにも悪い](http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix)単に 'sp_'を避け、他の何かを接頭辞として使うのが最善です。 –

答えて

1

SP:

var returnValue = new SqlParameter("@ReturnValue", SqlDbType.Int) 
    { 
     Direction = ParameterDirection.Output 
    }; 

var ProductParameters = new[]{ 
    new SqlParameter("@ProductName",Product.ProductName), 
    new SqlParameter ("@ProductPrice",Product.ProductPrice), 
    new SqlParameter ("@ProductQuantity",Product.ProductQuantity), 
    returnValue 
}; 

db.Database.ExecuteSqlCommand("EXEC @ReturnValue = sp_InsertProduct @ProductName,@ProductPrice,@ProductQuantity", ProductParameters); 

var scopeIdentity = (int)returnValue.Value; 
+0

、それは働いている!ありがとう:)、神はあなたを祝福 – Lucy

1

であるあなたは本当に@id変数は必要ありません。

CREATE PROCEDURE [dbo].[sp_InsertProduct] 
    @ProductName varchar(30), 
    @ProductPrice decimal , 
    @ProductQuantity int 
AS 
BEGIN 
    INSERT INTO Product (ProductName,ProductPrice,ProductQuantity) VALUES (@ProductName,@ProductPrice,@ProductQuantity)   
    RETURN SCOPE_IDENTITY() 
END 

そして、あなたのC#コードからの戻り値と出力パラメータを持っている:あなたはちょうどあなたのストアドプロシージャ(入力パラメータを持ってする必要はありません)から値を返すことができ

CREATE PROCEDURE [dbo].[sp_InsertProduct] 


    @ProductName varchar(30), 
    @ProductPrice decimal , 
    @ProductQuantity int, 

AS 

BEGIN 


INSERT INTO Product (ProductName,ProductPrice,ProductQuantity) VALUES (@ProductName,@ProductPrice,@ProductQuantity) 



RETURN SCOPE_IDENTITY(); 

END 
+0

ご協力ありがとうございますが、C#コードでSCOPE_IDENTITY()を取得するにはどうすればよいですか? – Lucy

+0

あなたが既にやっているようなストアドプロシージャを(SQLクエリによって)EXECするかどうか分かりません。いずれにせよ、以下の答えも同様に働くであろう。しかし、ちょうどあなたの質問に答えるために、私は何かをする:https://msdn.microsoft.com/en-us/library/37hwc7kt(v=vs.100).aspx ... cmdオブジェクトを作成し、パラメータを分離するそうです:https://msdn.microsoft.com/en-us/library/80x06z3b(v=vs.100).aspx –

関連する問題