ストアドプロシージャの戻り値が取得できない

このQ&Aのポイント
  • ストアドプロシージャ内でSelectとUpdateを行い、設定した戻り値をリターンしたいのですが。ついでにSelectとした複数行の結果の読み込みもしたいのです。
  • 上記でSelectした結果をreaderA("カラム名")で読み取れているのですが、戻り値Aの値が取得できていません。ウォッチ式でcmd.Parameters("A").Valueを見るとNothingになっています。また、違うストアドでは戻り値を取得できているのでストアドに問題があるかもしれません。
  • 環境はvb.net、SQLServer2005です。
回答を見る
  • ベストアンサー

ストアドプロシージャの戻り値が取得できない

ストアドプロシージャの戻り値が取得できない ストアドプロシージャ内でSelectとUpdateを行い、設定した戻り値をリターンしたいのです。 ついでにSelectとした複数行の結果の読み込みもしたいのですが。 Dim cmd As New System.Data.SqlClient.SqlCommand Dim i As Integer Dim readerA As System.Data.SqlClient.SqlDataReader cmd.CommandType = Data.CommandType.StoredProcedure cmd.CommandText = "SP名" cmd.Parameters.Add("A", System.Data.SqlDbType.Int) cmd.Parameters("A").Direction = System.Data.ParameterDirection.ReturnValue readerA = cmd.ExecuteReader() i = cmd.Parameters("A").Value if (i = 0) Then 処理 End If While readerA.Read() 処理 End While 上記でSelectした結果をreaderA("カラム名") で読みこめているのですが、戻り値Aの値が取得できていません。 ウォッチ式でcmd.Parameters("A").Valueを見るとNothingになっています。 ちなみに、違うストアドを実行しているところでは戻り値は取得できています。。。 ストアドがおかしいんでしょうか。Selectの取得結果も見ようとしているのがまずいのでしょうか。 環境はvb.net、SQLServer2005です。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

>OUTPUTとreturnの区別は理解して作れているはずです。 確かに、、、 PROCEDUREを見る限り、VB側は間違いがなさそう。。。。 であれば、PROCEDUREの中の出力値を疑って見ます。 「SQL Server Management Studio」で DECLARE @Result INTEGER EXECUTE @Result = SP名 PRINT @Result とやって、@Resultの結果はどうなりますか?

jam-best
質問者

お礼

Management Studioで単体でSPを動かすと返してほしい値を返してくれるんです。。 そこが難点でした。じゃあvb側が悪いのか。調べる限りそんな感じもない。。 と悩みながらデバッグでウォッチ式見ていましたら。 cmdをcloseした箇所でnothingだったものが戻り値を表示しました。 cmdにselectした結果の情報が入っている場合はcloseしてからでないと、OUTPUTやreturn値は見れない んですかね。 解決策になっているのかわかりませんが、とりあえずOKとしときます。 ありがとうございます。

その他の回答 (3)

  • Hardking
  • ベストアンサー率45% (73/160)
回答No.4

戻り値が欲しいなら、プロシジャーではなくファンクションなのでは。 CREATE PROCEDURE ↓ CREATE FUNCTION ※FUNCTIONだけに対して、遵守する義務のあるRETURNS節を特定することができます。

回答No.2

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

jam-best
質問者

補足

回答ありがとうございます。 ソースのほうをReturnValueにしているのでストアドの方もしっかりリターンしています。 OUTPUTとreturnの区別は理解して作れているはずです。 簡単に記載すると下記の感じです。 CREATE PROCEDURE SP名 AS BEGIN DECLARE @A INT SLECT文 UPDATE文 SET @A = 1 return @A try catchもしているのでなにかしらは返すはずなのです。 取得できるストアドもあるというのが。ん~・・・

  • Hardking
  • ベストアンサー率45% (73/160)
回答No.1

1.対象テーブルに該当データはあるんですか? 2.カラムAのデータ属性はInt型ですが ストアードの戻り値はInt型でしょうか?

jam-best
質問者

補足

