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

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

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

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

2198閲覧

編集データの取り込みができない

yyy

総合スコア49

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

1クリップ

投稿2016/08/04 08:32

編集2016/08/04 08:34

###前提・実現したいこと
MDBファイルをVBに取込(バインド)し、データ編集の後で元データ(MDBファイル)に反映させる。
次に開くときには反映後の値が入っていてほしい。

###発生している問題・エラーメッセージ

データ反映動作後、MDBファイルを開くと編集データが入っているが、VBを実行すると編集前のデータが表示される。 (2度目以降にVBを開いたときに反映データを取り込めない)

###該当のソースコード(取込動作がおかしいので編集時コードは省略)

VB.NET

1Imports Microsoft.VisualBasic.ControlChars 2Imports System.Data.OleDb 3 4 5Public Class Form1 6 7 Private stFilePath As String = System.IO.Path.Combine(Application.StartupPath, "ツール.mdb") 8 Private Cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & stFilePath) 9 10 Private SQLCm As OleDbCommand = Cn.CreateCommand 11 Private Adapter As New OleDbDataAdapter(SQLCm) 12 Private Table As New DataTable 13 14 15 'Loadイベント 16 Private Sub form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 17 18 '自分で定義した列しかバインドしない 19 DataGridView1.AutoGenerateColumns = False 20 SQLCm.CommandText = "SELECT SELFLG, a, b, c, d, e, f, g, IDNo FROM tblL WHERE DELFLG <> TRUE" 21 22 Dim cb As New System.Data.OleDb.OleDbCommandBuilder() 23 Adapter.Fill(Table) 24 25 '▼値の表示 26 DataGridView1.DataSource = Table 27 28 'DataGridViewを常に編集モードにする 29 Me.DataGridView1.EditMode = DataGridViewEditMode.EditOnEnter 30 31 End Sub

MDBファイルに編集反映がされているということは、2度目の取込で思っているのと違う動作をしているのだと思うのですが、それがどの部分なのか見当が付きません。

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

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

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

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

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

guest

回答2

0

ベストアンサー

問題の現象を確認された際の操作の流れは
①VBでMDBを開く
②GridにMDBの内容が表示される(更新前の状態を表示)
③VB上からMDBを更新する
④VBを閉じる
⑤AccessでMDBを開く
⑥データが反映されている(更新後の状態を確認)
⑦再度VBでMDBを開く
⑧GridにMDBの内容が表示される(更新前の状態が表示される)

のような手順ではないかと読み取りましたが、あっていますでしょうか?

以下、上記手順であることを前提としたアドバイスです。


おかしいのは、⑥でAccess上でデータが更新されているのを確認できているのに、⑧では更新前の状態が表示されるという点ですよね。

④でVBを閉じているのなら、どこかに更新前のデータが残っていないことには⑧で表示することができません。

考えられる要因としては
・要因1:①で開いているMDBと③で更新しているMDBが異なり、⑤では更新している方のMDBを開いている
・要因2:②で表示しているテーブルと③で更新しているテーブルが異なり、⑥では更新されているテーブルを確認している
・要因3:⑥のAccessで確認した後、⑧のVBで表示するまでの間(例えばVB起動時)に、元データに戻す処理が行われている
・要因4:実は④のVB終了は行われておらず、⑧ではメモリ上から更新前データを表示している

あたりでしょうか。(考えれば他にもでてきそうですが。)


要因1・2では、単純に表示しているテーブルと確認しているテーブルが違うということになります。
更新時の処理については記載がないので何とも言えませんが、更新処理を確認する必要があります。

要因3は、データの初期化処理などで戻されていないか?ということですが、そんな処理があれば今回の現象では真っ先に疑われていることでしょうから、ちょっと考えにくいですよね。

要因4はそもそも前提から外れてしまっていますが、前回のバインド情報がそのまま表示されているのではないか?ということです。
通常はバインドしなおすことで解消するのではないかと思われます。

推測からのあてずっぽうなアドバイスばかりで恐縮ですが、解決の糸口になれば幸いです。

投稿2016/08/04 11:52

jawa

総合スコア3013

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

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

jawa

2016/08/04 13:08

もうひとつ気になる点がありました。 `Dim cb As New System.Data.OleDb.OleDbCommandBuilder()` で今回のAdapterを指定していないので、単純に新しいOleDbCommandBuilderを作成しています。 これを `Dim cb As New System.Data.OleDb.OleDbCommandBuilder(Adapter)` のように変更して今回のAdapterを指定してもだめでしょうか?
yyy

2016/08/05 00:27

わかりやすくまとめていただき、ありがとうございます! jawaさんに回答いただいて考えてみたところ、確かに動きがおかしくなったのはファイル参照先の書き方をかえてからだったと思いまして確認してみたところ、要因1・2に当てはまるようです。 フォームに参照ファイルを紐づけし、Application.StartupPathで参照場所を取ってきているつもりだったので、そこで問題が起こっているとは思いませんでした…。 ◎正常にできる Private Cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source = C:\Desktop\ツール.mdb") ×できない Private stFilePath As String = System.IO.Path.Combine(Application.StartupPath, "ツール.mdb") Private Cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & stFilePath) このような違いがあります。 まだどう直すと正しく動くか不明ですが、とにかくここが問題ということはわかりました。 いつもありがとうございます><
jawa

2016/08/05 01:22

手持ちのMDBファイルとVBで簡易的な環境を再現し、動作確認してみました。 こちらの環境では、提示いただいたソースのままではMDBが更新されませんでした。 その後、以下2点の改修により変更内容がMDBに反映されることを確認しました。 ①先に記述した`Dim cb As New System.Data.OleDb.OleDbCommandBuilder(Adapter)`への記述変更 ②ボタンを設置し、クリックイベントで ``` DataGridView1.EndEdit Adapter.Update(Table) ``` を実行する。 参考になれば幸いです。
yyy

2016/08/05 02:00

お手数おかけして申し訳ございません。 どうもFormに紐づけした”ツール.mdb”のプロパティ:出力ディレクトリにコピー が「常にコピー」になっていたため発生していたようです。 DebugモードでDebugフォルダに紐づけデータがコピーされ、編集後はこのデータを参照しているのですが、「常にコピー」に設定していたためVBを開くと紐づけされた方の元データが常に上書きされて、編集ができていないように見えていたみたいです。 (語彙力がなく、申し訳ないです・・・。) ①の記述変更はアドバイスに従い、追加いたしました! ②は、なくても動きが正常に見えるのでひとまず追加しないでおいてみます。 ありがとうございました。
guest

0

投稿2016/08/04 08:40

ttyp03

総合スコア16996

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

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

yyy

2016/08/04 08:45

回答ありがとうございます。 そのように思いますが…。 午前中くらいまでは思った通りに動いていたのです…。 SQL接続のUPDATE文などを弄ったらデータ反映に影響が出そうですし、そのあたり問題ないということは取込で何か余計なコードがあるのか(もしくは不足か)だと思ったのですが、よくわかりません…。
yyy

2016/08/05 00:29

そのようなメソッドもあるのですね!詳しく調べてみます! いえいえ、とんでもありません。アドバイスいただけるだけで有り難いですし、知らない情報(の方が多いですが)たくさん教えていただけるので非常に勉強になります。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問