0

我有一个 Web 应用程序,它创建了一个 Access 数据库。当我创建这个数据库时,如果文件存在,我首先必须删除它,然后重新创建它。

            if (File.Exists(DataSourcePath + fileName))
                File.Delete(DataSourcePath + fileName);

            string cnnStr = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + DataSourcePath + fileName + "; Jet OLEDB:Engine Type=5";
            var catType = Type.GetTypeFromProgID("ADOX.Catalog");
            object o = Activator.CreateInstance(catType);
            catType.InvokeMember("Create", BindingFlags.InvokeMethod, null, o, new object[] { cnnStr });

            OleDbConnection cnn = new OleDbConnection(cnnStr);
            var cmd = cnn.CreateCommand();

            cnn.Open();
            cmd.CommandText = "CREATE TABLE TblInfoCompany (Name TEXT, Family TEXT)";
            cmd.ExecuteNonQuery();

            cmd.Dispose();
            cnn.Close();
            cnn.Dispose();

当我重新创建这个文件时,我会得到一个异常。异常说:“该文件在另一个进程中使用。” 请帮助我关闭此过程或找到解决此问题的任何方法。

谢谢。

4

1 回答 1

1

维护正在使用的文件的进程可能是 Web 应用程序本身。由于关闭/打开该 mdf 文件不是由您直接处理,而是由 Jet Engine 处理,因此并不容易。我建议 PInvoke 系统函数MoveFileEx指定:

  • null 作为第二个参数,表示您要删除
  • MOVEFILE_DELAY_UNTIL_REBOOT作为 dwFlags,表示该操作将在下次系统重启时完成

我知道这不是最好的,因为服务器不会经常关闭,但可能是删除无法关闭的锁定文件的更简单的解决方案。

于 2012-08-25T10:02:02.537 回答