こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

-広告-

解決済みの質問

VBScriptでのDBのエラー取得

VBScriptでADO(ADODB)接続により、SQLServer(2012)に接続して
クエリを発行し、結果をファイルに出力するVBScriptを作成して
います。

SQL実行時のエラーに対応する為、VBScriptにてエラーオブジェクトのプロパティ
(Err.Number、Err.Description)を使用し、エラー番号と内容を取得しているの
ですが、SQL Serverから発行しているエラー番号、エラー内容を取得したいので
すが、取得できません。

どのようにすれば、データベース固有のエラーを取得ができますか。
是非ご教示いただきたく、
お手数をおかけ致しますが、宜しくお願い致します。

-------------------------------------------------
Option Explicit

Dim objADO
Dim objRS
Dim Sql

if WScript.Arguments.Count <> 1 then
WScript.echo("usage: script.vbs arg1")
WScript.Quit(-1)
end if

arg1 = WScript.Arguments(0)

Set objADO = CreateObject("ADODB.Connection")

objADO.Open "Provider=SQLOLEDB;" & _
"Data Source=hoge;" & _
"Initial Catalog=hoge;" & _
"Integrated Security=SSPI;"

sql = ""
sql = "select ~ where column ='"&arg1&"'"

set objRS = objADO.Execute(sql)
If Err.Number <> 0 Then
objADO.Close
Set objADO = Nothing
WScript.Quit(-1)
End If

sql = ""
sql = "update ~ ~ where column ='"&arg1&"'"

objADO.Execute(sql)
If Err.Number <> 0 Then
更新の破棄とエラー内容の表示
Else
更新を反映
End If

objADO.Close

Set objADO = Nothing

投稿日時 - 2016-01-26 11:20:45

QNo.9117331

困ってます

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

>Executeメソッドの実行件数を知りたいのですが、
>selectの場合は、抽出件数、updateの場合は更新件数を
>0件なのか、1件以上なのかを知りたいのですが

Select文を実行した場合は、ExecuteからRecordsetが返されるので、

set objRS = objADO.Execute(sql)

ってやったら、objRSにRecordsetが入っています。

RecordsetオブジェクトにはRecordCountプロパティがありますから、このプロパティでレコード数が判る場合があります(デフォルトでは判りません)

デフォルトのカーソルタイプが、レコード数が判らないタイプになっているので、デフォルトではRecordCountプロパティが-1になります。

ですので、

objADO.Open "Provider=SQLOLEDB;" & _ (以下略)

の次の行に

connect.CursorLocation = 3 ' クライアントサイドカーソルに変更

を入れて下さい。これで「objRS.RecordCount」に、セレクトしたレコード数が(レコードが無いなら0が、あるならレコード数が)入ります。

なお、Updateした件数は判らないので、事前に同じ条件でSelect文を発行して、上記の方法で対象が何件あるか調べるしかありません。

但し、ただSelectしただけでは「AをAに更新する」など、実質的に更新が入らない場合も更新件数に数えてしまうので、更新済みのレコードは返さないように、事前のSelect文を工夫しないといけません。

例えば「update テーブル set field1 = 123, field2 = 456 where column = パラメータ」をするのであれば「select * from テーブル where column = パラメータ and (field1 <> 123 or field2 <> 456)」のように、更新済みのレコードはSelectしないようにします。

投稿日時 - 2016-01-27 16:33:41

お礼

すみません。
お礼遅くなってすみません。

説明、解説ありがとうございます。

投稿日時 - 2016-02-05 15:37:45

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(4)

ANo.3

>Itemの添え字は0からでした。

再度に渡る間違い、申し訳ありませんでした。

普段、Option Base 1(配列の添え字を1から始める)でプログラミングしているので、間違えました。

投稿日時 - 2016-01-26 17:40:31

補足

すみません。

実行件数取得できました。

投稿日時 - 2016-01-27 15:34:07

お礼

ありがとうございます。

すみません、さらに質問なのですが、

Executeメソッドの実行件数を知りたいのですが、
selectの場合は、抽出件数、updateの場合は更新件数を
0件なのか、1件以上なのかを知りたいのですが
よろしくお願いいたします。

投稿日時 - 2016-01-27 14:43:48

-広告-

ANo.2

>「Errors.Items」をオブジェクトが、プロパティまたは方法をサポートしていないみたいなんですが。

失礼しました。

ItemsじゃなくてItemです。「Items」の「s」が余計なので削ってください。

Errorsのsにつられて、勢いでItemにもs付けちゃいました。

投稿日時 - 2016-01-26 14:37:15

お礼

ありがとうございます。

情報を取得することができました。

Itemの添え字は0からでした。
0に必要なエラー情報が入っていました。

投稿日時 - 2016-01-26 16:53:36

ANo.1

objADO.Errorsコレクションを参照して下さい。

まず
Set objADO = CreateObject("ADODB.Connection")
の次に
objADO.Errors.Clear
を実行して、エラーをクリアします。

SQLの実行後、エラーがあるなら

objADO.Errors.Count

が1以上になります。

if objADO.Errors.Count > 0 then
for i = 1 to objADO.Errors.Count
msgbox objADO.Errors.Items(i).Description
msgbox objADO.Errors.Items(i).Number
next i

とやれば、エラーコレクションの内容、エラー番号をメッセージボックスで表示できます。

詳しくは
http://yasusigi.net/iasdocs/aspdocs/ref/comp/dadobj02.htm
http://yasusigi.net/iasdocs/aspdocs/ref/comp/dadobj01_2.htm
を参照して下さい。

投稿日時 - 2016-01-26 11:51:49

お礼

ありがとうございます。

教えて頂いた方法で試してみたのですが、
Microsoft VBScript runtime error: Object doesn't support this property or method: 'Errors.Items'
が表示されます。

「Errors.Items」をオブジェクトが、プロパティまたは方法をサポート
していないみたいなんですが。

投稿日時 - 2016-01-26 14:15:42

-広告-
-広告-
-広告-
-広告-