重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

VB.net2003でDB2を使用しています。

問題 1
DB2DataReaderを使ってSQLでセレクトしてきたデータを読みます。
そして、リードする際、Lanケーブルを抜いて
切断時の環境を作るテストをしています。

ところが、ケーブルを抜いてもそのままリードして
処理をスルーしていきます。
データも一件分だけとってきています。

問題 2
リードした中で更に別のDBからテーブルをセレクトし、
別のデーターリーダーを使って処理をしますが、
そのタイミングで線を抜くとシステムエラーできちんと止まります。

両方の問題共にコネクトの設定の仕方等、全く同じやり方ですが、
どうしてこういう相違が生まれるのか教えてください。

必要なコードがあれば記述します。

A 回答 (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 が停止しているので当然ですね。
外してますかね。。。

この回答への補足

実験、ありがとうございます。

今回のこのフローで言うと
12で線を抜いても処理を実行しますが、
17で線を抜くとDo While rdr2.Readで落ちます。
そのため、処理が進む事がないんですよ。

なので一回もループしないんでopenでエラーではなく、
一発目のReadでエラーなんです。

うーん、原因特定はやはり難しいんでしょうか。
ちなみにランケーブルを抜いたテストと
DBを停止するテストでは多少結果が異なるらしいので
できたらケーブルを抜いてテストしてもらえないでしょうか?

お願いします。m(_ _)m

補足日時:2006/10/21 21:20
    • good
    • 0

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

補足日時:2006/10/21 10:38
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!