• 締切済み

VB.NETでDB2DataReaderをLan切断時にシステムエラーにする方法

VB.net2003でDB2を使用しています。 問題 1 DB2DataReaderを使ってSQLでセレクトしてきたデータを読みます。 そして、リードする際、Lanケーブルを抜いて 切断時の環境を作るテストをしています。 ところが、ケーブルを抜いてもそのままリードして 処理をスルーしていきます。 データも一件分だけとってきています。 問題 2 リードした中で更に別のDBからテーブルをセレクトし、 別のデーターリーダーを使って処理をしますが、 そのタイミングで線を抜くとシステムエラーできちんと止まります。 両方の問題共にコネクトの設定の仕方等、全く同じやり方ですが、 どうしてこういう相違が生まれるのか教えてください。 必要なコードがあれば記述します。

みんなの回答

回答No.2

とりあえず 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 が停止しているので当然ですね。 外してますかね。。。

takahiro_k
質問者

補足

実験、ありがとうございます。 今回のこのフローで言うと 12で線を抜いても処理を実行しますが、 17で線を抜くとDo While rdr2.Readで落ちます。 そのため、処理が進む事がないんですよ。 なので一回もループしないんでopenでエラーではなく、 一発目のReadでエラーなんです。 うーん、原因特定はやはり難しいんでしょうか。 ちなみにランケーブルを抜いたテストと DBを停止するテストでは多少結果が異なるらしいので できたらケーブルを抜いてテストしてもらえないでしょうか? お願いします。m(_ _)m

回答No.1

DB2DataReader は使ったことがないのですが、まぁ ADO.NET ならどれもほぼ同じかなぁ。 厳密にどういったタイミングで何で何が起きているのか、ってとこですが。 DataCommand オブジェクトの ExecuteReader() メソッドで結果を Reader にぶち込むと思いますが、問題 1 のケースでは物理的に DB に接続できない状況なのに ExecuteReader でデータを読み込めているって事ですか? それは信じられない・・・ ExecuteReader しちゃった後ならケーブルを抜いても Reader オブジェクトにデータが入っちゃってるから問題ないと思いますが。 何しろ ADO.NET は非接続ですんで、DB に接続しっぱなしじゃないです。必要なときに接続して必要な処理を行い、すぐに切断します。 問題 2 のケースでは厳密にどういったタイミングでケーブルを抜いて、どのオブジェクトで何をしたらどんなエラーが起きたのでしょうか?

takahiro_k
質問者

補足

問題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する瞬間に接続状態を チェックする事ができる、とか。

関連するQ&A