我的WPF应用使用Microsoft.Win32.OpenFileDialog选择要打开的SQL Server 2008数据库。
它工作正常,但是有一个问题:当对话框中选择的数据库以前在上次启动后的某个时间打开时,该文件似乎在后台由SQL服务器保持打开状态(即使它未被我打开)应用程序和我的应用程序已重新启动)。当在OpenFileDialog中单击“确定”时,这会导致“另一个应用程序使用的文件”警告,并且在重新启动计算机之前,我无法使用该对话框打开该特定数据库。似乎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);
}
}
答案 0 :(得分:5)
对于早期Windows版本,基础选项为OFN_NOVALIDATE,对于Windows和.NET的更高版本,您可以在Vista对话框中使用FOS_NOVALIDATE。来自MSDN的描述:
请勿检查阻止应用程序打开所选文件的情况,例如共享违规或访问被拒绝的错误。
您现在看到的是,对话框发现数据库文件存在共享冲突。事实上,这个选项在OpenFileDialog包装类上公开,添加这行代码来解决你的问题:
dlg.ValidateNames = false;
答案 1 :(得分:3)