« blogが使いにくいわけ | メイン | MovableTypeでデーサイを作ろう »

2006年05月26日

VC#2005 のデータベース不具合 [C#]


現在 Visual C# 2005 Express Edition でデータベースプログラミングをしている。しかし DataSet 内で更新したレコードが、データベースに上手く反映されないという不具合に悩まされている。データベースは Access の MDB 形式、データプロバイダは .NET Framework OLE DB を通して Jet を呼び出している形だ。

ADO.NET になってから、オブジェクト上でレコードを書き換えても直接データベースには反映されなくなった。適切な処理をした後 TableAdapter の Update メソッドを呼び出すことによって、初めてデータベースに変更が書き込まれる。変更前と変更後のテーブルをマージして適切に Update 句や Delete 句を実行してくれるというのだから親切な設計だ。

しかし何故か私の PC に入っている VC# では、ちゃんと更新ロジックを書いているのにも関わらずレコードに反映されないのだ。

今年の初めに VC# 2005 をダウンロードしてから、その点がずっと引っ掛かっていた。そのためにまともなデータベースアプリが作れないでいたのだ。手順もコードも、MicroSoftのドキュメントのチュートリアル通りにやっている。でも駄目なのだ。

しかしその解決策をやっと見つけることができた。「リンクされたテーブルにすればいい」というのが、私が見つけた解決策だ。たまたま色々弄っているうちに見つけた方法で、最初はどうにも信じられなかった。

リンクされたテーブル

[外部テーブルの読み込み]→[テーブルのリンク]メニューから作成したリンクテーブルは、なぜか Update メソッドで更新が反映される。他は何も変えていない。ただもう一つデータベースファイルを作って、そこから元データベースに対するリンクテーブルを作っただけだ。にもかかわらず、きちんと元テーブルのレコードまで更新されている。これは一体どういうことだろうか。

これが逆ならまだ納得できるのだが、リンクテーブルだけというのは全く意味不明の現象だ。技術的にはむしろ複雑になっていると思うのに。とりあえずMDBファイルを2つ作ってアプリを構築中だが、なんだか気持ち悪くて仕方が無い。私だけの問題なのか、ExpressEditoinだからなのか、完全に仕様なのか全くわからない。

もしこの点でなにか解決策とか知っている方おられましたら、情報提供お願いします。

投稿者 : 18:14 | コメント (2) | トラックバック (0)

トラックバック

このエントリーのトラックバックURL:
http://totora.jpn.org/mt/mt-tb.cgi/142

コメント

似たような事象に会い、検索したところこちらに
たどり着きました。調べた結果ひとつ判明したことがあるので
お知らせします。

MDBファイルがプロジェクト内にコピーされていませんか?
データソースを追加するときにファイルをコピーするか
聞かれますが、このとき「はい」を選ぶと、
データベースファイルはまずプロジェクトのフォルダに
コピーされ、実行する度にここからbin\debugフォルダなどに
コピーされます。
なので、次回実行したときにデータベースが元に戻った
ように感じます。

「リンクならOK」というのは、上書きされるのがデータの
あるMDB本体ではないから かと思います。
外していたらごめんなさい。

投稿者 EIJI : 2006年07月20日 14:00

なるほどー。
コピーされているというのは盲点でした。
情報ありがとうございます。

投稿者 無重力 : 2006年09月24日 18:26

コメントしてください




保存しますか?

(書式を変更するような一部のHTMLタグを使うことができます)