- - PR -
SQLの結果が返ってこない時の例外処理
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-10-02 08:14
VS2005(VB) + OracleでWinアプリを開発しています。
検索の日付範囲などで、処理件数の多いSelect文が発行されないように、 コントロールでチェックをかけているのですが、Select文が発行された 場合でも、一定時間結果が返ってこなかった場合、例外処理を掴むなどと いうことはできるのでしょうか。 ご存知のかたいらっしゃれば、教えてください。 | ||||
|
投稿日時: 2007-10-02 09:02
さかもとと申します。
connection timeoutで指定ではダメでしょうか? 例外処理は(MS-SQLですが) http://msdn2.microsoft.com/ja-jp/library/system.data.sqlclient.sqlexception(VS.80).aspx Oracleでも同じような感じではないかと。 _________________ ------------------------------------------ 拝啓、さかもとと申します♪ | ||||
|
投稿日時: 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 | ||||
|
投稿日時: 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 ] | ||||
|
投稿日時: 2007-10-02 20:52
メイン スレッドと別制御になってしまうのでいろいろ面倒な問題がでてくるかも。 予め件数も知って予防するか、あるいは件数を打ち切って打ち切った旨を知らせるような仕様の方がまだ良いかもしれません。 (そういった結果ページをたまに見かけますが) _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2007-10-03 07:41
Fill しないで、一件ずつ読んで、適当なところで打ち切り、、、とか。
| ||||
|
投稿日時: 2007-10-03 09:38
皆さん、ありがとうございます。
OracleDataReaderをループさせて、カウントを取り、 カウントで強制的に、接続を切ることにしました。 ただ、ループの回数があまりに多いと、 数十秒の時間がかかってしまうのがネックですが。 SQLの結果を待ち続けることはなくなるので、 この方法でいこうと思います。 While OracleDataReader.Read() i += 1 End While |
1