- PR -

デザイン時に指定したDBのパス名を実行時に変更する方法

投稿者投稿内容
未記入
常連さん
会議室デビュー日: 2008/10/21
投稿数: 20
投稿日時: 2009-01-21 18:35
VB2008でWindowsアプリを作成しています。
フォームにDataGridViewでAccess2003のテーブルを表示しているのですが、
デザイン時に指定したXXX.MDBのパス名を実行時に変更するにはどうしたら良いのでしょうか?
※XXX.MDBの格納パスを任意に変更したいのです。

app.configのconnectionStringsに接続文字列が入っていたのでこれか、これを格納した場所を
変更すれば良いように考えているのですがやり方がわかりません。

よろしくお願いします
108
常連さん
会議室デビュー日: 2007/12/12
投稿数: 45
投稿日時: 2009-01-22 09:52
引用:
デザイン時に指定したXXX.MDBのパス名を実行時に変更するにはどうしたら良いのでしょうか?
※XXX.MDBの格納パスを任意に変更したいのです。



格納パスを任意に変更とは、まさか
実行時にXXX.MDBを移動したいもしくは移動しているということではないですよね?

別のDBに接続したいということです?
コネクションオブジェクト(ACCESSなのでOleDbConnection?)
を実行時に作ればいいということではない?
未記入
常連さん
会議室デビュー日: 2008/10/21
投稿数: 20
投稿日時: 2009-01-22 10:09
引用:


格納パスを任意に変更とは、まさか
実行時にXXX.MDBを移動したいもしくは移動しているということではないですよね?

別のDBに接続したいということです?



同じXXX.MDBを使用しているのですが、XXX.MDBの場所が実行環境により異なるので実行時にXXX.MDBのパスを指定したいということです。
XXX.MDBを実行中に移動する訳ではないのですがデザイン時と実行時でパスを変更することはできないのでしょうか?

引用:

コネクションオブジェクト(ACCESSなのでOleDbConnection?)
を実行時に作ればいいということではない?


やり方を教えて頂けないでしょうか。
よこけん
大ベテラン
会議室デビュー日: 2006/01/31
投稿数: 216
投稿日時: 2009-01-22 10:44
プログラムからアクセスするには My.Settings なのですが、
接続文字列は "スコープ" が "アプリケーション" なので、My.Settings を使っての変更はできないです。
(System.Configuration.Configuration クラスを使っても無理っぽいですね)

System.Xml.XmlDocument を使う等して、単なる XML ファイルとして app.config を書き換えて保存してやれば良いと思います。ただし、アプリ自身がこの機能を備えるのならば、保存後アプリを再起動する必要があると思います。

各実行環境で、インストール時に接続文字列を決定できるのならば、インストーラで app.config を書き換えるというのも一つの手です。
_________________
C#と諸々
未記入
常連さん
会議室デビュー日: 2008/10/21
投稿数: 20
投稿日時: 2009-01-22 11:04
引用:

System.Xml.XmlDocument を使う等して、単なる XML ファイルとして app.config を書き換えて保存してやれば良いと思います。ただし、アプリ自身がこの機能を備えるのならば、保存後アプリを再起動する必要があると思います。

各実行環境で、インストール時に接続文字列を決定できるのならば、インストーラで app.config を書き換えるというのも一つの手です。



app.configはアプリと同じ場所に置けば良いものなのでしょうか?
試しにXXX.MDBの場所を変更(connectionStrings)したapp.configをアプリと同じ場所に置いて実行してみましたが変更前のパスを参照しにいっているようです。

※デザイン時には「C:\abc」にXXX.MDBを置いていましたが、実行時に「C:\def」に移動して実行(app.configにはC:\defを設定)したところ「C:\abc\XXX.MDBが見つかりません」というエラーが出ました。

