前の投稿で、ゲストからのインターネット接続ができるようになったのに気をよくしてw今度はこれも前やりかけててあきらめてた、ゲストOSからのプリンタ出力ですよ。環境は前と同じ、Virtual PC 2007 でホストOS:Windows 7、ゲストOS:Windows XP SP3 です。
まぁ普通にググるとまず出てくるのが、記事が古いのか、ホストOSのシリアルポートをゲストOSから使えるよというもの。一応書いとくと、Virtual PC コンソールの設定でLPT1ポートにホストOSの物理パラレルポートを割り当てるとゲストOSに繋がってるみたいに使えるよということらしい。けど……今どきシリアルで繋がってるプリンタはほとんど無いわけで……USB接続のが使いたいわけで……。
と、さらに、USB接続のプリンタを使うべくググると、今度は、ホストOSのローカルプリンタを、ゲストPCからはネットワークの共有プリンタとして使うことができる、というのが出てきた。これでできそう?
それではと、ゲストOSにプリンタの追加で、ネットワークプリンタを検索……出てきません。つか、ホストOSのPC名が出てこないよ。あたりまえか。単にホスト・ゲストの関係ではあるが同じLAN上にいることになってないのではないか?
さらにググって基本に戻るw 同じワークグループにいないといけないのじゃないか? というわけでゲストPCのグループ名をホストPCのと同じにしてみた。……駄目でしたorz
ファイヤウォールとか関係あるんじゃないかと思ったけどよくわからんのでパスw なんか他にやり方あるんじゃないかとさらにググる。
おっ? なんか有望そうな Microsoft Loopback Adapter というものを発見。これは何かというと……ホストOSがそもそもLANを構成していない(スタンドアロン)場合でも、ホストOSとゲストOSとでLANを(ハードは1台しかないけど擬似的に?)構成することができるというものみたいです。スタンドアロンでもネットワーク上のやりとりをテストしてみたりとかできて便利……らしい。とりあえず使ってみよう。タダみたいだしw
まずホストOSの作業から。
Windows 7の場合は、デバイスマネージャーで「ネットワークアダプター」を選択→メニューの[操作]-[レガシーハードウェアの追加]→ウィザードが出てくるので[次へ]→「一覧から選択したハードウェアをインストールする」を選択して[次へ]→「ネットワークアダプター」を選択して[次へ]→製造元「Microsoft」、ネットワークアダプター「Microsoft Loopback Adapter」を選択して[次へ]→インストールを開始するには[次へ]→ウィザード完了画面が出たらおしまい。
これでインストールできた……えっ? よくわからんけどスルーでw 仮想ネットワークアダプタが1個増えたということらしいです。
あとネットワークの設定も必要。Windows 7だと「ネットワーク」→「ネットワークと共有センター」→「アダプターの設定の変更」で今繋がってるアダプターの一覧が出てくるので、そこから Microsoft Loopback Adapter の接続を選択→右クリックで「プロパティ」→「インターネットプロトコル バージョン4」を選択→「次のIPアドレスを使う」を選択→IPアドレス「192.168.1.1」、サブネットマスク「255.255.255.0」→[OK]
ホストOSにインストールしてからゲストOSを再起動すると、ゲストOS上で「新しいハードウェアが~」というおなじみのが出てきてこっちでもMicrosoft Loopback Adapterが使えるようになります。
で、Virtual PC コンソールの設定で「ネットワーク」を見ます。前の投稿で、インターネット接続したいなら「共有ネットワーク(NAT)」を選べということだったけど、ここでは今入れたLoopback Adapterを使いたい……ということで、1個追加。「ネットワークアダプタ数」を「2」にすると「アダプタ2」が選択可能になるので、「Microsoft Loopback Adapter」を選択。
それからこっちでもネットワークの設定。Windows XPではコンパネの「ネットワーク接続」で「LANまたは高速インターネット」のところを見ると2つあります……たぶんw ここにはホストOSで見たときみたいにアダプタの名前が出てこないけど、Virtual PC コンソールの設定の「アダプタ1」「アダプタ2」に対応してるということでしょうか。試しに1個目のプロパティで「インターネットプロトコル(TCP/IP)を見ると、前の投稿で設定したやつ(IP自動・DNS自動)になってます。では2個目のを設定。さっきのホストOSで設定したのと同じネットワークなので、IPアドレス「192.168.1.10」、サブネットマスク「255.255.255.0」としておきます。そしてゲストOS再起動。
これであらためてゲストPCでプリンタの追加をやってみると、やったーホストPCのローカルプリンタが参照できたよ! あとは普通のネットワークプリンタの追加と同じ手順です。やれやれ。
あ、普通だとプリンタドライバも取ってきて入れてくれたりしますが(しないことも多いw)、今回自分の環境では入れてくれなかったので、メーカーサイトからDLしてゲストOSにインストールしました。ここでも前の投稿でインターネット接続しておいたのが役に立っているw 直接DL→インストールできるので便利~。
しかしなんか本当にここまでしないといけなかったのだろうか? 実はもっと簡単な方法があったのではないか? まぁできたから良しとしようw
2013年3月4日月曜日
Virtual PC のゲストOSからインターネット接続したい
いつものことですが完全に自分用の覚え書きですw
Virtual PC 2007 をホストOS:Windows 7、ゲストOS:Windows XP SP3 で使ってます。
ホストOSではもちろんインターネット接続できてるんですが、ゲストOSからができない。ゲストOS情でIE起動すると(MSNがホームなんですが)接続できないよとIEのエラー画面に。
ググってみると、Virtual PC コンソールの[設定]でゲストOSの[ネットワーク]の設定を「共有ネットワーク(NAT)」にしないと駄目とかあるんだけど、それはもうすでに設定済み……であきらめて放置してましたw
今回どうしてもネットワーク接続が必要になったのでさらに頑張ってググると(頑張るとこそこかいっw)、たぶん基本的なことだからいままで見つからなかったのねという設定を発見。やったーできたよー。
ゲストOSでコントロールパネル→ネットワーク接続 でLANとかの接続一覧が出てきます。環境によるけどたぶんローカルエリア接続のどれかwでいま繋がってるのでそれを右クリック→プロパティ→インターネットプロトコル(TCP/IP)を選択して[プロパティ]→「全般」タブで「IPアドレスを自動的に取得する」と「DNSサーバーのアドレスを自動的に取得する]を選択。これでOK。
……って、普通、これがデフォルトなんじゃないかとw だから普通は苦もなく繋がるんじゃないかとw 自分の場合は他所のLANで動いてたゲストOSを外付HDDに入れて持ってきたものだったので、そこのLANでは動く設定になってたんでした。IPとDNS固定で設定されてたのよ。そんなとこ関係あると思わなかったわw よく考えれば関係あるのわかるはずなんだがorz
Virtual PC 2007 をホストOS:Windows 7、ゲストOS:Windows XP SP3 で使ってます。
ホストOSではもちろんインターネット接続できてるんですが、ゲストOSからができない。ゲストOS情でIE起動すると(MSNがホームなんですが)接続できないよとIEのエラー画面に。
ググってみると、Virtual PC コンソールの[設定]でゲストOSの[ネットワーク]の設定を「共有ネットワーク(NAT)」にしないと駄目とかあるんだけど、それはもうすでに設定済み……であきらめて放置してましたw
今回どうしてもネットワーク接続が必要になったのでさらに頑張ってググると(頑張るとこそこかいっw)、たぶん基本的なことだからいままで見つからなかったのねという設定を発見。やったーできたよー。
ゲストOSでコントロールパネル→ネットワーク接続 でLANとかの接続一覧が出てきます。環境によるけどたぶんローカルエリア接続のどれかwでいま繋がってるのでそれを右クリック→プロパティ→インターネットプロトコル(TCP/IP)を選択して[プロパティ]→「全般」タブで「IPアドレスを自動的に取得する」と「DNSサーバーのアドレスを自動的に取得する]を選択。これでOK。
……って、普通、これがデフォルトなんじゃないかとw だから普通は苦もなく繋がるんじゃないかとw 自分の場合は他所のLANで動いてたゲストOSを外付HDDに入れて持ってきたものだったので、そこのLANでは動く設定になってたんでした。IPとDNS固定で設定されてたのよ。そんなとこ関係あると思わなかったわw よく考えれば関係あるのわかるはずなんだがorz
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 よろしくお願いします。
.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 よろしくお願いします。
登録:
投稿 (Atom)