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 よろしくお願いします。
2012年11月22日木曜日
2012年10月22日月曜日
マイクロソフトのUI標準ガイドみたいなのどこだっけ
業務アプリのフォーム設計を修正するにあたって、どうも使い勝手が悪い気がしたので、マイクロソフトが推奨するUI標準の資料みたいなのがどこかにあったのを思い出して探したんですが、なんかいろんなキーワードでググったんだけど見つけるのに苦労しましたw 「マイクロソフト UI 標準」「マイクロソフト ユーザーインタフェース ガイドライン」「Windows UI 推奨」とかね……いろいろ試したんだけどw
結局、自分が前に見たことあって今回探してたのは、これでした↓
Windows ユーザー エクスペリエンス ガイドライン
UIじゃなくてUX(ユーザーエクスペリエンス)がキーワードだったのね。思いつかなかった。Windows 7 と Vista 準拠となってます。Windows 8版はどこかにあるのだろうか。
MSDN内の記事なんで、ここからツリーを下っていくと細目が見られますが、上のリンクのページからPDFファイルがダウンロードできます。せっかくだからもうちょっとわかりやすいところに置いといてくれないかなぁ……。
また探しまわらなくていいように覚え書きw しかしMSDNってちょくちょく全面改定されてページのリンクが消失するんですよねー。一応タイトルが変わってなければまたMSDN内の検索で見つかるかと思いますが。
結局、自分が前に見たことあって今回探してたのは、これでした↓
Windows ユーザー エクスペリエンス ガイドライン
UIじゃなくてUX(ユーザーエクスペリエンス)がキーワードだったのね。思いつかなかった。Windows 7 と Vista 準拠となってます。Windows 8版はどこかにあるのだろうか。
MSDN内の記事なんで、ここからツリーを下っていくと細目が見られますが、上のリンクのページからPDFファイルがダウンロードできます。せっかくだからもうちょっとわかりやすいところに置いといてくれないかなぁ……。
また探しまわらなくていいように覚え書きw しかしMSDNってちょくちょく全面改定されてページのリンクが消失するんですよねー。一応タイトルが変わってなければまたMSDN内の検索で見つかるかと思いますが。
マルチスレッドにした覚えはないのに「有効ではないスレッド間の操作」でエラー
また思い出したのでメモ。
VB.NET(VS2010)で、シリアル通信接続のカードリーダーからカードの情報を読み込んでなんやかんや、というアプリケーションを作成していました。
カードリーダーとかよくわからんので、とりあえず、読み込んだデータをフォームに表示してみることに。カードリーダーの読み書きについては出来合いのライブラリがあるので、リード成功イベントのところで、読み込んだ値(String)をフォームのテキストボックスのTextプロパティにセットして表示するようにしました。ところが、Textプロパティに値をセットするところで、
有効ではないスレッド間の操作: コントロールが作成されたスレッド以外のスレッドからコントロール 'txtCardData′ がアクセスされました。
と出てしまってうまくいきません。txtCardDataというのがテキストボックスで、このTextプロパティに値を代入しようとしたところでエラーになります。
例によってググるとwこのエラーは、別のスレッドからUIコントロール(この場合、フォームに貼ってるテキストボックス)にアクセスしようとしたときに出るらしいです。でも別にマルチスレッドなコードは書いてないのですが……。
さらにググってわかったのは、シリアル通信の受信イベントは別スレッドで立ち上がるとかそういう制限(?)があるようです。自分ではマルチスレッドなコードを書いてなくても、勝手にマルチスレッドになってるらしい。となると、このコードのままじゃどうしたって駄目なのか……。
結局、リード成功のイベントからというのが駄目なんだから他からならいいだろうということで、ここのイベントからはクラスのメンバ変数に値を渡すだけにして(UIコントロールの操作をしなけりゃいいので変数セットとかはできる)、タイマ回してその変数を拾ってテキストボックスに表示させるようにしました。なんか回りくどいように思ったけど、シリアル通信関係のアプリケーションではタイマ監視して処理させるというのはなんかお決まりの処理らしいので、これでいいのか。
VB.NET(VS2010)で、シリアル通信接続のカードリーダーからカードの情報を読み込んでなんやかんや、というアプリケーションを作成していました。
カードリーダーとかよくわからんので、とりあえず、読み込んだデータをフォームに表示してみることに。カードリーダーの読み書きについては出来合いのライブラリがあるので、リード成功イベントのところで、読み込んだ値(String)をフォームのテキストボックスのTextプロパティにセットして表示するようにしました。ところが、Textプロパティに値をセットするところで、
有効ではないスレッド間の操作: コントロールが作成されたスレッド以外のスレッドからコントロール 'txtCardData′ がアクセスされました。
と出てしまってうまくいきません。txtCardDataというのがテキストボックスで、このTextプロパティに値を代入しようとしたところでエラーになります。
例によってググるとwこのエラーは、別のスレッドからUIコントロール(この場合、フォームに貼ってるテキストボックス)にアクセスしようとしたときに出るらしいです。でも別にマルチスレッドなコードは書いてないのですが……。
さらにググってわかったのは、シリアル通信の受信イベントは別スレッドで立ち上がるとかそういう制限(?)があるようです。自分ではマルチスレッドなコードを書いてなくても、勝手にマルチスレッドになってるらしい。となると、このコードのままじゃどうしたって駄目なのか……。
結局、リード成功のイベントからというのが駄目なんだから他からならいいだろうということで、ここのイベントからはクラスのメンバ変数に値を渡すだけにして(UIコントロールの操作をしなけりゃいいので変数セットとかはできる)、タイマ回してその変数を拾ってテキストボックスに表示させるようにしました。なんか回りくどいように思ったけど、シリアル通信関係のアプリケーションではタイマ監視して処理させるというのはなんかお決まりの処理らしいので、これでいいのか。
登録:
投稿 (Atom)