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

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

ただいまの
回答率

89.21%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,186

yyy

score 45

前提・実現したいこと

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

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

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

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

Imports Microsoft.VisualBasic.ControlChars
Imports System.Data.OleDb


Public Class Form1

    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)

    Private SQLCm As OleDbCommand = Cn.CreateCommand
    Private Adapter As New OleDbDataAdapter(SQLCm)
    Private Table As New DataTable


    'Loadイベント
    Private Sub form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        '自分で定義した列しかバインドしない
        DataGridView1.AutoGenerateColumns = False
        SQLCm.CommandText = "SELECT SELFLG, a, b, c, d, e, f, g, IDNo FROM tblL WHERE DELFLG <> TRUE"

        Dim cb As New System.Data.OleDb.OleDbCommandBuilder()
        Adapter.Fill(Table)

        '▼値の表示
        DataGridView1.DataSource = Table

        'DataGridViewを常に編集モードにする
        Me.DataGridView1.EditMode = DataGridViewEditMode.EditOnEnter

    End Sub

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

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 22:08

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

    これを
    `Dim cb As New System.Data.OleDb.OleDbCommandBuilder(Adapter)`
    のように変更して今回のAdapterを指定してもだめでしょうか?

    キャンセル

  • 2016/08/05 09: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)

    このような違いがあります。
    まだどう直すと正しく動くか不明ですが、とにかくここが問題ということはわかりました。
    いつもありがとうございます><

    キャンセル

  • 2016/08/05 10:22

    手持ちのMDBファイルとVBで簡易的な環境を再現し、動作確認してみました。

    こちらの環境では、提示いただいたソースのままではMDBが更新されませんでした。

    その後、以下2点の改修により変更内容がMDBに反映されることを確認しました。
    ①先に記述した`Dim cb As New System.Data.OleDb.OleDbCommandBuilder(Adapter)`への記述変更
    ②ボタンを設置し、クリックイベントで
    ```
    DataGridView1.EndEdit
    Adapter.Update(Table)
    ```
    を実行する。

    参考になれば幸いです。

    キャンセル

  • 2016/08/05 11:00

    お手数おかけして申し訳ございません。

    どうもFormに紐づけした”ツール.mdb”のプロパティ:出力ディレクトリにコピー
    が「常にコピー」になっていたため発生していたようです。
    DebugモードでDebugフォルダに紐づけデータがコピーされ、編集後はこのデータを参照しているのですが、「常にコピー」に設定していたためVBを開くと紐づけされた方の元データが常に上書きされて、編集ができていないように見えていたみたいです。
    (語彙力がなく、申し訳ないです・・・。)

    ①の記述変更はアドバイスに従い、追加いたしました!
    ②は、なくても動きが正常に見えるのでひとまず追加しないでおいてみます。
    ありがとうございました。

    キャンセル

0

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/04 17:45

    回答ありがとうございます。
    そのように思いますが…。
    午前中くらいまでは思った通りに動いていたのです…。

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

    キャンセル

  • 2016/08/04 18:13

    フォームを閉じるときにEndEditを呼ぶとかですかねぇ。
    https://msdn.microsoft.com/ja-jp/library/ms158620(v=vs.110).aspx
    すみません、環境がないので適当です。

    キャンセル

  • 2016/08/05 09:29

    そのようなメソッドもあるのですね!詳しく調べてみます!

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

    キャンセル

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

  • ただいまの回答率 89.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる