4

SQL Server Express 2005データベースを使用するC#4.0デスクトップアプリケーションを開発しました。アプリケーションとそのすべての依存関係(mdbデータベースファイルを含む)をProgramFilesディレクトリの下の作業フォルダーにインストールするSetupand Deployment(msi)パッケージを作成しました。

接続文字列は次のようになります。

Server=.\SQLExpress;AttachDbFilename=|DataDirectory|MyDB.mdf;Database=MyDB;integrated security=true;user instance=true;

初めてデータベース呼び出しが行われると、データベースはローカルSQLServerExpressインスタンスに接続されます。

インストーラーはXPコンピューターで期待どおりに機能しますが、Windows 7マシンでテストすると、データベース呼び出しが最初に行われたときに例外がスローされ、mdbファイルを含むフォルダーに対するアクセス許可が不十分であることが示されます。

WindowsXPとWindows7の間で、Windowsはプログラムファイルサブフォルダーのアクセス許可をロックダウンしているようです。インストールディレクトリに完全なアクセス許可を設定することで問題を解決できますが、それはごまかしのようです。

だから私の質問はこれです:このアプリケーションのセットアップと展開パッケージをどのように構成する必要がありますか?私はそれを正しくやっていますか?アプリケーションディレクトリのすべてのユーザーに完全なアクセス許可を付与する必要がありますか?もしそうなら、VS2010のセットアップと展開パッケージでこれをどのように達成しますか?または、mdbファイルを別の場所に配置する必要がありますか?それとも私は完全に間違った方法で物事を進めていますか?

4

2 に答える 2

3

これが私が実装することになった完全なソリューションです。

  • セットアップと展開プロジェクトの[ファイルシステム]セクションで、SQL Serverデータベースファイル(MDF)を[共通アプリケーションデータ]フォルダーに追加しました。これは、[右クリック]ターゲットマシンのファイルシステム\特別なフォルダの追加メニューから選択できるオプションの1つではないため、そのメニューから[カスタムフォルダ]を選択し、[デフォルトの場所]プロパティに「[ CommonAppDataFolder][Manufacturer][ProductName]"。これにより、私の製品のターゲットマシン(Win 7の場合はC:\ Program Data \)のどこにいても、Common ApplicationDataFolderにフォルダーが作成されました。
  • SQL Serverデータベースファイルを正常にアタッチして正しく機能させるには、すべてのユーザーがこのフォルダーに完全にアクセスできる必要がありました。次のステップは、このフォルダーのアクセス許可を変更することでした。
  • それを行うために私が見つけた唯一の方法は、セットアップと展開プロジェクトのカスタムアクションを作成することでした。このリンクは、カスタムアクションを作成および追加する方法の概要を示しています:http://thedotnetway.blogspot.com.au/2008/10/creating-setup-project-in-vs-2008-w.html
  • このリンクは、カスタムアクションをオーバーライドするインストール方法に入れる必要のあるコードを提供します 。C#-Windows7のすべてのユーザーのディレクトリアクセス許可を設定します
  • カスタムアクションコードでSystem.Environment.GetFolderPath(System.Environment.SpecialFolder.CommonApplicationData)を使用して、CommonApplicationDataフォルダーを指定しました。

うまくいけば、これにより、同様の要件を持つ将来の開発者の生活が楽になります。

于 2012-06-26T03:37:25.523 に答える
2

この状況を改善するためのいくつかのオプションがあります。

  1. アプリケーションがプログラムファイルからのファイルの読み取りのみを実行している場合。管理者の権利の下でセットアップパッケージを実行する必要があります(それを右クリックして、[管理者として実行]を選択します)。あなたのDbは予想される場所に書き込まれます。

  2. ファイルに対してIO操作(読み取り/書き込み)を実行する必要がある場合は、すべてのファイルをいずれかのプログラムデータフォルダーに配置する必要があります

    Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)

または現在のユーザーのデータフォルダ

**Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)**

乾杯。

于 2012-06-21T04:24:21.843 に答える