C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: VBSでストアドの戻り値


(過去ログ 19 を表示中)

[トピック内 13 記事 (1 - 13 表示)]  << 0 >>

■7497 / inTopicNo.1)  VBSでストアドの戻り値
  
□投稿者/ 酒井 (1回)-(2007/09/07(Fri) 09:14:31)

分類:[VBScript] 

読んでいただきありがとうございます。
現在、VBSからSQLServer2000上のプロシージャを呼び出そうとしていますが、
上手くいかないようです。
DAICHOU_EXPORTのパラメータはinが2つ、outが1つです。
sqlserver2000のクエリアナライザから実行した場合は問題なく値の取得ができます。
VBS側の記述に問題があると思うのですが、特に実行エラーになるわけではなく
一番下に記述してある"ここまで3"というメッセージが表示されます。
どなたか知識のある方、ご教授下さい。

Sql = "DAICHOU_EXPORT"
Set Cmd = CreateObject("ADODB.Command")
Cmd.ActiveConnection = objConn
Cmd.CommandType = adCmdStoredProc
Cmd.CommandText = Sql


Set param = cmd.CreateParameter("@DATE_S", adVarChar, adParamInput, 20)
cmd.Parameters.Append param
cmd.Parameters("@DATE_S") =DATE_S

MsgBox cmd.Parameters("@DATE_S").VALUE

Set param = cmd.CreateParameter("@DATE_E", adVarChar, adParamInput, 20)
cmd.Parameters.Append param
cmd.Parameters("@DATE_E") =DATE_E

Set param = cmd.CreateParameter("@ret", adInteger, adParamOutput)
cmd.Parameters.Append param


'//ストアドプロシージャ実行
Cmd.Execute

'// 取得結果を表示
MsgBox cmd.Parameters("@ret").Value
MsgBox "ここまで3"
引用返信 編集キー/
■7499 / inTopicNo.2)  Re[1]: VBSでストアドの戻り値
□投稿者/ 魔界の仮面弁士 (413回)-(2007/09/07(Fri) 10:44:44)
No7497 (酒井 さん) に返信
> 上手くいかないようです。
具体的にはどうなってしまうのでしょう?

> DAICHOU_EXPORTのパラメータはinが2つ、outが1つです。
そのプロシージャの、具体的な定義を提示してください。

> タイトル: VBSでストアドの戻り値
受け取りたい値は out パラメータなのでしょうか。それとも戻り値なのでしょうか。

> Set param = cmd.CreateParameter("@DATE_S", adVarChar, adParamInput, 20)
> Set param = cmd.CreateParameter("@DATE_E", adVarChar, adParamInput, 20)
> Set param = cmd.CreateParameter("@ret", adInteger, adParamOutput)
in/out 引数の指定はあるようですが、戻り値(adParamReturnValue) の指定が抜けているようです。

もし、パラメータ定義に不安があるのなら、cmd.Parameters.Append で定義するのではなく、
cmd.Parameters.Refresh を使って、サーバ側にパラメータ定義を問い合わせるのも手です。
(ただし Refresh すると、Append で自己管理するよりも実行コスト面で若干不利になります)


それと一応念のため、out パラメータにも任意の初期値を入れておいた方が良いかも。
引用返信 編集キー/
■7500 / inTopicNo.3)  Re[2]: VBSでストアドの戻り値
□投稿者/ 酒井 (3回)-(2007/09/07(Fri) 11:11:32)
2007/09/07(Fri) 11:17:01 編集(投稿者)

No7499 (魔界の仮面弁士 さん) に返信
> ■No7497 (酒井 さん) に返信

早速の返信ありがとうございます。

>>上手くいかないようです。
> 具体的にはどうなってしまうのでしょう?
⇒ストアドプロシージャ自体が実行されず、データが作成されません。クエリアナライザから単発でストアドを流す限りはデータが作成されます。

また、最後に以下の記述を追記しましたが、メッセージボックスが表示されません。
このことから、パラメータの引渡しが上手くいっていないのではないかと思っています。

