c# при копировании файла (sql localdb)_IOEXCEPTION_ Процесс не может получить доступ к файлу, поскольку файл используется другим процессом

У меня есть простое приложение SQL, которое использует файл локальной базы данных MS-SQL (.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);
        }
    }

person Kay Lee    schedule 03.03.2016    source источник


Ответы (3)


Для тех, кто ищет собственное решение для подобной ситуации. Я рекомендую стандартную команду базы данных BACKUP (и RESTORE). Благодарю вас !

Просто как ссылка
Как сделать резервную копию файла SQL Server 2014 Express Localdb (.mdf) программно

person Kay Lee    schedule 04.03.2016
comment
Спасибо, это помогло мне. Это не сработало сразу, но указало мне правильное направление. Мне нужно было скопировать мою базу данных, и для восстановления я должен был использовать RESTORE FILELISTONLY дополнительно, потому что имена моих файлов MDF и LDF были разными. Возможно, это поможет кому-то еще: см. E. Копирование базы данных с помощью BACKUP и RESTORE здесь docs.microsoft.com/en-us/sql/t-sql/statements/ - person Butterfly; 16.03.2021

Когда я завершил процесс, столбец идентификатора первичного ключа таблицы странно увеличился, например, на 1, 2, 3, 4, 5010, 6010, 7010. В первый раз казалось, что он работает нормально (файл localdb mdf был успешно скопирован, но когда Я запустил свое приложение в следующий раз, возможно, ненормальное завершение процесса localdb влияет на его функции.Я думаю, что принудительное завершение localdb должно быть очень осторожным и должно быть изучено экспертами, в отличие от меня.

Я надеюсь, что этот небольшой опыт поможет кому-то, кто ищет решение, как я.

Когда открывается SQL-соединение с localdb, начинает работать процесс (sqlservr.exe). Расширение файла не должно быть с.

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

Я отказался от вышеуказанного способа и вернулся к стандартной команде резервного копирования SQL Localdb.

person Kay Lee    schedule 05.03.2016

Вы должны быть в состоянии сделать следующее: 1. закрыть все соединения с базой данных 2. подключиться к локальной главной базе данных 3. с помощью этого соединения перевести базу данных в автономный режим, затем отсоединить ее, а затем скопировать файл. В следующий раз, когда вы подключитесь к нему, он должен просто повторно подключить ваш db.

Возможно, вы захотите взглянуть на мой ответ на мои собственные вопросы здесь: Когда LocalDB разблокирует файл mdf?

... на самом деле это просто модернизированное обновление этого ответа: https://stackoverflow.com/a/22791484/999256< /а>

person C.List    schedule 07.03.2016
comment
Я высоко ценю вашу доброту и превосходство. Однако, как я написал в качестве ответа на свой вопрос, я попробовал несколько способов, но, в конце концов, преуспел со стандартной командой резервного копирования и очень доволен ее стабильностью и удобством. Спасибо, я узнал из вашего ответа. - person Kay Lee; 07.03.2016