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

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 が停止しているので当然ですね。
外してますかね。。。
この回答への補足
実験、ありがとうございます。
今回のこのフローで言うと
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 のケースでは厳密にどういったタイミングでケーブルを抜いて、どのオブジェクトで何をしたらどんなエラーが起きたのでしょうか?
この回答への補足
問題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が見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
worksheetFunctionクラスのVloo...
-
VBAからPDFファイルにパスワー...
-
エクセルのVBAの標準モジュール...
-
「Columns("A:C")」の列文字を...
-
Excelでフィルタをかけると警告...
-
実行時エラー 3265「要求された...
-
VBA:オートシェイプの線の長...
-
VBA msoShapeBlockArcで扇形の...
-
上下の位置揃えについて
-
エクセル エラー438
-
Word2007数式でIMEオン/オフを...
-
VBA オブジェクトが空かどうか...
-
VBAでエクセルに入力された複数...
-
ある文字列が全て数字であるか...
-
VBAでWebページにセルの値を入力
-
VBでPDFファイルを編集する
-
エクセルマクロエラー「'Cells'...
-
Excel VBA オブジェクトマクロ ...
-
AccessVBAで「dim dbs as datab...
-
Excel VBA Collection.add で R...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
worksheetFunctionクラスのVloo...
-
「Columns("A:C")」の列文字を...
-
PowerPointVBAでスライドマスタ...
-
エクセルのVBAの標準モジュール...
-
Excelでフィルタをかけると警告...
-
実行時エラー 3265「要求された...
-
テキストボックス中の文字列の...
-
VBAからPDFファイルにパスワー...
-
VBAで既に開いている別アプリケ...
-
Excel VBAでIEにアクセスするプ...
-
オブジェクトが見つかりません
-
ExcelVBAでのNZ関数について
-
エクセルVBAでcode128のバー...
-
WordにOLEで埋め込んだExcelでW...
-
AccessVBAで「dim dbs as datab...
-
エクセルマクロエラー「'Cells'...
-
エクセル エラー438
-
[VBA]CDOメッセージ送信エラー
-
VBAで作成するメール(開封確認...
-
VBScriptでファイルの日時順(降...
おすすめ情報