おはようございます。
今回は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も見ています
-
外出時に「待たせる妻」vs イライラする「待つ夫」は日本だけ?見習いたい海外事情
夫の家事参加に積極的なイメージのある海外でも、同様の事例はあるのか。結婚カウンセラーの佐竹悦子さんに伺ってみた。
-
複数SQL発行について
Visual Basic(VBA)
-
VB.NETで DataRow()を利用して、値からコードを取得したい。
Visual Basic(VBA)
-
共通モジュールでDBへの接続と利用方法
Visual Basic(VBA)
-
-
4
.NET SqlDataReader のレコード有無判定
Visual Basic(VBA)
-
5
VB.net 任意の例外を発生させるには・・・
Visual Basic(VBA)
-
6
SQLで同じDBに対し2つのコネクションをもてる?
SQL Server
-
7
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
8
小数点を含む数値かどうか判断の判断方法
Visual Basic(VBA)
-
9
String"から型'Double'への変換は無効です。 とエラーが出ます。
Visual Basic(VBA)
-
10
CloseとDisposeの違い
Visual Basic(VBA)
-
11
「タイプ初期化子が例外をスローしました」エラー何?
Visual Basic(VBA)
-
12
FORMが開いているかどうかの確認方法
Visual Basic(VBA)
-
13
IISでローカル内からhttp://localhostと入れても表示されない
Microsoft ASP
-
14
Unionの結果全体をOrder By したい。
SQL Server
-
15
コンボボックスの開いたリストを閉じるには
Access(アクセス)
-
16
SQL Server時間切れについて
SQL Server
-
17
一つのトランザクションでSELECTとUPDATEできますか? (ADO.NET)
SQL Server
-
18
count集計の結果が0の場合でも表示したい
SQL Server
-
19
VB.NETで他のプロジェクトで作成したフォームを使う方法
Visual Basic(VBA)
-
20
VB.NETでコンボボックスの1行目を空白にしたい
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Formのデータが欠落することがある
-
VB.NET DataReaderが開かれている
-
DBNULLについて
-
JavaScriptとACCESSデータベー...
-
三菱GOTの画面切り替えについて
-
フォーム上で押されたボタンに...
-
リクエストに応じたselectedの...
-
C言語で今まで表示していた画面...
-
腕時計の時報をならないように...
-
漏電遮断器の黄色ボタンと白色...
-
ボタンが活性化の場合とは、ボ...
-
「<c:forEach タグが終了し...
-
Strutsで画面遷移させない。
-
FormのsubmitでFormの内容がnull
-
C# ログイン画面からメイン画面...
-
[JSP]1Servletから複数フレーム...
-
このadidasの腕時計の時刻の設...
-
j-axis 腕時計のアラーム止めたい
-
EXCEL VBAで、EXCELの入力規則...
-
Servletへフォームから配列を送...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.NET DataReaderが開かれている
-
Formのデータが欠落することがある
-
DBNULLについて
-
JavaScriptとACCESSデータベー...
-
dbからデータをとりだす際、sql...
-
C言語からデータベースにアクセス
-
struts 2つの選択肢(selec...
-
「XML over HTTP」「非同期HTTP...
-
Column名を変えた時のUpdate文...
-
JSP データベースへの数回の接続
-
三菱GOTの画面切り替えについて
-
腕時計の時報をならないように...
-
htmlで<form>~</form>を並べて...
-
画面遷移を行わずに同一ページ...
-
プログラミングで例えばゲーム...
-
ボタンが活性化の場合とは、ボ...
-
フォーム上で押されたボタンに...
-
ActiveWorkbook.Pathの一つ下の...
-
リクエストに応じたselectedの...
-
フロントエンドフレームワーク...
おすすめ情報