質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Visual Basic .NET

Microsoft Visual Basic .NET (VB.NET)とはオブジェクト志向のプログラム言語です。 Microsoft"s Visual Basic 6 のバージョンアップとしてみることができますが、Microsoft.NET Frameworktによって動かされています。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

1回答

229閲覧

Accessを扱うVB.netのプログラムでエラーがでます。

mononga

総合スコア5

Visual Basic .NET

Microsoft Visual Basic .NET (VB.NET)とはオブジェクト志向のプログラム言語です。 Microsoft"s Visual Basic 6 のバージョンアップとしてみることができますが、Microsoft.NET Frameworktによって動かされています。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2024/01/29 01:46

編集2024/01/29 02:38

実現したいこと

Windows7のPCで使っていたVB.netのアプリケーションを、Windows10に移管したい

処理内容
いくつかのクエリを実行してテーブルの初期化やデータのクリアを行う。
T発注明細中間 テーブルからデータを取得し、 T発注明細 テーブルに挿入しています。
MT変換 テーブルを検索し、変換が存在しない場合はエラー処理を行っています。
エラー処理 (エラー出力 メソッド):

エラーが発生した場合、エラー情報を Tエラー テーブルに挿入しています。
フォームのクロージングイベント (Fチェック_FormClosing):

フォームが閉じる際にデータベース接続を閉じています。
このプログラムは、データベース内のテーブル間でデータをコピーし、一部の変換を行いながらエラーチェックを行っているようです。エラーが検出されると、エラーテーブルにエラー情報が挿入されます。最終的には、エラーがなければ「チェック完了」メッセージが表示され、フォームが閉じられます。

発生している問題・分からないこと

前任が作成したプログラムの修正をしていますが、Fチェック_Loadの最初のループ内の” olecmd.ExecuteNonQuery()”でエラーが発生します。

環境
Visual Stusio2022
.Net Framework 4.8
Microsoft Access2021(32bit)

エラーメッセージ

error

1このコマンドに関連付けられている DataReader が既に開かれています。 このコマンドを最初に閉じる必要があります。

該当のソースコード

VB.net

