2012年11月22日木曜日

データベースの修正をデータセットに反映させる

VB.NET(VS2010)でデータベース(SQL Server 2008 R2)を扱うアプリケーションを作成しています。.NETのデータベース関連のコーディング作法がやっとわかったようなわからないような……。

.NET(Framework 2.0以降だっけ?)に特有のデータベース処理として、データベースを直接操作せずに、プロジェクト内に用意したデータベースのローカルキャッシュであるデータセットというのを使ってそれに対していろいろ操作して、最後に元のデータベースに更新を反映させるという、そういう処理があります。って説明あってるのかこれw まぁ要するにデータセットというオブジェクトがありますね。あるの知ってる人は続きを読んでくださいw

で、データセットに、だいたいはテーブルを元のデータベースからコピペして追加します(って自分はそうしてるんだけど、他に一般的なやり方あったらすいませんw)。
しかしそれを使って開発進めてる途中で、データベースのテーブルに足りないフィールドに気がついて追加したり、フィールドの名前を変更したりとか結構あるわけです(ない?w)。そんなとき、例えば元のテーブルにフィールドを追加した後、データセットのそのテーブルにはフィールドの追加が反映されるわけではないんですね。最初わかんなかったので勝手に追加されるもんだと思ってたんですがw
でも当然データベースの実情とデータセットの状態が違ってると動かないわけで、データセットのテーブルに新規の列(フィールド)を追加して、名前その他のプロパティをちまちま変更して元のテーブルのフィールドと合わせる……ということをやってたんですが、フィールド数多いときとか大変だし、ちょっと間違えるとテーブルアダプタとかいろいろエラーになっちゃうときもあるので、いったん作成したデータセットを削除して、テーブル全体を再度コピーしてテーブルごとデータセット作り直したりしてw クエリ大量に作成したりしてるとこれもめんどくさいし……。

そんなこんなでいろいろめんどいなーと思ってたんですが、最近ふと、そんなことしなくてもデータベースの修正を反映させられる方法が見つかりましたのでメモがてら書いておきます。いやホントはヘルプとかMSDNのどこかに書いてあるんだろうとは思うんだけど見つけられなかったのでw

とりあえずフィールドを追加・削除した場合の話です。なんかフィールド長だけ変更したとか、そういうのはこれでは反映されないっぽいのでプロパティで変更してください(それもやり方あるんだったら知りたいですけどw)。

データベースのテーブルにフィールド "Hogehoge" を追加しました。データセットデザイナの方でテーブルを見ても当然まだこのフィールドは列の一覧に表示されていません。ここでテーブルアダプタのクエリを見ます。"Fill,GetData()" というのはデフォルトで作成されていて必ずあるのでこれを右クリックして[構成]を選択。このクエリのSQLステートメントが表示されますが、これってこのテーブルの全件の全フィールドを選択するというものですね。ここで[クエリビルダー]をクリック。Accessでクエリ作成するときに見慣れたあの画面が出てきます。ここで上のテーブルのハコに表示されてるはずの列一覧を見ます。するとなんとここには "Hogehoge" が表示されてる! ここの情報はデータベース直接見に行ってるんですね。しかし "Hogehoge" にはチェックがついてなくて、要はFillの選択対象になってないわけです。ここでチェックをつけます。
(逆に削除したフィールドの場合は、ここで真ん中の列名と処理のリストのところを見ると、削除したフィールドは列名に表示されているけどテーブル名が不明になってるはずです。確認したらこのフィールドの行を選択して削除します。)
[OK]をクリックするとさっきのSQLステートメントの表示画面に戻ります。ここでよく見るとSELECTのフィールド名が追加(削除)されてるはずなので、確認したら[完了]をクリック。
ここで再度テーブルの列を見ると、たぶん末尾だと思いますが "Hogehoge" がちゃんと追加されてますよ! めでたしめでたし。なんか書くと長くなっちゃいましたが、操作は簡単なのでお試しください。そんなの知ってたという方は、よろしければMSDNのどこに書いてあったかコメントにURL貼っていただけるとうれしいですw よろしくお願いします。