c#复制文件时(sql localdb)_IOEXCEPTION_进程无法访问文件,因为该文件正由另一个进程使用

时间:2016-03-03 11:16:15

标签: c# sql copy ioexception localdb

我有简单的SQL应用程序,它使用MS-SQL localdb文件(.mdf)。 我希望每当应用程序关闭作为备份目的时,将此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);
        }
    }

3 个答案:

答案 0 :(得分:0)

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

正如参考文献
How to backup a SQL Server 2014 Express Localdb (.mdf) file programmatically

答案 1 :(得分:0)

当我终止进程时,表的主键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的标准备份命令。

答案 2 :(得分:0)

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

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

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