@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

ストアドのエラー処理

投稿者投稿内容
michael
会議室デビュー日: 2004/03/12
投稿数: 14
投稿日時: 2004-03-29 19:34
いつもお世話になっています。

現在VB.NETにて開発を行っていますが、
ストアド(SQLServer2000)のエラー処理で困っています。
というのはエラー番号によってエラーの処理を分けたいのですが、
エラー番号の取得が出来ません。
具体的には、
"排他ロックがかかっていて更新できない場合"

"タイムアウトエラー"
といったようなSQLServer側でのエラー情報をしたいと思っています。
現在は上記のようなエラーはすべてCatchにてメッセージのみの表示を行っています。
お手数お掛けしますが、ご教授下さい。

<<VB.NETサンプル>>
Try
"ストアドの呼び出し"

Catch ex as Exception
Messagebox.Show(ex.Message.ToString)
End Try


<<ストアドサンプル>>
CREATE PROCEDURE StdSampleUpd(@inCode Int
,@inContents Varchar(100)
,@outSQLCode Int OutPut
,@outErrStep VarChar(100) OutPut
,@outErrSTS Int OutPut)
AS
-- ( 件処理されました)の表示を抑制する
SET NOCOUNT ON
--■■■ 変数初期化 ■■■■■■■■■■■■■■■■■■■■■■■■■
SET @outErrStep = '変数初期化'
SET @outSQLCode = 0
SET @outErrSTS = 99
--■■■ 主処理部(明細処理) ■■■■■■■■■■■■■■■■■■■■■■■■
-- 更新処理
SET @outErrStep = '更新処理'
Update InsTest SET CONTENTS = @inContents WHERE CODE = @inCode

IF @@ERROR <> 0
BEGIN
GOTO LABEL_ERROR
END

--■■■ 終了処理 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
SET @outErrSTS = 0 -- エラーステータス(正常終了)
RETURN
--■■■ エラー処理 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■
LABEL_ERROR:
SET @outErrSTS = 1 -- エラーステータス(異常終了)
SET @outSQLCode = @@Error -- エラーコード
RETURN
落社員
会議室デビュー日: 2004/02/12
投稿数: 14
投稿日時: 2004-03-29 19:38
catchの中で@outSQLCodeを取得してやれば良いと思います

[ メッセージ編集済み 編集者: 落社員 編集日時 2004-03-29 19:39 ]
michael
会議室デビュー日: 2004/03/12
投稿数: 14
投稿日時: 2004-03-29 20:18
早速のご返事ありがとうございます。

私のほうでも@outSQLCODEの値が取得できればと思ったのですが、
取得してみたところ値が何も入っておらず困っております。

<<取得方法>>
Dim Cmd As OleDBCommand

<<パラメーターの追加>>
Cmd.Parameters.Add("outSQLCODE", OldDBType.Integer)

<<パラメーターの取得>>
Cmd.Parameters("outSQLCODE").Value
nodera
大ベテラン
会議室デビュー日: 2003/09/08
投稿数: 200
投稿日時: 2004-03-29 20:54
パラメータ追加時に、outSQLCodeが出力用であることを指定しているでしょうか?

例えば次のようなコード:
Cmd.Parameters.Add("outSQLCODE", OldDBType.Integer).Direction = ParameterDirection.Output;
michael
会議室デビュー日: 2004/03/12
投稿数: 14
投稿日時: 2004-03-29 21:38
ありがとうございます。

こちらで試してみましたが、
やはり結果は変わりませんでした。

私のエラー処理は間違っているのでしょうか?
クエリアナライザでは確かにSQL文発行後の@@error変数の取得は出来るのですが・・・。

ちなみにエラー番号以外の出力パラメーターもあるのですが、
こちらのほうも異常終了時は何も値が設定されていない状態となります。
(正常終了時は取得できています)
nodera
大ベテラン
会議室デビュー日: 2003/09/08
投稿数: 200
投稿日時: 2004-03-29 23:52
UPDATE文 から SET @outSQLCode = @@Error までの間に@@Errorの内容が書き換わっていませんか?すでに家に帰ってきてしまい環境がないので試せないのですが、@@Errorは確かT-SQLステートメント実行するたびに書き換わっていくので、GOTO文やLABEL_ERROR:後のSETで既に書き換わってるのかもしれません。UPDATE直後に@@Errorを別の変数に代入して、それを検証や戻り値として利用してみてください。
michael
会議室デビュー日: 2004/03/12
投稿数: 14
投稿日時: 2004-03-30 08:52
ご指摘ありがとうございます。

ご指導いただいたようにUPDATE文の直後に下記のSET文を移動させてみましたが結果は変わりませんでした。
SET @outSQLCODE = @@ERRROR

他の出力パラメーターも取得できないということは、
ストアドが途中でエラーとなった場合は、出力パラメーターの値を取得できないということでしょうか?
Micky
大ベテラン
会議室デビュー日: 2002/09/04
投稿数: 137
投稿日時: 2004-03-30 09:33
Mickyでございます。

勘違いがあったので削除させて頂きました。
すいません。m(__)m

[ メッセージ編集済み 編集者: Micky 編集日時 2004-03-30 10:10 ]

スキルアップ/キャリアアップ(JOB@IT)