4

私の WPF アプリは Microsoft.Win32.OpenFileDialog を使用して、開く SQL Server 2008 データベースを選択しています。

それは正常に動作しますが、1 つの問題があります: ダイアログで選択されたデータベースが前回の起動以降に開かれていた場合、ファイルはバックグラウンドで SQL サーバーによって開かれたままになっているようです (自分のアプリと自分のアプリによって開かれていない場合でも)。アプリが再起動されました)。これにより、OpenFileDialog で [OK] をクリックすると、「ファイルは別のアプリケーションで使用されています」という警告が表示され、コンピューターを再起動するまでダイアログを使用してその特定のデータベースを開くことができません。OpenFileDialog が選択したファイルを開こうとすると、別のアプリ (SQL Server) によって既に開かれていることがわかります。OpenFileDialog が選択したファイルを開こうとするのを無効にし、選択したファイルのファイル名をチェックせずに返すにはどうすればよいですか?

私のコードは次のようになります。

public void OpenDatabase() {
    // Let user select database to open from file browser dialog
    // Configure open file dialog box
    var dlg = new Microsoft.Win32.OpenFileDialog();
    dlg.FileName = ""; // Default file name
    dlg.DefaultExt = ".mdf"; // Default file extension
    dlg.Filter = "Databases (.mdf)|*.mdf|All Files|*.*"; // Filter files by extension 
    dlg.CheckFileExists = false;
    dlg.CheckPathExists = false;

    // Show open file dialog box
    bool? result = dlg.ShowDialog();    // Gives file in use warning second time!

    // Process open file dialog box results 
    if (result == true) {
        // Open document 
        string filename = dlg.FileName;
        TryOpenDatabase(filename);
    }
}
4

2 に答える 2

5

基本的なオプションは、初期のWindowsバージョンの場合はOFN_NOVALIDATE、後のバージョンのWindowsおよび.NETで表示されるVistaダイアログの場合はFOS_NOVALIDATEです。MSDNからの説明:

共有違反やアクセス拒否エラーなど、アプリケーションが選択したファイルを開くのを妨げるような状況をチェックしないでください。

これが現在発生していることですが、ダイアログにはデータベースファイルの共有違反が表示されます。このオプションは実際にはOpenFileDialogラッパークラスで公開されています。問題を修正するために次のコード行を追加してください。

  dlg.ValidateNames = false;
于 2013-01-01T13:05:37.820 に答える
3

MSDN フォーラムには、これに関する投稿があります。

これは OpenFileDialog API にあり、次を使用してオフにすることができます

ValidateNames = false

Dialog

于 2013-01-01T11:03:05.190 に答える