- 締切済み
VB.NETでDB2DataReaderをLan切断時にシステムエラーにする方法
VB.net2003でDB2を使用しています。 問題 1 DB2DataReaderを使ってSQLでセレクトしてきたデータを読みます。 そして、リードする際、Lanケーブルを抜いて 切断時の環境を作るテストをしています。 ところが、ケーブルを抜いてもそのままリードして 処理をスルーしていきます。 データも一件分だけとってきています。 問題 2 リードした中で更に別のDBからテーブルをセレクトし、 別のデーターリーダーを使って処理をしますが、 そのタイミングで線を抜くとシステムエラーできちんと止まります。 両方の問題共にコネクトの設定の仕方等、全く同じやり方ですが、 どうしてこういう相違が生まれるのか教えてください。 必要なコードがあれば記述します。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- temtecomai2
- ベストアンサー率61% (656/1071)
とりあえず SQL Server 2005 相手に試してみました。 データベースは testDB1 と testDB2 の 2種類。 testDB1 への Connection オブジェクトは SqlConnection1、 testDB2 への Connection オブジェクトは SqlConnection2 とし、 それぞれ初期化済みです。 01: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 02: Dim cmd1 As SqlCommand = Nothing 03: Dim rdr1 As SqlDataReader = Nothing 04: Dim cmd2 As SqlCommand = Nothing 05: Dim rdr2 As SqlDataReader = Nothing 06: cmd1 = New SqlCommand() 07: cmd1.Connection = Me.SqlConnection1 08: cmd2 = New SqlCommand() 09: cmd2.Connection = Me.SqlConnection2 10: cmd1.CommandText = "SELECT * FROM db1Table1" 11: cmd1.Connection.Open() 12: rdr1 = cmd1.ExecuteReader() 13: Do While rdr1.Read() 14: Debug.WriteLine(rdr1.GetString(1)) 15: cmd2.CommandText = "SELECT * FROM db2Table1" 16: cmd2.Connection.Open() 17: rdr2 = cmd2.ExecuteReader() 18: Do While rdr2.Read() 19: Debug.WriteLine(rdr2.GetString(1)) 20: Loop 21: cmd2.Connection.Close() 22: rdr2.Close() 23: Loop 24: cmd1.Connection.Close() 25: rdr1.Close() 26: End Sub ステップ実行で 17 の処理直後に SQL Server 2005 を停止しましたが、18~20 rdr2 のループが rdr2 のレコード数だけ問題なく進み、28 から 13 へ戻り、16 の cmd2.Connection.Open() でエラーになります。 DB が停止しているので当然ですね。 外してますかね。。。
- temtecomai2
- ベストアンサー率61% (656/1071)
DB2DataReader は使ったことがないのですが、まぁ ADO.NET ならどれもほぼ同じかなぁ。 厳密にどういったタイミングで何で何が起きているのか、ってとこですが。 DataCommand オブジェクトの ExecuteReader() メソッドで結果を Reader にぶち込むと思いますが、問題 1 のケースでは物理的に DB に接続できない状況なのに ExecuteReader でデータを読み込めているって事ですか? それは信じられない・・・ ExecuteReader しちゃった後ならケーブルを抜いても Reader オブジェクトにデータが入っちゃってるから問題ないと思いますが。 何しろ ADO.NET は非接続ですんで、DB に接続しっぱなしじゃないです。必要なときに接続して必要な処理を行い、すぐに切断します。 問題 2 のケースでは厳密にどういったタイミングでケーブルを抜いて、どのオブジェクトで何をしたらどんなエラーが起きたのでしょうか?
補足
問題1のケース 正確には、ExecuteReaderの処理の後で do while db2datereader.readの命令文でループしながら 一件ずつデータを読んで処理を行っていくわけです。 このreadのタイミングで線を抜くんですよ。 temtecomai2さんの話だとこの状態で線を抜いても 動くというのが正解という事でしょうか? 問題2のケース 上記が正解だと今度、 こちらの方が問題の動きという見方になるんですが、 上記のdo while db2datereader.readの処理の中で 別のdatereaderを使って、 別のDBからデータをセレクトした結果を入れます。 セレクトした後でExecuteReaderが走り、 その関数を抜けてif db2datereader.read = true then の様に行があったら処理をします、みたいなつくりです。 この瞬間に線を抜くので問題1のケースも 問題2のケースも抜くタイミングは全く同じです。 ところが、問題2のケースだとシステムエラーとなって落ちます。 エラー内容は…覚えてないです、今は現場ではないので。^^; 月曜日までの持ち越しになってしまうんですが、 何かこれだけの情報で打開策はあるでしょうか? 例えば、datereaderをreadする瞬間に接続状態を チェックする事ができる、とか。
補足
実験、ありがとうございます。 今回のこのフローで言うと 12で線を抜いても処理を実行しますが、 17で線を抜くとDo While rdr2.Readで落ちます。 そのため、処理が進む事がないんですよ。 なので一回もループしないんでopenでエラーではなく、 一発目のReadでエラーなんです。 うーん、原因特定はやはり難しいんでしょうか。 ちなみにランケーブルを抜いたテストと DBを停止するテストでは多少結果が異なるらしいので できたらケーブルを抜いてテストしてもらえないでしょうか? お願いします。m(_ _)m