【问题标题】:c# when copying file(sql localdb)_IOEXCEPTION_ Process cannot access file because the file is being used by another processc#复制文件时(sql localdb)_IOEXCEPTION_进程无法访问文件,因为该文件正在被另一个进程使用
【发布时间】:2016-03-07 10:43:29
【问题描述】:

我有一个使用 MS-SQL localdb 文件 (.mdf) 的简单 SQL 应用程序。 每当应用程序作为备份目的关闭时,我想将此 localdb 文件(.mdf)复制到另一个文件夹。

但是,下面的简单代码带来了标题为这个问题的 IOException。 如果没有用户的特定按钮单击,我的应用程序始终与 localdb 文件(.mdf)保持断开连接。

我发现了其他案例,但我的知识不足以理解甚至类似的情况。

我一直非常感谢您的卓越表现。非常感谢!

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
        if (MessageBox.Show("really want to exit?", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.No)
        {
            e.Cancel = true;
        }
        else
        {
            var greendbfileName = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), string.Format("greendb_{0}.mdf", personID));
            var copied_greendbfileName = string.Format(@"C:\greendb_{0}.mdf", personID);
            File.Copy(greendbfileName, copied_greendbfileName);

            Environment.Exit(0);
        }
    }

【问题讨论】:

    标签: c# sql copy ioexception localdb


    【解决方案1】:

    对于正在为这种情况寻找自己的解决方案的人。我推荐一个标准的 BACKUP 数据库命令(和 RESTORE)。谢谢!

    仅供参考
    How to backup a SQL Server 2014 Express Localdb (.mdf) file programmatically

    【讨论】:

    • 谢谢,这对我有帮助。它没有立即起作用,但为我指明了正确的方向。我需要复制我的数据库,并且为了恢复我必须另外使用“RESTORE FILELISTONLY”,因为我的 MDF 和 LDF 文件的名称不同。也许这对其他人有帮助:请参阅“E. Copying a database using BACKUP and RESTORE”docs.microsoft.com/en-us/sql/t-sql/statements/…
    【解决方案2】:

    当我终止进程时,表的主键ID列奇怪地增加了1、2、3、4、5010、6010、7010。第一次,它似乎工作正常(localdb mdf文件复制成功但是,当我下次运行我的应用程序时,可能 localdb 进程的异常终止似乎影响了它的功能。 我认为强制终止 localdb 必须非常小心,并且需要由与我不同的专家研究。

    我希望这个小小的经验可以帮助像我这样正在寻找解决方案的人。

    当与 localdb 的 SQL 连接打开时,一个进程 (sqlservr.exe) 开始工作。 文件扩展名不应与。

    foreach (var process in Process.GetProcessesByName("sqlservr"))
    {
        process.Kill();
    }
    

    我放弃了上面的方式,回到SQL Localdb的标准备份命令。

    【讨论】:

      【解决方案3】:

      您应该能够执行以下操作: 1.关闭所有与数据库的连接 2.连接本地主数据库 3.使用该连接使您的数据库脱机,然后将其分离,然后复制文件。 下次您连接到它时,它应该只是重新连接您的数据库。

      您可能想在此处查看我对自己问题的回答: When does LocalDB unlock the mdf file?

      ... 这实际上只是对这个答案的现代化更新: https://stackoverflow.com/a/22791484/999256

      【讨论】:

      • 我非常感谢您的善良和卓越。但是,正如我作为自我回答发布的那样,我尝试了几种方法,但最终使用标准备份命令成功,并且对其稳定性和便利性非常满意。谢谢,我从你的回答中学到了。
      猜你喜欢
      • 1970-01-01
      • 2015-07-18
      • 1970-01-01
      • 2023-01-17
      • 1970-01-01
      • 2013-06-28
      • 2015-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多