1Imports System.Data.OleDb 2 3Public Class Fチェック 4 Private olecn As OleDb.OleDbConnection 5 Private olecmd As OleDb.OleDbCommand 6 Private olecmd1 As OleDb.OleDbCommand 7 Private olecmd2 As OleDb.OleDbCommand 8 Private oleadp As OleDb.OleDbDataAdapter 9 Private dts As DataSet 10 Private dr As OleDb.OleDbDataReader 11 Private dr1 As OleDb.OleDbDataReader 12 Private dr2 As OleDb.OleDbDataReader 13 14 Private NullObj As Object 15 16 Dim チェックOK As Boolean 17 Dim Lエラー名 As String 18 Dim IN件数 As Double 19 Dim OT件数 As Double 20 Dim xconnection As String 21 22 Dim L発注部署 As String 23 Dim L注文番号 As String 24 Dim L注文日付 As String 25 Dim L顧客コード As String 26 Dim L顧客名 As String 27 Dim L顧客支店名 As String 28 Dim L摘要 As String 29 Dim L発注元電話 As String 30 Dim L発注元FAX As String 31 Dim L担当者 As String 32 Dim L納入先コード As String 33 Dim L納入先名 As String 34 Dim L納入先支店名 As String 35 Dim L納入先県名 As String 36 Dim L納入先住所1 As String 37 Dim L納入先住所2 As String 38 Dim L納入先電話 As String 39 Dim L納入先郵便番号 As String 40 Dim LT商品コード As String 41 Dim L品名 As String 42 Dim L納期 As String 43 Dim L発注単位 As String 44 Dim L発注数 As Double 45 Dim L単価 As Double 46 Dim L金額 As Double 47 Dim L予備1 As String 48 Dim L予備2 As String 49 Dim Lチェック As String 50 Dim L済 As String 51 Dim LK得意先コード As String 52 Dim LK支店コード As String 53 Dim LK納入先コード As String 54 Dim LK商品コード As String 55 Dim LK注文番号 As String 56 57 Private Sub Fチェック_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing 58 olecn.Close() 59 End Sub 60 61 Private Sub Fチェック_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 62 63 xconnection = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source = " & "C:\EDI\TDAT.MDB" 64 65 Application.DoEvents() 66 67 olecn = New OleDb.OleDbConnection(xconnection) 68 olecn.Open() 69 70 olecmd = olecn.CreateCommand 71 olecmd1 = olecn.CreateCommand 72 olecmd2 = olecn.CreateCommand 73 Dim 開始 As Boolean 74 75 olecmd1.CommandText = "DELETE FROM T発注明細 WHERE 済 = '1' " 76 olecmd1.ExecuteNonQuery() 77 78 olecmd1.CommandText = "DELETE FROM Tエラー " 79 olecmd1.ExecuteNonQuery() 80 81 チェックOK = True 82 開始 = True 83 IN件数 = 0 84 OT件数 = 0 85 86 olecmd.CommandText = "SELECT * FROM T発注明細中間 " 87 88 dr = olecmd.ExecuteReader 89 90 Do While dr.Read = True 91 olecmd.CommandText = "INSERT INTO T発注明細 " 92 93 olecmd.CommandText = olecmd.CommandText & "(発注部署,注文番号,注文日付,顧客コード,顧客名,顧客支店名,摘要," 94 olecmd.CommandText = olecmd.CommandText & "発注元電話,発注元FAX,担当者,納入先コード,納入先名,納入先支店名,納入先県名," 95 olecmd.CommandText = olecmd.CommandText & "納入先住所1,納入先住所2,納入先電話,納入先郵便番号,T商品コード," 96 olecmd.CommandText = olecmd.CommandText & "品名,納期,発注単位,発注数,単価,金額,予備1,予備2,チェック,済," 97 olecmd.CommandText = olecmd.CommandText & "K得意先コード,K支店コード,K納入先コード,K商品コード,K発注番号) " 98 olecmd.CommandText = olecmd.CommandText & " VALUES " 99 olecmd.CommandText = olecmd.CommandText & "('" & dr("発注部署") & "'," 100 olecmd.CommandText = olecmd.CommandText & "'" & dr("注文番号") & "'," 101 olecmd.CommandText = olecmd.CommandText & "'" & dr("注文日付") & "'," 102 olecmd.CommandText = olecmd.CommandText & "' '," 103 olecmd.CommandText = olecmd.CommandText & "'" & dr("顧客名") & "'," 104 olecmd.CommandText = olecmd.CommandText & "'" & dr("顧客支店名") & "'," 105 olecmd.CommandText = olecmd.CommandText & "'" & dr("摘要") & "'," 106 olecmd.CommandText = olecmd.CommandText & "'" & dr("発注元電話") & "'," 107 olecmd.CommandText = olecmd.CommandText & "'" & dr("発注元FAX") & "'," 108 olecmd.CommandText = olecmd.CommandText & "'" & dr("担当者") & "'," 109 olecmd.CommandText = olecmd.CommandText & "' '," 110 olecmd.CommandText = olecmd.CommandText & "'" & dr("納入先名") & "'," 111 olecmd.CommandText = olecmd.CommandText & "'" & dr("納入先支店名") & "'," 112 olecmd.CommandText = olecmd.CommandText & "'" & dr("納入先県名") & "'," 113 olecmd.CommandText = olecmd.CommandText & "'" & dr("納入先住所1") & "'," 114 olecmd.CommandText = olecmd.CommandText & "'" & dr("納入先住所2") & "'," 115 olecmd.CommandText = olecmd.CommandText & "'" & dr("納入先電話") & "'," 116 olecmd.CommandText = olecmd.CommandText & "'" & dr("納入先郵便番号") & "'," 117 olecmd.CommandText = olecmd.CommandText & "'" & dr("T商品コード") & "'," 118 olecmd.CommandText = olecmd.CommandText & "'" & dr("品名") & "'," 119 olecmd.CommandText = olecmd.CommandText & "'" & dr("納期") & "'," 120 olecmd.CommandText = olecmd.CommandText & "'" & dr("発注単位") & "'," 121 olecmd.CommandText = olecmd.CommandText & "" & dr("発注数") & "," 122 olecmd.CommandText = olecmd.CommandText & "" & dr("単価") & "," 123 olecmd.CommandText = olecmd.CommandText & "" & dr("金額") & "," 124 olecmd.CommandText = olecmd.CommandText & "'" & dr("予備1") & "'," 125 olecmd.CommandText = olecmd.CommandText & "'" & dr("予備2") & "'," 126 olecmd.CommandText = olecmd.CommandText & "'0'," 127 olecmd.CommandText = olecmd.CommandText & "'0'," 128 olecmd.CommandText = olecmd.CommandText & "'" & dr("K得意先コード") & "'," 129 olecmd.CommandText = olecmd.CommandText & "'" & dr("K支店コード") & "'," 130 olecmd.CommandText = olecmd.CommandText & "'" & dr("K納入先コード") & "'," 131 olecmd.CommandText = olecmd.CommandText & "'" & dr("K商品コード") & "'," 132 olecmd.CommandText = olecmd.CommandText & "'" & dr("K発注番号") & "')" 133 134 olecmd.ExecuteNonQuery() 135 Loop 136 137 dr.Close() 138 139 olecmd1.CommandText = "DELETE FROM T発注明細中間 " 140 olecmd1.ExecuteNonQuery() 141 142 olecmd.CommandText = "SELECT * FROM T発注明細 WHERE 済 = '0' AND チェック = '0'" 143 dr = olecmd.ExecuteReader 144 145 Do While dr.Read = True 146 IN件数 = IN件数 + 1 147 T件数.Text = IN件数 148 Application.DoEvents() 149 150 olecmd2.CommandText = "SELECT * FROM MT変換 " 151 olecmd2.CommandText = olecmd2.CommandText & " WHERE " 152 olecmd2.CommandText = olecmd2.CommandText & "K営業所コード='" & dr("発注部署") & "' AND " 153 olecmd2.CommandText = olecmd2.CommandText & "K得意先コード='" & dr("K得意先コード") & "' AND " 154 olecmd2.CommandText = olecmd2.CommandText & "K得意先支店コード='" & dr("K支店コード") & "' AND " 155 olecmd2.CommandText = olecmd2.CommandText & "K納入先コード='" & dr("K納入先コード") & "' AND " 156 olecmd2.CommandText = olecmd2.CommandText & "K商品コード='" & dr("K商品コード") & "' " 157 dr2 = olecmd2.ExecuteReader 158 If dr2.Read = False Then 159 Lエラー名 = "変換エラー" 160 チェックOK = False 161 Call エラー出力() 162 Else 163   ~略~ 164 End If 165 dr2.Close() 166 Loop 167 dr.Close() 168 If チェックOK = False Then 169 MsgBox("エラーがあります,訂正してください") 170 Call エラー表示() 171 End If 172 173 MsgBox("チェック完了") 174 175 176 Me.Close() 177 End Sub

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

ChatGPTに聞いて
DataReaderのClose処理が必要との事で、”dr = olecmd.ExecuteReader”、"dr.Close()"をループ内に書き換える、OleDbConnectionを複数用意する(olecn1,olesn2)
など試しましたがエラーが解消しなかった為、方法ご教示頂けますと幸いです。

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

一つ目のループの中のolecmdをolecmd1かolecmd2に変更しては?

olecmdでテーブルを開いているのに、そのコマンドで処理しようとしているからエラーなのでは。

投稿2024/01/29 13:40

xail2222

総合スコア1497

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mononga

2024/01/30 02:38

ループ内をolecmd1に書き換えたところ、動きました!ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問