- ベストアンサー
ストアドプロシージャの戻り値が取得できない
- ストアドプロシージャ内でSelectとUpdateを行い、設定した戻り値をリターンしたいのですが。ついでにSelectとした複数行の結果の読み込みもしたいのです。
- 上記でSelectした結果をreaderA("カラム名")で読み取れているのですが、戻り値Aの値が取得できていません。ウォッチ式でcmd.Parameters("A").Valueを見るとNothingになっています。また、違うストアドでは戻り値を取得できているのでストアドに問題があるかもしれません。
- 環境はvb.net、SQLServer2005です。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>OUTPUTとreturnの区別は理解して作れているはずです。 確かに、、、 PROCEDUREを見る限り、VB側は間違いがなさそう。。。。 であれば、PROCEDUREの中の出力値を疑って見ます。 「SQL Server Management Studio」で DECLARE @Result INTEGER EXECUTE @Result = SP名 PRINT @Result とやって、@Resultの結果はどうなりますか?
その他の回答 (3)
- Hardking
- ベストアンサー率45% (73/160)
戻り値が欲しいなら、プロシジャーではなくファンクションなのでは。 CREATE PROCEDURE ↓ CREATE FUNCTION ※FUNCTIONだけに対して、遵守する義務のあるRETURNS節を特定することができます。
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
PROCEDURE「SP名」が、どのように作成しているのかわからないので何とも言えませんが、、、 [Output]と[ReturnValue]の違いのような気がします。 [仮にこういうプロシージャの時] ALTER PROCEDURE SP名 ( (スペース)@A AS INTEGER OUTPUT ) AS BEGIN (スペース)SET @A = 999; --// ← これはOUTPUT (スペース)RETURN 30; --// ← これはReturnValue END [VB側] cmd.CommandType = Data.CommandType.StoredProcedure cmd.CommandText = "SP名" cmd.Parameters.Add("@A", System.Data.SqlDbType.Int) cmd.Parameters("@A").Direction = System.Data.ParameterDirection.Output cmd.Parameters.Add("@BBBB", System.Data.SqlDbType.Int) cmd.Parameters("@BBBB").Direction = System.Data.ParameterDirection.ReturnValue readerA = cmd.ExecuteReader() MsgBox(cmd.Parameters("@A").Value) MsgBox(cmd.Parameters("@BBBB").Value) http://okwave.jp/qa/q1648176.html
補足
回答ありがとうございます。 ソースのほうをReturnValueにしているのでストアドの方もしっかりリターンしています。 OUTPUTとreturnの区別は理解して作れているはずです。 簡単に記載すると下記の感じです。 CREATE PROCEDURE SP名 AS BEGIN DECLARE @A INT SLECT文 UPDATE文 SET @A = 1 return @A try catchもしているのでなにかしらは返すはずなのです。 取得できるストアドもあるというのが。ん~・・・
- Hardking
- ベストアンサー率45% (73/160)
1.対象テーブルに該当データはあるんですか? 2.カラムAのデータ属性はInt型ですが ストアードの戻り値はInt型でしょうか?
補足
回答ありがとうございます。 >1.対象テーブルに該当データはあるんですか? データはあります。 >2.カラムAのデータ属性はInt型ですが ストアードの戻り値はInt型でしょうか? ソースの方もストアドの方もIntで宣言しています。 ↑には書いてませんが念のためCIntでキャストもしてます。
お礼
Management Studioで単体でSPを動かすと返してほしい値を返してくれるんです。。 そこが難点でした。じゃあvb側が悪いのか。調べる限りそんな感じもない。。 と悩みながらデバッグでウォッチ式見ていましたら。 cmdをcloseした箇所でnothingだったものが戻り値を表示しました。 cmdにselectした結果の情報が入っている場合はcloseしてからでないと、OUTPUTやreturn値は見れない んですかね。 解決策になっているのかわかりませんが、とりあえずOKとしときます。 ありがとうございます。