'// 取得結果を表示
MsgBox cmd.Parameters("@DATE_S").Value
MsgBox cmd.Parameters("@ret").Value



>>DAICHOU_EXPORTのパラメータはinが2つ、outが1つです。
> そのプロシージャの、具体的な定義を提示してください。
create procedure DAICHOU_EXPORT
@v_staDate varchar(20), --開始日付
@v_endDate varchar(20), --終了日付
@iReturn int output
AS
                      ・
                      ・
                      ・
return @iReturn


>>タイトル: VBSでストアドの戻り値
> 受け取りたい値は out パラメータなのでしょうか。それとも戻り値なのでしょうか。
⇒上記のように戻り値にもoutパラメータにも同じ値をセットしているので、どちらか取得できる方で構いません。


>>Set param = cmd.CreateParameter("@DATE_S", adVarChar, adParamInput, 20)
>>Set param = cmd.CreateParameter("@DATE_E", adVarChar, adParamInput, 20)
>>Set param = cmd.CreateParameter("@ret", adInteger, adParamOutput)
> in/out 引数の指定はあるようですが、戻り値(adParamReturnValue) の指定が抜けているようです。
⇒追加してみましたが、状況は変わらずです。


> もし、パラメータ定義に不安があるのなら、cmd.Parameters.Append で定義するのではなく、
> cmd.Parameters.Refresh を使って、サーバ側にパラメータ定義を問い合わせるのも手です。
> (ただし Refresh すると、Append で自己管理するよりも実行コスト面で若干不利になります)
>
>
> それと一応念のため、out パラメータにも任意の初期値を入れておいた方が良いかも。
⇒cmd.Parameters.Refreshについて、ちょっと調べてみます。
引用返信 編集キー/
■7504 / inTopicNo.4)  Re[3]: VBSでストアドの戻り値
□投稿者/ 酒井 (4回)-(2007/09/07(Fri) 11:46:47)
2007/09/07(Fri) 11:47:11 編集(投稿者)

とりあえず、

If (Err.Number <> 0) Then
MsgBox Err.Number
End If

上記のロジックをいろんな場所に配置した結果、

Cmd.CommandType = adCmdStoredProcの部分でエラーコード500が出ていることがわかりました。
現在、これが何ものかを調査中です。

引用返信 編集キー/
■7506 / inTopicNo.5)  Re[3]: VBSでストアドの戻り値
□投稿者/ 魔界の仮面弁士 (414回)-(2007/09/07(Fri) 11:48:52)
No7500 (酒井 さん) に返信
> ⇒ストアドプロシージャ自体が実行されず、データが作成されません。
実行した時に、どのようなデータが渡されてきたか、ストアド側で追跡してみましたか?


> また、最後に以下の記述を追記しましたが、メッセージボックスが表示されません。
> MsgBox cmd.Parameters("@DATE_S").Value
On Error Reume Next を書いていた、というオチは無いでしょうか?
たとえばそれだと、Null 値が返された場合に、エラー94 が発生しますよね。

それから、adParamInput 等の定数定義は、ただしく行われていますか?


>> そのプロシージャの、具体的な定義を提示してください。
> create procedure DAICHOU_EXPORT
中身を単純化して
BEGIN
SET @iReturn = 123
return @iReturn
END
とし、最初に提示されたコードを、VBScript で実行してみたところ、
問題なく 123 と表示されましたけれども……。

接続先を間違えている、という事はありませんよね?


なお、3つの Parameter 定義の前に、adParamReturnValue のParameter を
Append してから試してもみましたが、こちらも問題なく取得されました。
引用返信 編集キー/
■7515 / inTopicNo.6)  Re[4]: VBSでストアドの戻り値
□投稿者/ 酒井 (5回)-(2007/09/07(Fri) 13:26:09)
2007/09/07(Fri) 13:27:12 編集(投稿者)
No7504 (酒井 さん) に返信
> 2007/09/07(Fri) 11:47:11 編集(投稿者)
>
> とりあえず、
>
> If (Err.Number <> 0) Then
> MsgBox Err.Number
> End If
>
> 上記のロジックをいろんな場所に配置した結果、
>
> Cmd.CommandType = adCmdStoredProcの部分でエラーコード500が出ていることがわかりました。
> 現在、これが何ものかを調査中です。
⇒エラーコード500の内容は"この変数は宣言されていません"の内容のエラーでした。
Cmd.ActiveConnection = objConn、Cmd.CommandText = Sqlではこのエラーはでていないようなのですが、Cmd.CommandType = adCmdStoredProcの部分のみ、このエラーがでてしまいます。
DIM Cmd、Set Cmd = CreateObject("ADODB.Command")は書いてありますが、他に何か記述がいるのでしょうか?


