おはようございます。
今回はVB.NETについて質問させてください。
【開発環境】
・VB.NET(Visual Studio2010)
・PostgreSQL8.3
・WindowsXP
【質問内容】
ある一定の操作をすると、
『この Command に関連付けられている DataReader が既に開かれています。このコマンドを最初に閉じる必要があります』
とエラーが出てしまい、例外で落ちてしまいます。
【落ちる原因の操作】
1.メインフレームを起動
2.親品番マスタから取得した親品番一覧を表示しているListViewの1件をダブルクリック
3.親品番に紐付いている子品番を品番テーブルから取得
4.表示内容の切り替えラジオボタンを全て⇒図面ありに変更
5.表示内容の切り替えラジオボタンを図面あり⇒全てに変更
6.表示内容の切り替えラジオボタンを全て⇒図面ありに変更
7.表示内容の切り替えラジオボタンを図面あり⇒全てに変更←ここで先ほどの例外が発生する。
【該当部分のソース】
Private Sub ArticleTableUpdate(ByVal sParents As String)
Dim articleResult As Odbc.OdbcDataReader ' 品番テーブル用
Dim articleSql As String
Dim zumenSql As String
Dim sChild As String
Dim articleCount As Integer
Dim zumenCount As Integer
Dim zumenFlag As String
' 品番テーブルからデータを取得するSQLを作成
articleSql = "SELECT * FROM ""ARTICLE_TBL"" WHERE ""P_ARTICLE_NUMBER"" = '" + sParents + "'"
Debug.WriteLine("【ArticleTableUpdate】 品番テーブルからデータを取得SQL:" + articleSql)
ODBCCommand.CommandText = articleSql
' 品番テーブルから該当の親品番のデータ件数を取得
'articleCount = ODBCCommand.ExecuteNonQuery()
' 品番テーブルに該当の親品番のデータが存在するか
'If articleCount = 0 Then
'Exit Sub
'End If
' 品番テーブルから該当の親品番のデータを取得
articleResult = ODBCCommand.ExecuteReader() ←ここで例外発生
' 取得した件数分処理
While articleResult.Read()
' 子品番データを取得
sChild = articleResult("C_ARTICLE_NUMBER").ToString
If sChild <> "" Then
' 子品番データをキーに図面マスタからデータを取得するSQLを作成
zumenSql = "SELECT * FROM ""ZUMEN_MST"" WHERE ""PLAN_NUMBER"" = '" + sChild + "'"
Else
sParents = articleResult("P_ARTICLE_NUMBER").ToString
zumenSql = "SELECT * FROM ""ZUMEN_MST"" WHERE ""PLAN_NUMBER"" = '" + sParents + "'"
End If
Debug.WriteLine("【ArticleTableUpdate】 図面マスタからデータを取得SQL:" + zumenSql)
ODBCCommand2.CommandText = zumenSql
' 図面マスタから該当の品番のデータの件数を取得
zumenCount = ODBCCommand2.ExecuteNonQuery
' 図面マスターに該当の品番のデータが存在するか
If zumenCount = 0 Then
' 図面データが存在しない為、更新値を0とする
zumenFlag = "0"
Else
' 図目データが存在する為、更新値を1とする
zumenFlag = "1"
End If
' 品番テーブルを更新するSQLを作成
zumenSql = "UPDATE ""ARTICLE_TBL"" " + vbCrLf + "SET " + vbCrLf +
vbTab + """C_ARTICLE_NUMBER"" = '" + sChild + "', " + vbCrLf +
vbTab + """PLAN_FLAG"" = '" + zumenFlag + "', " + vbCrLf +
vbTab + """UPDATE_DATE"" = '" + Today + "'" + vbCrLf +
"WHERE ""P_ARTICLE_NUMBER"" = '" + sParents + "'"
Debug.WriteLine("【ArticleTableUpdate】 品番テーブルを更新するSQL:" + zumenSql)
ODBCCommand2.CommandText = zumenSql
' 品番テーブルを更新
zumenCount = ODBCCommand2.ExecuteNonQuery()
End While
articleResult.Close()
ODBCCommand = New Odbc.OdbcCommand
ODBCCommand.Connection = ODBCSession
End Sub
【DB接続関数】
Public Function ODBC_CONNECT() As Boolean
' 戻り値をセット
ODBC_CONNECT = False
If ConnectFlag = False Then
Try
ODBCSession = New Odbc.OdbcConnection
ODBCCommand = New Odbc.OdbcCommand
ODBCCommand2 = New Odbc.OdbcCommand
' データベース接続情報
ODBCSession.ConnectionString = "Provider=MSDASQL;DSN=HOGE;UID=hogeU;PWD=hogeP;"
ODBCCommand.Connection = ODBCSession
ODBCCommand2.Connection = ODBCSession
' データベースに接続
ODBCSession.Open()
ConnectFlag = True
ODBC_CONNECT = True
Catch
Debug.WriteLine("えらー")
End Try
End If
End Function
今のところ、このエラーが発生した場合、再起動すると発生しなくなるみたいです。(たまたまそうなったのかもしれません)
何か原因がわかる方、ご教授お願い致します。
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
プログラムの造りが悪いです
行儀が悪いプログラムです。
ODBCSession ODBCCommand ODBCCommand2 をグローバルで定義して
(使いまわして)いるので、自分が使ったら、次の処理のためにそれぞれの
後始末をしてやる必要があります。
ArticleTableUpdate 以外でも使っているのであれば、そっちに問題が
あったときにどうしようもないです。
他人のふんどしを使っているというか、他人任せ、直前の処理に依存。
しかも依存する利点は無いという。。。
当の ArticleTableUpdate 内部の処理でもエラートラップされていないし、
処理が終わって New するくらいなら、自分が使う前にやればいいのに。
もしかしてこれを後始末だと思っているんでしょうか?
次の処理の準備までは出しゃばるけど、実際の処理までは面倒見れない
とか、余計なお世話でしかありません。
関数を分ける実力が無さそうなので、1つの関数で
・データベースに接続(インスタンスの生成からローカルで行い、グローバル
な変数を使わない)
・SQLで処理
・データベースから切断(接続を閉じた後、使ったインスタンスも破棄)
と行儀よくきちんと閉じるように、
最初から最後まで自分の関数内で面倒を見た方がいいのでは?
ありがとうございます。
確かに別の関数が原因でした。
元のプログラム(VB6)からのバージョンアップって事で、元のソースからこんなつくりでした(言い訳にしかならないですけど。)
エラートラップのは、別クラス?のを使いまわししていてvisual stduio2010で元のソースをアップグレードしたらエラーになった為にはずしただけです。
これで完成というわけではありません。(これも言い訳ですが。)
私はどちらかというと、動けば良いという考えの人間なので、行儀の良いとかはよくわかりません。
ちゃんとお金が発生するなら上の人・先輩等に聞きますが、発生しているわけではないので別にいいかなーと。
後でレビューした時に一杯言われますしね。
MARU4812さんがおっしゃったような事は少なからず言われるでしょうから、レビュー前に直します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- その他(Microsoft Office) マクロVBAについて 1 2022/09/06 18:12
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- Visual Basic(VBA) 別シートのデータを参照して値を入れたい。 まとめデータシートのC列D列の値を商品一覧シートのコードが 7 2022/08/17 13:20
- Visual Basic(VBA) 貼り付けた値が消えていく 以下はソースファイルの2番目のシートのB6から最終行を取得 ターゲットファ 2 2023/07/27 12:23
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
複数SQL発行について
Visual Basic(VBA)
-
VB.NETで DataRow()を利用して、値からコードを取得したい。
Visual Basic(VBA)
-
.NET SqlDataReader のレコード有無判定
Visual Basic(VBA)
-
-
4
VB.net 任意の例外を発生させるには・・・
Visual Basic(VBA)
-
5
SQLで同じDBに対し2つのコネクションをもてる?
SQL Server
-
6
String"から型'Double'への変換は無効です。 とエラーが出ます。
Visual Basic(VBA)
-
7
「タイプ初期化子が例外をスローしました」エラー何?
Visual Basic(VBA)
-
8
CloseとDisposeの違い
Visual Basic(VBA)
-
9
小数点を含む数値かどうか判断の判断方法
Visual Basic(VBA)
-
10
共通モジュールでDBへの接続と利用方法
Visual Basic(VBA)
-
11
文字列の後ろから必要分だけ削除したい。
Visual Basic(VBA)
-
12
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
13
VB.NETでMessageBoxを表示したいのですが
その他(プログラミング・Web制作)
-
14
IISでローカル内からhttp://localhostと入れても表示されない
Microsoft ASP
-
15
FORMが開いているかどうかの確認方法
Visual Basic(VBA)
-
16
SQL Server時間切れについて
SQL Server
-
17
一つのトランザクションでSELECTとUPDATEできますか? (ADO.NET)
SQL Server
-
18
Unionの結果全体をOrder By したい。
SQL Server
-
19
C#で構造体の配列を持った構造体を使いたいのですが
C言語・C++・C#
-
20
VB.NETで他のプロジェクトで作成したフォームを使う方法
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Formのデータが欠落することがある
-
login,logoutのできるページ
-
フォーム上で押されたボタンに...
-
「<c:forEach タグが終了し...
-
jspからServletを呼び、元のjsp...
-
漏電遮断器の黄色ボタンと白色...
-
すき家のハンディ操作
-
struts-config.xmlの設定
-
腕時計の時報をならないように...
-
NetworkStreamからのRead()で、...
-
エラーページ遷移後に入力値を残す
-
エレベーターの途中通過
-
フォームで同じ複数のnameで違...
-
ServletからServletへの値渡し
-
[Struts]Action定義内のinput属...
-
VBAでTIFF画像を読み込むには?
-
checkboxのvalue値を動的にしたい
-
ActiveWorkbook.Pathの一つ下の...
-
C言語で今まで表示していた画面...
-
JSPでのリストボックス表示
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.NET DataReaderが開かれている
-
Formのデータが欠落することがある
-
JavaScriptとACCESSデータベー...
-
DBNULLについて
-
dbからデータをとりだす際、sql...
-
C言語からデータベースにアクセス
-
struts 2つの選択肢(selec...
-
「XML over HTTP」「非同期HTTP...
-
三菱GOTの画面切り替えについて
-
リクエストに応じたselectedの...
-
フォーム上で押されたボタンに...
-
腕時計の時報をならないように...
-
ボタンが活性化の場合とは、ボ...
-
VB6 開発環境のエディタに行...
-
C# ログイン画面からメイン画面...
-
C言語で今まで表示していた画面...
-
フォームで同じ複数のnameで違...
-
画面遷移を行わずに同一ページ...
-
jspからServletを呼び、元のjsp...
-
int型の内容をbyteの配列にコピー
おすすめ情報