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

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

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

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

VB.NET

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

Q&A

解決済

2回答

10437閲覧

dataTableを用いて mdbファイル上のデータを更新したい(datatableは更新されるものの)mdbは変わっていない

VB_Beginner

総合スコア19

Access

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

VB.NET

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

0グッド

0クリップ

投稿2017/05/01 03:04

mdbをデータソースとして、dataTableに読み込み、UI側から消したい行を選び、削除する。
たったこれだけなのですが、希望通りにmdbに変更はかかってくれず困っております。

Public Class form1 'コネクション Private m_Conn As System.Data.OleDb.OleDbConnection

このようにインスタンス変数としてコネクションは宣言しておき

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim ConnectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & System.Windows.Forms.Application.StartupPath & "\" & m_strDataFile m_Conn = New System.Data.OleDb.OleDbConnection(ConnectionString) m_Conn.Open()

このようにformのロード時にDBを開き、formclosingの際にm_Conn.close()しています。

特定の値をキーにコントロールに値を読み込み表示させ、ユーザが削除ボタンを押した際には
データに消えて欲しいので、datatableの該当レコードを読み込み

result = juchuDt.Select("XXX_DENNO=" & denNum) For Each a As DataRow In result a.Delete() a.AcceptChanges() Next juchuDt.AcceptChanges() adpt.Update(result)

debuggerからjuchuDt.countを見ると確実に減っています。
juchuDt.Select("XXX_DENNO=" & denNum)で指定の番号でSELECTをかけてもDataTableには存在しません。

そしてこのままフォームをクローズする際にコネクション(m_Conn)を.close()して終わらせます。
そして、また開くとデータが存在しているのです(上記codeを実行後も、別のデータを参照した時も消したデータはデータテーブルから消えていたのに、です)

色々検索してみましたが、DataSet.AcceptChanges()で、変更はデータセットのすべてのテーブルのすべての行にコミットされます。と明記されているので上記コードだとadpt.Update(result)で更新されると思ったのですが何か理解していない点があるのでこういう結果を招いていると思います。
不思議なことに、レコード新規登録時のjuchuDt.Rows.Add(wr)はmdbファイルに実際に更新を掛けます。
どなたか心当たりのあるから、ご教授いただけませんでしょうか。よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

Windows Forms アプリですよね?

できれば一度 Visual Studio のウィザードを使って定番の構成のアプリを作ってみてはいかがでしょう。

以下のチュートリアルは DB が SQL Server の場合ですが、Access でも同様なことができます。

チュートリアル : データベースへのデータの保存 (単一テーブル)
https://msdn.microsoft.com/ja-jp/library/0f92s97z(v=vs.120).aspx

10 行でズバリ !! 非接続型のデータ アクセス (ADO.NET) (C#)
https://code.msdn.microsoft.com/windowsdesktop/10-ADONET-C-cbfe7688

上記のチュートリアルのように Visual Studio のデータソース構成ウィザードを利用して型付 DataSet + TableAdapter を作って、それを利用してアプリを作ると、以下のページの図のような構造のアプリが、ほとんど自分でコードを書くこと無しに作れます。

Windows フォーム アプリケーションでのデータへの接続
https://msdn.microsoft.com/ja-jp/library/wxt2cwcc(v=vs.120).aspx

操作に慣れると 10 分もかからず作れるはずです。今回のような問題に悩むことはなくなり、開発工数は激減するはずです。保守工数も減るはずです。お試しください。

投稿2017/05/01 03:37

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

Updateメソッドは削除マークをつけているデータをDBから削除し、同時に削除マークをつけているデータを削除します。
AcceptChangesメソッド を実行すると削除マークをつけているデータを削除します。
Updateメソッド を呼び出した時点で、削除マークをつけているデータが無いので削除されません。

投稿2017/05/01 03:18

hihijiji

総合スコア4150

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

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

VB_Beginner

2017/05/01 03:45

結論から申しますと、MDBファイルは更新されました。 削除したい、変更したいrowに対してDeleteかけてそこにacceptChangesをかけてしまうと updateメソッドがコールされた時点でrowstateが0になってるので更新されないのだと認識しました。 rows.removeするかrows.deleteしてacceptChangesをコールする というような内容バカリが検索で見つかっていたので深く考えることなく、それにならってコードを書いていました。 とてもありがとうございます。助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問