引数を必要としない違うストアドであれば実行できているので、接続先が間違っているということは無いと思うのですが・・・。

ちなみにOn Error Reume Next は記述していません。
引用返信 編集キー/
■7518 / inTopicNo.7)  Re[5]: VBSでストアドの戻り値
□投稿者/ Mr.T (89回)-(2007/09/07(Fri) 13:53:06)
2007/09/07(Fri) 13:53:37 編集(投稿者)

Mr.Tです、こんにちは。

>>Cmd.CommandType = adCmdStoredProcの部分でエラーコード500が出ていることがわかりました。
>>現在、これが何ものかを調査中です。
> ⇒エラーコード500の内容は"この変数は宣言されていません"の内容のエラーでした。
> Cmd.ActiveConnection = objConn、Cmd.CommandText = Sqlではこのエラーはでていないようなのですが、Cmd.CommandType = adCmdStoredProcの部分のみ、このエラーがでてしまいます。

おや、
「adCmdStoredProc」
ここではないですか?

CommandTypeの値は、CommandTypeEnumなので、その実体は数値です。
VBなんかだと参照設定しているのでそのまま使えるのですが、VBSでは参照設定できないので、自前で設定する必要があります。

Const adCmdStoredProc = 4


引用返信 編集キー/
■7524 / inTopicNo.8)  Re[6]: VBSでストアドの戻り値
□投稿者/ 酒井 (6回)-(2007/09/07(Fri) 14:11:22)
2007/09/07(Fri) 14:12:50 編集(投稿者)
2007/09/07(Fri) 14:12:45 編集(投稿者)
2007/09/07(Fri) 14:12:39 編集(投稿者)
No7518 (Mr.T さん) に返信
> 2007/09/07(Fri) 13:53:37 編集(投稿者)
>
> Mr.Tです、こんにちは。
>
> >>Cmd.CommandType = adCmdStoredProcの部分でエラーコード500が出ていることがわかりました。
> >>現在、これが何ものかを調査中です。
>>⇒エラーコード500の内容は"この変数は宣言されていません"の内容のエラーでした。
>>Cmd.ActiveConnection = objConn、Cmd.CommandText = Sqlではこのエラーはでていないようなのですが、Cmd.CommandType = adCmdStoredProcの部分のみ、このエラーがでてしまいます。
>
> おや、
> 「adCmdStoredProc」
> ここではないですか?
>
> CommandTypeの値は、CommandTypeEnumなので、その実体は数値です。
> VBなんかだと参照設定しているのでそのまま使えるのですが、VBSでは参照設定できないので、自前で設定する必要があります。
>
> Const adCmdStoredProc = 4
>

そのとおりですね。ありがとうございました。

ちなみに以下のロジックでうまくいきました。
'コマンドオブジェクト
Set Cmd = CreateObject("ADODB.Command")
Sql = "DAICHOU_EXPORT"
Cmd.ActiveConnection = objConn
Cmd.CommandType = 4
Cmd.CommandText = Sql

'パラメータオブジェクト
Set Param = CreateObject("ADODB.Parameter")
'数値型は3、戻り値は4
Set param = Cmd.CreateParameter("@return", 3, 4)
Cmd.Parameters.Append param

'文字型は200、IN変数は1
Set param = Cmd.CreateParameter("@DATE_S", 200, 1, 20)
Cmd.Parameters.Append param
Cmd.Parameters("@DATE_S") =DATE_S
MsgBox Cmd.Parameters("@DATE_S").VALUE

'文字型は200、IN変数は1
Set param = Cmd.CreateParameter("@DATE_E", 200, 1, 20)
Cmd.Parameters.Append param
Cmd.Parameters("@DATE_E") =DATE_E

'数値側は3、OUT変数は2
Set param = Cmd.CreateParameter("@ret",3, 2)
Cmd.Parameters.Append param
Cmd.Parameters("@ret") = 0

'//ストアドプロシージャ実行
Cmd.Execute
'// 取得結果を表示
MsgBox Cmd.Parameters("@ret").Value
MsgBox Cmd.Parameters("@return").Value
解決済み
引用返信 編集キー/
■7526 / inTopicNo.9)  Re[7]: VBSでストアドの戻り値
□投稿者/ 酒井 (7回)-(2007/09/07(Fri) 14:13:22)
2007/09/07(Fri) 14:14:33 編集(投稿者)
2007/09/07(Fri) 14:13:41 編集(投稿者)
No7518 (Mr.T さん) に返信
>>2007/09/07(Fri) 13:53:37 編集(投稿者)
>>
>>Mr.Tです、こんにちは。
>>
>>>>Cmd.CommandType = adCmdStoredProcの部分でエラーコード500が出ていることがわかりました。
>>>>現在、これが何ものかを調査中です。
> >>⇒エラーコード500の内容は"この変数は宣言されていません"の内容のエラーでした。
> >>Cmd.ActiveConnection = objConn、Cmd.CommandText = Sqlではこのエラーはでていないようなのですが、Cmd.CommandType = adCmdStoredProcの部分のみ、このエラーがでてしまいます。
>>
>>おや、
>>「adCmdStoredProc」
>>ここではないですか?
>>
>>CommandTypeの値は、CommandTypeEnumなので、その実体は数値です。
>>VBなんかだと参照設定しているのでそのまま使えるのですが、VBSでは参照設定できないので、自前で設定する必要があります。
>>
>>Const adCmdStoredProc = 4
>>
>
> そのとおりですね。ありがとうございました。
>
> ちなみに以下のロジックでうまくいきました。
> 'コマンドオブジェクト
> Set Cmd = CreateObject("ADODB.Command")
> Sql = "DAICHOU_EXPORT"
> Cmd.ActiveConnection = objConn
> Cmd.CommandType = 4
> Cmd.CommandText = Sql
>
> 'パラメータオブジェクト
> Set Param = CreateObject("ADODB.Parameter")
> '数値型は3、戻り値は4
> Set param = Cmd.CreateParameter("@return", 3, 4)
> Cmd.Parameters.Append param
>
> '文字型は200、IN変数は1
> Set param = Cmd.CreateParameter("@DATE_S", 200, 1, 20)
> Cmd.Parameters.Append param
> Cmd.Parameters("@DATE_S") =DATE_S
> MsgBox Cmd.Parameters("@DATE_S").VALUE
>
> '文字型は200、IN変数は1
> Set param = Cmd.CreateParameter("@DATE_E", 200, 1, 20)
> Cmd.Parameters.Append param
> Cmd.Parameters("@DATE_E") =DATE_E
>
> '数値側は3、OUT変数は2
> Set param = Cmd.CreateParameter("@ret",3, 2)
> Cmd.Parameters.Append param
> Cmd.Parameters("@ret") = 0
>
> '//ストアドプロシージャ実行
> Cmd.Execute
> '// 取得結果を表示
> MsgBox Cmd.Parameters("@ret").Value
> MsgBox Cmd.Parameters("@return").Value
解決済み
引用返信 編集キー/
■7528 / inTopicNo.10)  Re[6]: VBSでストアドの戻り値
□投稿者/ 魔界の仮面弁士 (415回)-(2007/09/07(Fri) 14:22:56)
2007/09/07(Fri) 14:24:45 編集(投稿者)

# 入れ違いで[解決]になっていたので、解決チェックのために再編集。
# No7526 は誤投稿かな?

No7518 (Mr.T さん) に返信
> VBSでは参照設定できないので、