回答ありがとうございます。 >1.対象テーブルに該当データはあるんですか? データはあります。 >2.カラムAのデータ属性はInt型ですが ストアードの戻り値はInt型でしょうか? ソースの方もストアドの方もIntで宣言しています。 ↑には書いてませんが念のためCIntでキャストもしてます。

関連するQ&A

  • ストアドプロシージャの実行について

    asp.net から sqlserver のストアドプロシージャを実行させる勉強をしています。 作成されているはずのストアドプロシージャを実行できずに困っています。 webformにテキストボックス、ボタン、データグリッドを貼り付け、ストアドプロシージャを作成し下記のプログラムを実行させるのですが上手くいきません。 (テキストボックスに任意で入力された数値のデータをボタンを押すと表示するものです) <エラー内容>→ ストアド プロシージャ 'proc1' が見つかりませんでした Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim cn As New SqlConnection Dim cmd As New SqlCommand cn.ConnectionString = "接続文字列" cmd.Connection = cn cmd.CommandText = "proc1" cmd.CommandType = System.Data.CommandType.StoredProcedure Dim p1 As SqlParameter = cmd.Parameters.Add("@param1", System.Data.SqlDbType.Int) p1.Value = TextBox1.Text cn.Open() Dim dr As SqlDataReader = cmd.ExecuteReader DataGrid2.DataSource = dr DataGrid2.DataBind() dr.Close() cn.Close() end sub ストアドproc1(場所:Northwind)の内容↓ CREATE procedure proc1 @param1 int as select * from products where categoryID=@param1 どなたか原因のわかる方がいれば、宜しくお願いします。

  • ストアドプロシージャについて

    Access2003とSQL Server2005Expressです。 初歩的な質問で恐縮です。 以下のストアドプロシージャのデータ取得先を、テーブルではなく 別のストアドプロシージャにしたいのですが、 その方法がわかりません。 CREATE PROCEDURE テスト AS SELECT コード, 社名, 住所, 電話 FROM 名簿     ↑     これをテーブルではなく、別のストアドプロシージャを     指定したのですが・・・。     ここをストアドプロシージャ名にするとエラーになります。     どうすればよろしいでしょうか?

  • ストアドプロシージャの実行で...

    Test_Pro、というストアドプロシージャを実行させたいんですが、 Microsoft OLE DB Provider for SQL Server エラー '80040e14' ストアド プロシージャ 'Test_Pro' が見つかりませんでした。 というエラーが出てしまいます。どうして??? 実行させる為に書いたソースは、 set cmd = Server.CreateObject("ADODB.command") Set cmd.ActiveConnection = conn cmd.CommandText = "Test_Pro" cmd.CommandType = 4 Set rs = cmd.Execute("@a", a) です。

  • プロシージャまたは関数の引数が多すぎますのエラー

    お世話になります。 下記のコードを実行すると プロシージャまたは関数 spTest の引数が多すぎます どこが悪いのかご教示お願いいたします。 Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim i As Integer Dim conn As New SqlConnection(connstr) Dim cmd As New SqlCommand conn.Open() cmd.Connection = conn cmd.CommandText = "Delete Table2" cmd.CommandType = CommandType.Text Debug.WriteLine(cmd.ExecuteNonQuery()) For i = 1 To 100 spTest(cmd, i) Next conn.Close() End Sub sub spTest(ByRef cmd As SqlCommand, ByVal intID As Integer) Dim param As SqlParameter With cmd .CommandType = CommandType.StoredProcedure .CommandText = "spTest" param = .Parameters.Add(New _ SqlParameter("@ID", SqlDbType.Int)) param.Value = intID .ExecuteNonQuery()    ''''' ここで2回目からエラーが発生します End With End sub

  • ストアドプロシージャについて

    教えてください。 NT4.0上でAccess2000+MSDEで使用しているのです。 ストアドプロシージャでUPDATE文のあとにSELECT文を使い更新したデータを受け取ろうとしているのですが、実行すると「ストアドプロシージャは実行されましたがレコードは返されませんでした。」とメッセージが表示されるだけなのです。UPDATE文を注釈にするとレコードは返されるのでデータはあるのだと思います。 宜しくお願いします。

  • VBScriptからストアドプロシージャのOUT変数の取得について

    SQLServer2000上でOUT変数によって戻り値を呼び出し元に返すストアドプロシージャを作成し、VBScriptから実行したいと思っていますが、OUT変数上の戻り値を取得する方法がわかりません。 ADO経由でselect文の結果をrecordsetとして取得するメソッドは用意されているようなのですが、OUT変数として取得する適当なメソッドがVBScriptには見つかりませんでした。 同じようなことを行ったことのある方がいらっしゃいましたらやり方を教えて頂けますでしょうか。

  • ユーザーが定義したストアドプロシージャ一覧の取得

    SQL Server 2005で、 db内のストアドプロシージャ一覧を取得したいと思っています。 select o.* from syscomments c , sysobjects o where c.id = o.id and o.type='P' order by o.name といったように記述すれば一覧は取得できるようですが、 これだとシステムストアドプロシージャも表示されてしまいます。 ユーザーで定義したストアドプロシージャのみ取得したいのですが、可能でしょうか? 何か良い手段をご存じの方がいらっしゃいましたらアドバイス頂けますと嬉しいです。 どうぞよろしくお願いいたします。

  • ストアドプロシージャの処理終了を判定

    OS:windowsXP Pro Access Version:ACCESS2000 AccessVBAでストアドプロシージャを呼び出し処理をしていますが、ストアドプロシージャでの処理終了を判定して、次のステップに移るような処理を考えています。 SQLServerには、ODBC経由で接続しています。 ストアドプロシージャの呼び出しは巧く行くのですが、処理終了が判定できません。 具体的にはどうすればストアドプロシージャの処理の終了を判定することができるのでしょうか?      Dim adoCN As ADODB.Connection Dim str_adoCN As String Dim strCommand As ADODB.Command Dim RS As New ADODB.Recordset str_adoCN = "Data Source='SQL_XXXX'; User ID='XX';Password='XXXXXXXX';" Set adoCN = New ADODB.Connection adoCN.Open str_adoCN Set strCommand = New ADODB.Command Set strCommand.ActiveConnection = adoCN strCommand.CommandText = "Procedure_XXXX" strCommand.CommandType = adCmdStoredProc Set RS = strCommand.Execute() 次の処理....

  • プロシージャの戻り値を取得する方法

    perlからSQLPLUS->プロシージャを実行してその戻り値を取得。 戻り値が0なら次の処理へ、0以外ならエラー処理へというようなことをやりたいと思っています。 perlの実行コマンドは以下。 $sqlcmd = "sqlplus$DBUSER$PASS\@DB_ALIAS\@$SQLFILE $OUTFILE"; $sql_ret = system("$sqlcmd") >>8; この$sql_retにプロシージャの戻り値が入るようにしたいのです。 プロシージャを実行する$SQLFILEは以下のようなSQLです。 --------------------------------------------------- set serveroutput on WHENEVER SQLERROR EXIT 1 spool &1; DECLARE RetVal NUMBER; BEGIN RetVal := 実行ストアドファンクション; END; / spool off; EXIT SQL.SQLCODE; ---------------------------------------------- エラーが起きたときにファンクションは1を返すようにしているのですが、 それがSQLPLUSの実行結果の戻り値に反映されません。 どうしたらいいのでしょうか? よろしくお願いします。

  • ストアドプロシージャの実行

    こんばんは。 C#のアプリケーションからストアドプロシージャの実行を検討 しています。ストアドプロシージャでは複数テーブルを更新する バッチシステムです。 このケースでは、C#側ではエラーをどこまでハンドリングするのが 良いでしょうか?。 「成功と失敗の戻り値だけ」か、それとも「ORA-」のようなエラーまで全てハンドリングすべきか迷っていまして・・。 ご意見お願いします。

専門家に質問してみよう