5

アプリケーションの起動時にユーザーがアクティブなデータベースを選択する必要があるプログラムを作成しています。特にデータベースファイルを保存するために、 ApplicationDataのサブフォルダーに保存されているデータベースを一覧表示するWindowsフォームがあります。ただし、新しいデータベースを作成するときは、テンプレートデータベースをコピーする必要がありますが、デフォルトでどこに保存されているかがわかりません。

私はもう試した:

dpath = ConfigurationManager.AppSettings["DataDirectory"];

しかし、私は常にnull値を取得しているようです。ある時点で私はあきらめて、DataDirectoryを選択したフォルダーに設定するだけでよいと考えましたが、プログラムの実行が遅すぎて有効にできないようです。

newdpath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\MyAppFolder";

データベースの場所を見つける方法、またはプログラムの動作に影響を与えるのに十分早い段階でデータベースの場所を設定する方法についての提案をいただければ幸いです。

編集:

2番目の部分では、 TableAdapter.Fillコマンドがすでに実行された後で接続文字列を変更しようとしていることを発見しました。これにより、デフォルトのデータベースが開かれる理由が説明されました。その謎は解決されました。ただし、最初の部分はまだ不明です。

ありがとうございました。

4

3 に答える 3

27

|DataDirectory|構成設定からのものではありません。あなたは3つの異なるものを混ぜ合わせています:

ConfigurationManager.AppSettings["DataDirectory"]

これは構成設定に由来します。作成してプロジェクトに配置する必要のある.configファイル。この特定の設定は、要素にキー"DataDirectory"がある要素の値ですAppSettings。これは、.configファイルに配置しない限り存在しません。通常、これは変更されない構成または起動データを配置する場所です。ファイルパスは、ユーザーがデータベースをインストールするマシンによって異なる可能性があるため、ここに配置しないでください。

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

これは、アプリがインストールされているオペレーティングシステムによって定義された現在のユーザーのローミングアプリケーションデータフォルダーへのパスです。これは変更できません。OSによって定義されています。このフォルダはユーザーが書き込み可能であり、ユーザーがアプリケーションをアンインストールしても削除されず、ユーザーが別のマシンからローミングまたはログオンした場合に使用可能になることを確認できます。これは通常、編集可能なアプリケーションデータを配置する場所です。

SqlConnection("Data Source=|DataDirectory|DatabaseFileName.sdf;...")

これは、ADO.NET接続の接続文字列です。ADO.NETは垂直バーを特別に扱い、垂直バー間のキー名に一致するAppDomainデータを検索します。次の方法で同じデータを取得できます。

AppDomain.CurrentDomain.GetData("DataDirectory")

では、何がの値を書き込むのDataDirectoryでしょうか?これは、実行可能ファイルをデプロイするものによって実行されます。

  • .MSIインストーラーは、それをアプリのターゲットフォルダーとして定義します。
  • ClickOnceは、プロジェクトに特別なデータフォルダを定義します。
  • WebアプリはApp_Dataフォルダーを使用します。
  • VisualStudioデバッガーはデバッグフォルダーを使用します。

.MSIインストーラーを使用すると、ユーザーがDataDirectoryを変更できることに注意してください。DataDirectoryこれが、アプリケーションデータが展開された場所を見つける方法がない場合に、ハードコーディングまたは変更してはならない理由です。通常、このDataDirectoryフォルダーは、実行可能ファイルとともにデプロイされた読み取り専用のバイナリデータ用に使用します。

実行可能ファイルとともにデプロイされたデータに書き込む必要がある場合は、最初に、ユーザーがに書き込むことができることがわかっている場所にデータをEnvironment.SpecialFolder.ApplicationDataコピーし、コピーに書き込む必要があります。DataDirectoryユーザーが必ずしも書き込み可能であるとは限らないだけでなく、デプロイメントの一部であり、ユーザーデータの一部ではありません。実行可能ファイルを修復またはアンインストールすると、DataDirectory再インストールまたは削除されます。データを削除するとき、ユーザーはそれを気に入らないので、に保存しないでくださいDataDirectory

于 2012-09-04T17:42:02.457 に答える
0

ConnectionString、TableAdapterなどを使用してDataDirectoryと呼ばれるものを作成する前に、この行を配置します。

TableAdapter.Fill(DataSet.DataTable);の直前に配置することで、テストに成功しました。

AppDomain.CurrentDomain.SetData("DataDirectory", @"Full path to your data folder");

DataDirectoryが存在しないため、 DataDirectoryがどこにあり、何であるかがわかりません。そのため、MSSQLは代わりにAppDomain.CurrentDomainのBaseDirectoryを取得します。

于 2020-05-04T16:37:57.037 に答える
-1

コードは、Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)開発中は毎回null値を返します。| DataDirectory | プログラムのインストール時に設定されます。

プロジェクトをビルドしてから、インストールしてテストします。

そのコード行を使用して、実行時にインストールされたアプリケーションのデータベースを圧縮しました。

そのコードは、次のように変数に設定できます...

Dim Beer as string
Beer = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

これにより、INSTALLED |DataDirectory|のフォルダーパスが返されます。CStrと別の変数を使用してデータベース名を追加します...

Dim MyPathA As String = CStr(Beer & "\Workout.mdb")
Dim MyPathB As String = CStr(Beer & "\BackupWorkout.mdb")

Dim JRO As JRO.JetEngine
JRO.CompactDatabase(CStr("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & MyPathA), _
CStr("Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " & MyPathB & ":Jet OLEDB:Engine Type=5"))

On error Errorhandler, 
Errothandler
Kill(MyPathB)

1行目はデータベースで、2行目はデータベースの名前をBackupに変更し、同じディレクトリに圧縮します。そこにバックアップがある場合は、エラーがトリガーされ、バックアップが削除されます。

その後、これはボタンクリックだと言います。すべてをもう一度実行します。キルラインの直後、

Me.Buttonx.PerformClick()

これが、インストールされているClickOnceアプリケーションでデータベースを圧縮する方法です。|DataDirectory|の使用 コード内で不正な文字エラーがスローされます...

于 2019-07-11T05:46:30.123 に答える