参照設定できるかどうかは、VBScript の実行ホストにもよりますね。

スクリプト コンポーネント(*.wsc) なら、<reference> 要素で参照設定できますし、
アクティブ サーバ ページ(*.asp) なら、<!--METADATA TYPE="TypeLib"--> が使えます。


タイプライブラリを参照する機能を有していない場合には、
 C:\Program Files\Common Files\System\ado\
などにある、adovbs.inc をインクルードして利用することができます。
(実行ホストが、インクルード機能を持たない場合は、内容をソースにコピーするなどして利用してください)
解決済み
引用返信 編集キー/
■7534 / inTopicNo.11)  Re[7]: VBSでストアドの戻り値
□投稿者/ Mr.T (90回)-(2007/09/07(Fri) 14:57:18)
Mr.Tです、こんにちは。

> ■No7518 (Mr.T さん) に返信
>>VBSでは参照設定できないので、
>
> 参照設定できるかどうかは、VBScript の実行ホストにもよりますね。
>
> スクリプト コンポーネント(*.wsc) なら、<reference> 要素で参照設定できますし、
> アクティブ サーバ ページ(*.asp) なら、<!--METADATA TYPE="TypeLib"--> が使えます。

てっきり(*.VBS)なんだと思ってました。
ASPもチラとアタマに浮かんだのですが、VBSファイルでしょー?と...orz
申し訳ないです、質問者の方

解決済み
引用返信 編集キー/
■7546 / inTopicNo.12)  Re[8]: VBSでストアドの戻り値
□投稿者/ 魔界の仮面弁士 (417回)-(2007/09/07(Fri) 17:15:57)
No7534 (Mr.T さん) に返信
> てっきり(*.VBS)なんだと思ってました。
> ASPもチラとアタマに浮かんだのですが、VBSファイルでしょー?と...orz

*.vbs をダブルクリックで実行している (あるいは、WScript.exe や CScript.exe からの実行) なら、
かわりに *.wsf 経由で実行させてやれば、参照設定が行えます。


====== C:\test.vbs ======
Option Explicit
MsgBox adCmdStoredProc


====== C:\test.wsf ======
<?xml version="1.0" encoding="Shift_JIS"?>
<?component error="true" debug="true"?>
<package>
<job id="sample">

<!-- ADO 2.8 のタイプライブラリを参照設定 -->
<reference guid="{2A75196C-D9EB-4129-B803-931327F72D5C}" version="2.8"/>

<!-- 同じフォルダ上の test.vbs をロードして実行 -->
<script language="VBScript" src="test.vbs"></script>

</job>
</package>
========================
解決済み
引用返信 編集キー/
■7561 / inTopicNo.13)  Re[9]: VBSでストアドの戻り値
□投稿者/ Mr.T (91回)-(2007/09/08(Sat) 01:39:49)
2007/09/08(Sat) 01:40:05 編集(投稿者)
Mr.Tです、こんにちは。

> *.vbs をダブルクリックで実行している (あるいは、WScript.exe や CScript.exe からの実行) なら、
> かわりに *.wsf 経由で実行させてやれば、参照設定が行えます。
> 
> 
> ======   C:\test.vbs   ======
> Option Explicit
> MsgBox adCmdStoredProc
> 
> 
> ======   C:\test.wsf   ======
> <?xml version="1.0" encoding="Shift_JIS"?>
> <?component error="true" debug="true"?>
> <package>
> <job id="sample">
> 
> <!-- ADO 2.8 のタイプライブラリを参照設定 -->
> <reference guid="{2A75196C-D9EB-4129-B803-931327F72D5C}" version="2.8"/>
> 
> <!-- 同じフォルダ上の test.vbs をロードして実行 -->
> <script language="VBScript" src="test.vbs"></script>
> 
> </job>
> </package>
> ========================

なるほど、こういう方法もあるんですね。
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/script56/html/wsAdvantagesOfWs.asp
にある通り、test.vbsはIncludeされるから、
<script language="VBScript">
option explicit
MsgBox adCmdStoredProc
</script>
と展開されることと同じと考えてよいということですね。


解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -