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

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

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

Re[2]: vbsから実行したSQLスクリプトファイルの結果取得方法


(過去ログ 48 を表示中)

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

■26354 / inTopicNo.1)  vbsから実行したSQLスクリプトファイルの結果取得方法
  
□投稿者/ soba (2回)-(2008/10/07(Tue) 17:27:13)

分類:[VBScript] 

OS:WinXP
DB:SQLServer2005

お世話になります。
スクリプトファイルに記述されたストアドをvbscriptから実行し、
ストアドが返す、Select結果をvbscript内で受け取り、
変数に保持したいのですが、どのように受け取ればよいのでしょうか?
# 条件に使われるIDはユニークなIDで、結果は1つのカラムのみになります。

なおスクリプトファイルの実行には、Wshシェルからsqlcmdコマンドを走らせております。


以下のように実行した場合、「0」と返ってきます。
----------------------------------------------------------------------------------------
strID = "ID"
strPsw = "パスワード"
strSvr = "サーバ名"
strDb = "DB名"
strFile = "ストアド起動のスクリプトファイル名"

'「-v」にて与える引数を条件として、Select結果を返します。
Result = WshShell.Run("sqlcmd -U strID -P strPsw -S strSvr -d strDb -i strFile -v var=1")

----------------------------------------------------------------------------------------

ADODBにてSQLServerに接続し、Recordsetで結果を受け取る方法は分かるのですが、
誰でも操作できるように、既存のスクリプトファイルを利用すべきということで
この方法で実装するしか思いついていない状態です。

sqlcmdコマンドやストアドについて調べてみたのですが、vbscriptからsqlcmdコマンドを実行して
結果を取得する方法が見つかりませんでしたので、質問させていただいた次第です。
なお、コマンドプロンプトより実行した場合は、思った通りのSelect結果の取得に成功しております。

もし他にスマートなやり方などがありましたら、そちらもご教示頂けましたら幸いです。
よろしくお願いします。

引用返信 編集キー/
■26355 / inTopicNo.2)  Re[1]: vbsから実行したSQLスクリプトファイルの結果取得方法
□投稿者/ たくボン (49回)-(2008/10/07(Tue) 17:47:13)
No26354 (soba さん) に返信
> スクリプトファイルに記述されたストアドをvbscriptから実行し、
> ストアドが返す、Select結果をvbscript内で受け取り、
> 変数に保持したいのですが、どのように受け取ればよいのでしょうか?
> # 条件に使われるIDはユニークなIDで、結果は1つのカラムのみになります。
> なおスクリプトファイルの実行には、Wshシェルからsqlcmdコマンドを走らせております。

vbscriptはあまり使わないので、スマートな方法かどうかはわかりませんが、リダイレクトして結果をファイルに落としてみては?
コマンドプロンプトで結果が表示されると言うことは、標準出力に結果が出ているので、それをリダイレクトすれば後は普通にファイルを読み込むだけですし。

リダイレクトの方法とかは、この辺りが参考になるかも。
http://winofsql.jp/VA003334/vbsguide051215192026.htm

引用返信 編集キー/
■26364 / inTopicNo.3)  Re[2]: vbsから実行したSQLスクリプトファイルの結果取得方法
□投稿者/ soba (3回)-(2008/10/07(Tue) 18:53:15)
No26355 (たくボン さん) に返信
> vbscriptはあまり使わないので、スマートな方法かどうかはわかりませんが、リダイレクトして結果をファイルに落としてみては?
> コマンドプロンプトで結果が表示されると言うことは、標準出力に結果が出ているので、それをリダイレクトすれば後は普通にファイルを読み込むだけですし。
> リダイレクトの方法とかは、この辺りが参考になるかも。
> http://winofsql.jp/VA003334/vbsguide051215192026.htm

たくボンさん、お返事ありがとうございます。
早速ご提示頂きましたURLを参考に、vbscriptを記述してみました。
なお、最初の投稿時のコードはミスがあったため、その部分も修正しております。
(文字列内にて変数を使用していました。。。)

■test.vbs
---------------------------↓ここから↓----------------------------------

strID = "ID"
strPsw = "パスワード"
strSvr = "サーバ名"
strDb = "DB名"
OutPath = "標準出力内容を出力するテキストファイルのパス"
strFile = "スクリプトファイルのパス"
intID = "ストアド内にて行われるSelect分の条件となるID"

Set WshShell = WScript.CreateObject("WScript.Shell")