アプリはapp.configではなくMyProjectのSettings.settingsファイルに設定された値を使ってアクセスしているように思えるのですが違うのでしょうか?
よこけん
大ベテラン
会議室デビュー日: 2006/01/31
投稿数: 216
投稿日時: 2009-01-22 11:13
> app.configはアプリと同じ場所に置けば良いものなのでしょうか?
> 試しにXXX.MDBの場所を変更(connectionStrings)したapp.configをアプリと同じ場所に置いて実行してみましたが変更前のパスを参照しにいっているようです。

app.config は exe ファイルと同じ場所に配置します。
また、app.config の名前は "実行ファイル名.exe.config" という名前でなければいけません。
例えば、hoge.exe というアプリの設定ファイルは hoge.exe.config という名前でなければいけません。
これは本来、開発者が手入力で名前変更する必要はなく、ビルド時に勝手に app.config → hoge.exe.config に変換してくれるはずですが。


> アプリはapp.configではなくMyProjectのSettings.settingsファイルに設定された値を使ってアクセスしているように思えるのですが違うのでしょうか?

そこに設定されている値は既定値です。app.config に書かれている値の方が優先されます。

_________________
C#と諸々
未記入
常連さん
会議室デビュー日: 2008/10/21
投稿数: 20
投稿日時: 2009-01-22 11:37
引用:

よこけんさんの書き込み (2009-01-22 11:13) より:
> app.configはアプリと同じ場所に置けば良いものなのでしょうか?
> 試しにXXX.MDBの場所を変更(connectionStrings)したapp.configをアプリと同じ場所に置いて実行してみましたが変更前のパスを参照しにいっているようです。

app.config は exe ファイルと同じ場所に配置します。
また、app.config の名前は "実行ファイル名.exe.config" という名前でなければいけません。
例えば、hoge.exe というアプリの設定ファイルは hoge.exe.config という名前でなければいけません。
これは本来、開発者が手入力で名前変更する必要はなく、ビルド時に勝手に app.config → hoge.exe.config に変換してくれるはずですが。


> アプリはapp.configではなくMyProjectのSettings.settingsファイルに設定された値を使ってアクセスしているように思えるのですが違うのでしょうか?

そこに設定されている値は既定値です。app.config に書かれている値の方が優先されます。





確かに実行ファイル名.exe.configというファイルが作成されており、その中を書き換えたらちゃんと移動したXXX.MDBを見に行きました。
ありがとうございました。
今回の用途にはよこけん様の回答で十分な結果が得られたのですが、もう少し質問させて下さい。

アプリケーションを配布する時にMDBの場所を利用者に指定させたいのですが、この方法として二つのやり方を考えました。

方法1)インストーラー若しくは手動で実行ファイル名.exe.configの中身を書き換える
方法2)任意のファイル(XML等)にパスを保存する仕組みを用意し、実行時にパスを書き換える。

それぞれに疑問がありますのでアドバイスをお願いします。
方法1について、インストーラーで自動的にパスを変更することはできるのでしょうか?
方法2について、実行時にDBの場所を指定するにはどうしたら良いのでしょうか?(108様の回答に対する質問と同じです)

よろしくお願いします。
よこけん
大ベテラン
会議室デビュー日: 2006/01/31
投稿数: 216
投稿日時: 2009-01-22 12:46
> 方法1について、インストーラーで自動的にパスを変更することはできるのでしょうか?

Visual Studio が標準サポートしている「セットアッププロジェクト」でインストーラを作成している場合、「ユーザーインターフェイス」にファイルパス指定用のテキストボックスを用意して「カスタム動作」を作りこめば可能です。
チュートリアル : インストール時にアプリケーションを別の Web サービスにリダイレクトする 辺りが参考になると思います。


> 方法2について、実行時にDBの場所を指定するにはどうしたら良いのでしょうか?(108様の回答に対する質問と同じです)

使用するテーブルアダプタの Connection プロパティを実行時にすり替えるだけかと。
でも、本来、テーブルアダプタは app.config の接続文字列を使用することを前提としています。複数のテーブルアダプタを使用している場合、全てのテーブルアダプタに対して行う必要がありますし、あまりお勧めできないです。

_________________
C#と諸々

スキルアップ/キャリアアップ(JOB@IT)