トップ回答者
XPで作成したアプリをVistaでもWindows7でも実行可能にする方法?

質問
-
XPpro上のVS2008proで作成したアプリのインストーラーを作成し,Web上で公開しておりましたところ,
Vistaやwindows7を使用している方々から,データベース(.mdb)のデータを削除しようとすると
以下のエラーが出るとのご指摘をうけました。私にはVistaもWin7も手元にありませんので確かめようも
なく困っています。
---------------------------------------------------------------------------------------
アプリケーションのコンポネートンで、ハンドルされていない例外が発生しました。
(続行)をクリックすると、アプリケーションはこのエラーを無視し、続行しようとします。(終了)をクリックすると、アプリケーションは直ちに終了します。
************** 例外テキスト **************
System.Data.OleDb.OleDbException: 指定されたテーブルから削除できませんでした。
場所 System.Data.Common.DbDataAdapter.UpdatedRowStatusErrors(RowUpdatedEventArgs rowUpdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount)
場所 ..............(省略)-------------------------------------------------------------------------------------------
インストーラーは,.NET Framework 3.5の有無を確認し,ない場合は自動的にインストールする仕組みになっています。
<私なりに思いつく対処法?>
ア VistaやWin7にもとから含まれる.NET Frameworkとの相性がわるいのでは?
イ プロジェクトを「ビルド」する際に 何らかの設定が必要なのではないか?
などと考えたりしていますが,いったいどうしたらよろしいのでしょうか?お教え願います。
zen73
回答
-
>データファイルsuito.mdbは,
> ・アプリケーションを利用する各ユーザに固有のもの
> ・アプリケーションの利用者はその存在を知る必要はないもの
>です。であれば、ユーザプロファイル配下の AppData の下にフォルダ(=ベンダ名¥製品名 など)を掘って、そこに配置するべき可能性が高いですね。
ユーザプロファイル(フォルダ)は、通常、PCにはじめてログオンした時に作成されるので、アプリケーションのインストール時に .mdb を各ユーザーのユーザプロファイルに配布する、というシナリオは不適切です。
なので、こういった場合はインストーラで各ユーザが使用する .mdb のひな形となるものをアプリケーションのインストールフォルダ内に配置しておき、アプリケーションの起動時に
・ログオンユーザのプロファイル配下に .mdb が存在するかどうかチェックする
・存在しなければ、ひな形をユーザプロファイル配下にコピーするなどを実施するのが常套手段です。
ちなみに、ユーザ毎の AppData フォルダは、プログラム的には
Environment.GetFolderPath()
で取得できます。
>アプリ作成時に,新規にプロジェクトを作成時には,データベースとその場所は
> D:\出納簿4\a_bookの場所のsuito.mdbそれだと、Windows Vista 辺りからは、デフォルトのセキュリティ設定では、最初にファイルを作成した人しかそのファイルを変更することができないです。
- 回答としてマーク zen73 2010年7月23日 13:21
すべての返信
-
>ア VistaやWin7にもとから含まれる.NET Frameworkとの相性がわるいのでは?
>イ プロジェクトを「ビルド」する際に 何らかの設定が必要なのではないか?たぶん、どちらでもなく、.mdb ファイルを置くべき位置が悪い(=アプリケーション設計のガイドラインに沿ってない)のだと思います。
Windows Vista, Windows 7 は、XP よりもセキュリティによる制限が厳しくなっています。
古くから「推奨されない」とされてきたたフォルダに配置されたファイルは、XP では書き込み可能であっても、Windows Vista, Windows 7 では書き込みできないことがあります。
>などと考えたりしていますが,いったいどうしたらよろしいのでしょうか?お教え願います。
アプリケーション設計のガイドラインが推奨する、適切な場所に .mdb ファイルを配置して利用してください。
具体的にどこに配置するべきかは、その .mdb ファイルの利用のシナリオによって異なります。
-
渋木 宏明 さん,ありがとうございます。
「.mdb ファイルを置くべき位置が悪い」とは,思いもよらぬことでした。
DataSource を使ってバインディングできてDBアプリの作成がとても簡単になったと思っていたのですが
呑気に構えていられたのはXPの場合に限る現実を知りガックリときているところです。
Windows Vista/7でのmdbファイルの配置位置ですが,
「古くから「推奨されない」とされてきたたフォルダ」
「アプリケーション設計のガイドラインが推奨する適切な場所」
「.mdb ファイルの利用のシナリオによって異なる適切な場所」
についての解説を読むことのできるサイトをお教えいただけないでしょうか。
zen73 -
>解説を読むことのできるサイトをお教えいただけないでしょうか。
Microsoft の Web サイトにあります。
もっとも網羅的なのは、XP 時点で公開された
Vista 時点の情報は
http://msdn.microsoft.com/ja-jp/windows/cc811493.aspx
Windows 7 時点の情報はまじめに探したことがないので、他にもあるかもしれませんが
http://msdn.microsoft.com/ja-jp/windows/dd819215.aspx
とか。
-
>,.mdbファイルを置くべき場所はXPならマイドキュメント,Vistaならドキュメントという理解でよろしいのでしょうか。
それは、最初の返信に書いた通り
>具体的にどこに配置するべきかは、その .mdb ファイルの利用のシナリオによって異なります。
です。
.mdb ファイルが
・アプリケーションを利用するすべてのユーザに共通のもの
・アプリケーションを利用する各ユーザに固有のものであるかどうか、またアプリケーション利用者にとって .mdb ファイルはどのような位置づけのものであるか、たとえば
・アプリケーションの利用者はその存在を知る必要はない
・Word 文書ファイルなどのように、アプリケーション利用者が存在を意識する必要があるなどの条件によってことなります。
ドキュメント、マイドキュメントは、Word 文書のように、アプリケーションを利用する各ユーザがファイルの存在を意識する場合の配置場所です。
-
渋木宏明様,何度もすみません。
データファイルsuito.mdbは,
・アプリケーションを利用する各ユーザに固有のもの
・アプリケーションの利用者はその存在を知る必要はないもの
です。
作成したアプリケーションでの.mdbファイルの実際の配置は次のようにしました。
アプリ作成時に,新規にプロジェクトを作成時には,データベースとその場所は
D:\出納簿4\a_bookの場所のsuito.mdb
を指定し,その後コードを書きすすめながら,ときにACCESSからsuito.mdbでの
レコードの追加・削除・訂正の状況を見るために,
D:\出納簿4\a_book\bin\debug
のsuito.mdbを確認していました。セットアッププログラム作成時には上のフォルダのsuito.mdb
をD:\出納簿4\a_book\bin\Releaseにコピーしてビルドしたというのがsuito.mdbの配置の状況です。
zen73 -
>データファイルsuito.mdbは,
> ・アプリケーションを利用する各ユーザに固有のもの
> ・アプリケーションの利用者はその存在を知る必要はないもの
>です。であれば、ユーザプロファイル配下の AppData の下にフォルダ(=ベンダ名¥製品名 など)を掘って、そこに配置するべき可能性が高いですね。
ユーザプロファイル(フォルダ)は、通常、PCにはじめてログオンした時に作成されるので、アプリケーションのインストール時に .mdb を各ユーザーのユーザプロファイルに配布する、というシナリオは不適切です。
なので、こういった場合はインストーラで各ユーザが使用する .mdb のひな形となるものをアプリケーションのインストールフォルダ内に配置しておき、アプリケーションの起動時に
・ログオンユーザのプロファイル配下に .mdb が存在するかどうかチェックする
・存在しなければ、ひな形をユーザプロファイル配下にコピーするなどを実施するのが常套手段です。
ちなみに、ユーザ毎の AppData フォルダは、プログラム的には
Environment.GetFolderPath()
で取得できます。
>アプリ作成時に,新規にプロジェクトを作成時には,データベースとその場所は
> D:\出納簿4\a_bookの場所のsuito.mdbそれだと、Windows Vista 辺りからは、デフォルトのセキュリティ設定では、最初にファイルを作成した人しかそのファイルを変更することができないです。
- 回答としてマーク zen73 2010年7月23日 13:21
-
渋木宏明さん,常に素早いご対応ありがとうございます。
お陰様で,私のボケ頭にも対処法が見えてきました。
アプリケーション起動時のチェックと,.mdbファイルをコピーするコードを
どうかくのかを勉強せねばなりませんが・・・・・。
Visual Studioの初版を手に入れてからデータベースに興味をもちはじめて
このフォーラムの前身の「GotDotNet Japan 掲示板」でも実に多くのことを
教えていただきましたが,中年を過ぎての独学ということで,今回のように未経験のことを
しようとするたびに壁にぶつかり,未だに初心者の域を脱することができないでいます。
これからもどうぞよろしくお願いします。
zen73 -
Web サイトを拝見させていただきました。
おそらく、この件は↑で公開されている会計ソフトのレポジトリの話だったんですよね?だとすると
>であれば、ユーザプロファイル配下の AppData の下にフォルダ(=ベンダ名¥製品名 など)を掘って、そこに配置するべき可能性が高いですね。
というパターンだけではなく
・各ユーザの「ドキュメント」フォルダ配下にアプリケーション固有のフォルダ(="ベンダ名 アプリケーション名" など)を作成し、そこに .mdb を配置する
というパターンについても、仕様として検討するべきと思います。
というのは、通常
・.mdb ファイルの存在をアプリケーション利用者に意識させない(させたくない)
ではあるとしても、.mdb に記録されたデータはユーザの資産であり、PC の買い替え時などにデータの移行が強く希望されると予想します。
そういう意味において、この場合 .mdb に保存された情報は
・アプリケーション設定」というよりは「文書ファイル」に近い位置づけにある
と言えるからです。
たとえば、旧PCから新PCへのデータ移行のシナリオを考えた時、「ユーザプロファイル配下の AppData の下のフォルダ」にデータファイルを配置すると、「ドキュメントフォルダ配下のフォルダ」にデータファイルを配置した場合と比べて、データ移行の手間の負担が高くなってしまいます。
プログラム的には大した違いではありませんが、アプリケーション利用者のPC習熟度があまり望めない場合、ユーザにかける負担とサポートのコストは目に見えて違ってくるはずです。
Word 文書や Excel ブックのようなものは「書類」とイメージが被るので判断しやすいですが、この件の .mdb のような位置づけのファイルをどこに配置するべきかは、なかなか悩ましい問題です。
結局は
・アプリケーションの分かりやすさ
・データ保全やユーザの手間、サポートコストなどの様々な要件から、各アプリケーション毎に最適と思える解を取り決めるしかないです。。。