- PR -

SQLの結果が返ってこない時の例外処理

1
投稿者投稿内容
me2kichi
会議室デビュー日: 2007/10/02
投稿数: 15
投稿日時: 2007-10-02 08:14
VS2005(VB) + OracleでWinアプリを開発しています。

検索の日付範囲などで、処理件数の多いSelect文が発行されないように、
コントロールでチェックをかけているのですが、Select文が発行された
場合でも、一定時間結果が返ってこなかった場合、例外処理を掴むなどと
いうことはできるのでしょうか。

ご存知のかたいらっしゃれば、教えてください。
さかもと
ぬし
会議室デビュー日: 2004/05/14
投稿数: 586
投稿日時: 2007-10-02 09:02
さかもとと申します。

connection timeoutで指定ではダメでしょうか?

例外処理は(MS-SQLですが)

http://msdn2.microsoft.com/ja-jp/library/system.data.sqlclient.sqlexception(VS.80).aspx

Oracleでも同じような感じではないかと。




_________________
------------------------------------------
拝啓、さかもとと申します♪
me2kichi
会議室デビュー日: 2007/10/02
投稿数: 15
投稿日時: 2007-10-02 11:00
さかもとさん、こんにちは。

OracleConnectionの、ConnectionTimeout = 1と設定しようとしましたが、
"ReadOnlyなので、値が設定されません"というエラーがでてしまいます。

なので、connection timeoutで調べ、
OracleCommandのCommandTimeoutを1秒に設定しましたが、
例外が発生しませんでした。

下記のサイトを参照すると、ExecuteReaderで設定した時間に達しないと、
例外が発生しない、とあります。

ExcuteReaderでは、時間がかかっておらず、
Fillに時間がかかっているので、駄目みたいです。

http://otn.oracle.co.jp/forum/thread.jspa?threadID=28002375
さかもと
ぬし
会議室デビュー日: 2004/05/14
投稿数: 586
投稿日時: 2007-10-02 16:16
さかもとです。
me2kichiさん
ConnectionではなくCommandTimeoutでしたね・・・。
誤情報すいません、Connectionは「接続が確立されるまでの・・・」でした。

--引用--
CommandTimeOutプロパティはクエリ結果の最初の行を待機する(タイムアウトになるまでの)秒数を指定します。このプロパティは規定で30に設定されます。CommandTimeoutプロパティに指定した時間内にクエリが完了しない場合は、Commandから例外が出されます。

CommandTimeoutプロパティの時間内に最初の行を取得し始めていれば、テーブルの無いようを取得し終えるまでどれほど時間がかかってもタイムアウトにはなりません

「プログラミングADO.NET2.0 第4章より引用」
----

とのことなので、me2kichiさんがお調べになった通りだと思います。
(ODP.NETは使ったこと無いのですが、恐らく同じではないかと)

実現方法としてはスマートかどうか、または正当なやり方があるのかもしれませんが、例えばタイマーを仕掛けておいて一定時間内に該当の処理が終わらなかったら例外を出すなどは如何でしょうか?

それか、検索結果件数の上限を予め決めておいて処理自体をさせないとか・・・。


_________________
------------------------------------------
拝啓、さかもとと申します。

[ メッセージ編集済み 編集者: さかもと 編集日時 2007-10-02 16:17 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-10-02 20:52
引用:

さかもとさんの書き込み (2007-10-02 16:16) より:

例えばタイマーを仕掛けておいて一定時間内に該当の処理が終わらなかったら例外を出すなどは如何でしょうか?


メイン スレッドと別制御になってしまうのでいろいろ面倒な問題がでてくるかも。 予め件数も知って予防するか、あるいは件数を打ち切って打ち切った旨を知らせるような仕様の方がまだ良いかもしれません。 (そういった結果ページをたまに見かけますが)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-10-03 07:41
Fill しないで、一件ずつ読んで、適当なところで打ち切り、、、とか。
me2kichi
会議室デビュー日: 2007/10/02
投稿数: 15
投稿日時: 2007-10-03 09:38
皆さん、ありがとうございます。

OracleDataReaderをループさせて、カウントを取り、
カウントで強制的に、接続を切ることにしました。

ただ、ループの回数があまりに多いと、
数十秒の時間がかかってしまうのがネックですが。

SQLの結果を待ち続けることはなくなるので、
この方法でいこうと思います。

While OracleDataReader.Read()
i += 1
End While
1

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