2010-12-01 15 views
1

SQLストアドプロシージャで行を挿入していて、新しい行のIDENTITY INTを返すことを望むなら、C#コードで取得します。CでSQL INSERT OUTPUT値を取得する

ALTER PROCEDURE the_proc @val_2 VARCHAR(10), @val_3 VARCHAR(10) 
AS 
BEGIN 
SET NOCOUNT ON 
INSERT INTO the_table (field_2, field_3) 
    OUTPUT INSERTED.field_1 
    VALUES (@val_2, @val_3) 
END 

C#では、私はLINQを使用していますが、OUTPUT値を取得する方法についてはあいまいです。私はそれをSQL proc宣言のOUTPUTパラメータとしてインクルードしようとしましたが、どちらも動作できませんでした。一番近いのは、IExecuteResult result ReturnValueに0(正しくない)が含まれていますが、含まれている結果ビュー(result.ReturnValue Results View)が出力値を持っているかどうかを調べるDb.designer.csコードがあります。

key = (int)(db.TheProc(val2,val3).ReturnValue); 

keyは私がINSERTからIDENTITYのINT値を望ん0として戻って来ています。

+2

プロシージャを手作業で実行して、本当にID intを返すようにしましたか? INSERTED.field_1の代わりに@@ Identityを使用する必要があります。 – StriplingWarrior

+2

@StriplingWarrior - OPの手順は正常に動作します。彼のアプローチは、挿入トリガがテーブルに追加された場合に正しく動作するので、 '@@ identity 'を選択するとより頑強です。 –

+0

@ StriplingWarrior - 私が言及したように、VSデバッガの結果を調べるとき、IDENTITY INTはそこにありますが(ReturnValueにはありません)。それで何とか返されます。私が求めているのは、その値を取得するためのC#/ Linqイディオムです。ありがとう。 –

答えて

1
OUTPUT INSERTED.* 

は基本的にあり選択と同じこと。したがって、これは出力パラメータとして表示されるのではなく、むしろ結果セットとして返されます。

ところで、ReturnValueは実際にはあなたがこの場合に見ているゼロであるべきです。

結果セットを取得できるように、linq文を変更する必要があります。

+0

さて、あなたは私のために働かせましたが、あなたは正しい道を私に与えました。私はこれを受け入れるが、コードで回答を追加する。 –

1

(SQL Serverを仮定して)の代わりにこれを試してみてください:

ALTER PROCEDURE the_proc 
@val_2 VARCHAR(10), 
@val_3 VARCHAR(10), 
@newKey int OUTPUT 
AS 
BEGIN 
    SET NOCOUNT ON 
    INSERT INTO the_table (field_2, field_3) VALUES (@val_2, @val_3) 
    SET @newKey = SCOPE_IDENTITY() 
END 

あなたはこれを行うことができDBML SQLにあなたのLINQのおthe_procストアドプロシージャを定義したら:

 int? newKey = null; 
     dataContext.the_proc("val1", "val2", ref newKey); 
     // newKey.Value now contains your new IDENTITY value 
+0

hmmm ...もし私がしなければならないのは、私はここで困惑しているのは、私はOUTPUT INSERTED値を得る方法を知らないということです。それはどこかで** IS **です。私は 'result.ReturnValue Results View'を検査してVSデバッガでそれを見ることができると言っていました。 –

+0

VSに表示されているReturnValueが常に0の値を持っていれば、あなたが望むものではない可能性が非常に高いです。ストアドプロシージャには、成功または失敗を示すint ReturnValue出力があります。このポストの下を見てください:http://www.cleardata.biz/articles/storedproc.aspx – Tahbaza

1

Chris Livelyは正しい方向に私を振って、C#Linqコードを再検討しています。以下はField_1を結果から引き出します。たぶんそれは普通のイディオムではなく、そこに行くのは変な方法なので、誰かがもっと正しいものを提案している場合は、コメントや回答を追加してください。

var o = from res in db.MyProc(Val1, Val2) 
      select res.Field_1; 
int key = o.ToArray()[0]; 

ありがとうございました。

+1

これはうれしいです。私はLinqにはそれほど良くはありません。もしそうでなければ、私はそれを追加しました。それにかかわらず、これは正しい方法です。 – NotMe

関連する問題