Call WshShell.Run("cmd.exe /c sqlcmd -U " & ID & " -P " & strPsw & " -S " & strSvr & " -d " & strDb & " -i " & strFile & " -v NUMBER=" & intID & " > " & OutPath, 0, True)

Set objFso = WScript.CreateObject("Scripting.FileSystemObject")
Set objHandle = objFso.OpenTextFile(OutPath, 1)

If Not objHandle.AtEndOfStream Then
	strResult = objHandle.ReadAll
End If

objHandle.Close

---------------------------↑ここまで↑----------------------------------



■test.vbs実行結果
---------------------------↓ここから↓----------------------------------

NAME                          
------------------------------
hoge                      
(1 行処理されました)

---------------------------↑ここまで↑----------------------------------

標準出力内容を'strResult'という変数に取得できたのですが、
上記のようになりました。

結果の取得には成功したものの、カラム名と半角ハイフンと処理行数も出てしまい、
たくボンさんには大変申し訳ないのですが、望み通りの結果ではありませんでした。

ただコマンドプロンプトをほとんど使用したことがなかったため、
標準出力という機能を知るきっかけとなり、大変感謝しております。
ありがとうございました。

必要行のみ取り出してTrim関数でスペースを削るという方法で、無理やり処理を通すこともできそうですが、
あまり確実な方法とは思えませんので、
引き続き、他の方法をご存知の方がいらっしゃいましたら、ご教示頂けましたら幸いです。

引用返信 編集キー/
■26387 / inTopicNo.4)  Re[1]: vbsから実行したSQLスクリプトファイルの結果取得方法
□投稿者/ ふるふる (16回)-(2008/10/08(Wed) 09:56:16)
>
> ADODBにてSQLServerに接続し、Recordsetで結果を受け取る方法は分かるのですが、
> 誰でも操作できるように、既存のスクリプトファイルを利用すべきということで
> この方法で実装するしか思いついていない状態です。
>

スクリプトファイルを読み込んで、実行させたいSQLコマンドを取り出し、ADOでExecuteするというのは?
そうすれば実行結果がレコードセットとして返ってくるでしょう。


引用返信 編集キー/
■26392 / inTopicNo.5)  Re[2]: vbsから実行したSQLスクリプトファイルの結果取得方法
□投稿者/ soba (4回)-(2008/10/08(Wed) 10:48:21)
No26387 (ふるふる さん) に返信
> スクリプトファイルを読み込んで、実行させたいSQLコマンドを取り出し、ADOでExecuteするというのは?
> そうすれば実行結果がレコードセットとして返ってくるでしょう。

おはようございます。
ふるふるさん、お返事ありがとうございます。

私も昨日、帰宅後に同じようなことを考え、以下のコードを書いてみました。

---------------------------↓ここから↓----------------------------------
strID = "ID"
strPsw = "パスワード"
strSvr = "サーバ名"
strDb = "DB名"
intID = "ストアド内にて行われるSelect分の条件となるID"
strFile = "スクリプトファイルのパス"

Set objFso = WScript.CreateObject("Scripting.FileSystemObject")

'スクリプトファイルを読み込み、変数へ代入
Set objHandle = objFso.OpenTextFile(strFile)
strData = objHandle.ReadAll
objHandle.Close

strData = Replace(strData, "$(var)", intID) '"$(var)"はSQLスクリプトファイル内のスクリプト変数

Set objHandle = Nothing
Set objFso = Nothing
Set objCN = WScript.CreateObject("ADODB.Connection")
objCN.ConnectionString = "Provider=SQLOLEDB.1;User ID=" & strID & ";Password=" _
& strPsw & ";InitialCataLog=" & strDb & ";Data Source=" & strSvr
objCN.Open

objRS = objCN.Execute(strData)

'//以下略
---------------------------↑ここまで↑----------------------------------

上記コードにて、Recordsetに値を持たせることに成功しました。
# 当然といえば当然なのですが、コメント行もちゃんとエスケープできていました。

引数を与える部分にて、Replace関数を使用しているので、
このままでは若干危険なコードのような気がしますが、その部分にはチェック処理を加えればいけそうです。


現在、設計フェーズでの裏取り中でしたので、実際に使用するスクリプトファイルを頂き次第、
検討してみて、問題なさそうであればこの方法で進めてみようと思います。

たくボンさん、ふるふるさん、お世話になりました。
ありがとうございます。

以上で、解決済とさせて頂きます。

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


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

このトピックに書きこむ

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

管理者用

- Child Tree -