• ベストアンサー

VBでストアドの戻りパラメータを受け取る方法

VB6.0からADOを利用してSQLServerのストアドプロシージャを呼出し、戻りパラメータを受け取る方法がありましたら教えてください。よろしくお願いします! CREATE PROC TEST ( I_VAL AS INT, O_VAL AS INT OUTPUT ) ~省略~

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

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

#2のxcrOSgS2wYさんが飛ばしているリンク先の、.NETサンプルを書いた者です。 .NETからVB6へのコンバートをやってみました。 (いつもと逆方向への変換なので、違和感がありました^^;;;) ストアドは、参考URLのまま利用しています。 Option Explicit Sub Main()   Const DEF_ストアド名 As String = "ストアド"      Dim l_adoCnn  As ADODB.Connection   Dim l_adoCmd  As ADODB.Command   Dim l_adoRec  As ADODB.Recordset      Set l_adoCnn = New ADODB.Connection   Set l_adoCmd = New ADODB.Command      'コネクション設定   l_adoCnn.CursorLocation = adUseClient  '← これ重要、結構忘れられる。   l_adoCnn.Open "Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=master;uid=sa;pwd=sa"      With l_adoCmd     'コネクションをコマンドに設定     Set .ActiveConnection = l_adoCnn     'コマンド種別 = ストアド     .CommandType = adCmdStoredProc     'ストアド名を指定     .CommandText = DEF_ストアド名     'パラメータ追加:戻り値     .Parameters.Append パラメータ作成(l_adoCmd, "@戻り値", adInteger, 4, adParamReturnValue)     'パラメータ追加:引数(I/I/O/IO)     .Parameters.Append パラメータ作成(l_adoCmd, "@パラム1_VAR_I", adVarChar, 12, adParamInput, "abcde")     .Parameters.Append パラメータ作成(l_adoCmd, "@パラム2_INT_I", adInteger, 4, adParamInput, 2)     .Parameters.Append パラメータ作成(l_adoCmd, "@パラム3_VAR_O", adVarChar, 26, adParamOutput)     .Parameters.Append パラメータ作成(l_adoCmd, "@パラム4_INT_IO", adInteger, 4, adParamInputOutput, 3)   End With   'ストアド実行   Set l_adoRec = l_adoCmd.Execute      '実行結果を出力   Dim i As Integer   Dim l_str結果 As String      With l_adoCmd     For i = 0 To .Parameters.Count - 1       l_str結果 = l_str結果 & i & vbTab & .Parameters(i).Name & vbTab & .Parameters(i).Value & vbCrLf     Next   End With   Call MsgBox(l_str結果, vbInformation, "結果出力") End Sub 'パラメータ作成関数 Private Function パラメータ作成( _          ByRef p_adoコマンド As ADODB.Command _         , ByVal p_strパラメータ名 As String _         , ByVal p_dtpDBタイプ As ADODB.DataTypeEnum _         , ByVal p_intサイズ As Integer _         , ByVal p_pdrパラメータ種別 As ADODB.ParameterDirectionEnum _         , Optional ByVal p_obj初期値 _     ) As ADODB.Parameter        Dim l_adoPrm  As ADODB.Parameter   Set l_adoPrm = p_adoコマンド.CreateParameter(p_strパラメータ名, p_dtpDBタイプ, p_pdrパラメータ種別, p_intサイズ)   l_adoPrm.Value = IIf(IsMissing(p_obj初期値), vbNull, p_obj初期値)      Set パラメータ作成 = l_adoPrm End Function

mocomoco_0001
質問者

お礼

ばっちり出来ました! ありがとうございました!

その他の回答 (2)

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.2

コンピューター [技術者向け] > プログラミング > Visual Basic No.1648176 質問:SQL ServerのストアドでOUTPUTパラメータを2つ http://oshiete1.goo.ne.jp/kotaeru.php3?q=1648176 に、VB.NETでADO.NETを使ってストアドのOUTPUTパラメータを受け取る例があります。 おそらくADO.NETでできることは、面倒さえいとわなければADOでもできるかと思います。

mocomoco_0001
質問者

お礼

ご回答ありがとうございました!

  • malf
  • ベストアンサー率21% (6/28)
回答No.1

昔の話ですが、SQLserverへODBCでコネクションを張ってMS-ACCESSからDB操作したことがあります。そのときは不可能でした。 ODBCはSQLserverからのリターンコードを受け取ることが出来ない仕様だったと記憶しています。今回のお話ではADO経由ということなので推測の域を出ませんが、ADOもOLEコントロールの一部なのでODBC経由のOLEコントロールなのかなと考えます。となると冒頭同様、「リターンは受け取れない仕様」ではないでしょうか。自信ありません。いい加減でごめんなさい。

mocomoco_0001
質問者

お礼

アドバイスありがとうございます。 出来ないだろうという情報でもありがたいです。 でないとずっと調べつづけそうなので、、、 別の仕様も視野に入れてみます。

関連するQ&A

  • ストアドプロシージャを実行時のパラメータについて

    はじめましてkou2000と申します。SQLServer2000でストアドプロシージャを作成していますがうまくいきません。 下記のようなことが実際にできるかご教授ください。 CREATE PROCEDURE TEST_PROCEDURE @SYUBETU nvarchar AS SELECT AAAAAAA INTO ##TMP FROM TEST WHERE BBBB IN (@SYUBETU) GO 上記のようなストアドプロシージャを作成しプログラムから実行する際に @SYUBETU = "'1','2','3','4','5'" のような可変の文字列を設定しストアドプロシージャを実行できますでしょうか? よろしくお願いします。

  • SQL ServerのストアドでOUTPUTパラメータを2つ

    VB.NETとSQL Serverでストアドプロシージャーを使用しています。 OUTPUTパラメータを2つ使用したいのですが、VB.NET側での受け取り方法がよくわかりません。 ご存知の方がいらっしゃいましたら、よろしくお願いします。

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

    MySQL5.6のストアドプロシージャが返すSELECT結果のフェッチ方法について教えてください。 delimiter $ create procedure sample_proc() begin select * from TEST_TBL; end$ の様なストアドプロシージャがあり、これを他のストアドプロシージャから呼び出して、 ループしながらフェッチしたいのですが、どうすればよいでしょうか。

  • ストアドから得られるレコードセットを、別のストアドで利用したい

    現在、実行するとあるレコードセット(1行1列のみ)を返すストアドプロシージャProc_Aがありますが、このプロシージャを実行して得られる結果を、 別のプロシージャProc_Bで、以下のような形で使用したいと考えています。 ただし、Case文内部でのストアドの実行や、変数へのストアドの実行結果の代入を試しましたが、どちらもうまくいっていません。 なにか、よい解決策があれば、教えていただければ、と思います。 パターンA) Case内部で直接実行 select case Table_A.param_1 when 0 then Exec Proc_A '***','**' else '' end パターンB)いったんパラメータとして取得 declare @values as char(10) execute sp_executesql N'@values = Proc_A ''***'',''**''', N'@values char(10) OUTPUT', @values OUTPUT

  • SQLServerのストアドで戻り値取得したい。

    こんにちわ。 いまSQLServer2005でストアドを作成しています。 あるテーブルをSELECTして,あるカラムと件数の両方を出力パラメータに取得したいのですが, 件数は取得できるのですが,カラムが取得できません。 ちなみに下記のようなコードになります。 create procedure funLoginCheck (@UserID char(5), @PassWord varchar(10), @RowCount int output, @DeptID char(2) output) as select * from MST_Employee where EmployeeID = @UserID And PassWord = @PassWord; set @deptid = deptid」 deptidを出力パラメータに渡す方法がわかりません。 初歩的なことかもしれませんが, 教えてください。よろしくお願いします。

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

    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 どなたか原因のわかる方がいれば、宜しくお願いします。

  • PerlからOracleのストアドを呼びたいのですが、パラメータに配列は使えますか?

    Perl(5.005_03) からOracle(8i)のストアドを呼びたいのですが、パラメータに配列は使えますか? 使えるのなら、以下のようなストアドをPerl側から呼ぶには、どうすればよいでしょうか? ---------------------------------------------------------------------- /* 配列型 */ CREATE OR REPLACE PACKAGE text_util IS   TYPE vc_arr IS TABLE OF VARCHAR2(10)   INDEX BY BINARY_INTEGER; END; / /* 呼びたいストアド */ CREATE OR REPLACE PROCEDURE TEST_PROC ( v_DATA in text_util.vc_arr, i_IDX in INTEGER ) IS END; / ---------------------------------------------------------------------- よろしくお願いします。 【環境】sun4-solaris, apache

  • ストアドプロシージャでのパラメータのデータ型の質問

    いつもお世話になっております。たびたびの質問で恐縮です。 ストアドプロシージャでのパラメータのデータ型が設定できず困っております。たとえば次はパラメータの文字を表示させるものです。 CREATE OR REPLACE PROCEDURE test(p VARCHAR2(10)) IS t VARCHAR2(10); BEGIN t:=p; DBMS_OUTPUT.PUT_LINE(t); END; / コンパイルエラーになるので、パラメータのデータ型を、VARCHAR2のように(10)を取るとうまくいきます。しかし、変数定義の「t VARCHAR2(10)」の(10)を取ると文字列の制約制限からはずれるとのエラーになります。 VARCHAR2というのは、PL/SQLの変数あるいはパラメータではどのように記述すればよろしいのでしょうか。 基本的なことを理解しておらず、申し訳ありません。 どうか、よろしくお願いいたします。

  • ADO接続によるストアド

    あまりDB接続などに詳しくないので、 うまく説明できないと思いますがご了承下さい。 環境は Win2000+VB6+SQLSERVER2000+ADO2.5 やりたいことは、 SQLSERVERに設定してあるストアドがあります。 そのストアドをVB上から呼び出し結果を得たいわけです。 ストアドは、1つのパラメータを与えることで、 そのパラメータの最大値を取得してきます。 そして、データベース内では最大値が+1されているというものです。 現在 Dim adoCon As ADODB.Connection Dim adoCmn As ADODB.Command Dim adoRs As ADODB.Recordset ''DBに接続 Call DB接続関数(adoCon) Set adoCmn = New ADODB.Command Set adoRs = New ADODB.Recordset adoCmn.ActiveConnection = adoCon adoCmn.CommandText = "EXEC ストアド名 'パラメータ'" adoRs.Open adoCmn という状態で、ストアド自体は動作することができました。 しかし、最大値を取得することができません。 adoRsにはきちんとレコードセットが返ってきてない感じです。 どうすれば、最大値を取得できるでしょうか?

  • VBでストアドプロシージャ一覧が見たい

    よろしくお願いします。 sqlserver2000をつかってます。 ストアドプロシージャの一覧をプログラム(VB・アクセス、エクセルVBA) で参照したいと思います。 イメージとしては、「information_schema.columns」のストアド版があればよいと思ったのですが、見つけられませんでした。 良い方法をご存知の方お知らせ願います。

専門家に質問してみよう