SQL Server Express 2008 не отсоединяет автоматически прикрепленный файл? - PullRequest
3 голосов
/ 14 декабря 2009

Документация MSDN для SQLEXPRESS гласит:

Когда приложение впервые устанавливает соединение с работающим экземпляром SQL Server Express, SQL Server Express автоматически присоединит файл .mdf. Когда пользователь закрывает приложение, SQL Server Express отсоединяет файл .mdf от экземпляра.

Похоже, этого не происходит. Если я заменю файл MDF новым файлом с тем же именем (конечно, после удаления файла журнала), SQL Server Express откажется присоединять его.

Я испробовал практически любую комбинацию параметров строки подключения, и это сводит меня с ума. Есть предложения?

Ответы [ 2 ]

4 голосов
/ 14 декабря 2009

Отключение / закрытие происходит. Если этого не произойдет, вы не сможете заменить файл MDF, потому что он будет использоваться. Документация, которую вы цитируете, не совсем точна. Правильная документация: Пользовательские экземпляры SQL Server 2005 Express Edition :

  • Пользовательские базы данных имеют Авто Задать параметр закрытия , чтобы при наличии нет соединений с базой данных на 8-10 минут, база данных закрывается и файл закрыт. Бывает автоматически, но это может занять в то время как, особенно если соединение пул включен для вашего соединения.
  • Отключение базы данных из экземпляра, позвонив sp_detach_db закроет файл. это метод Visual Studio использует для убедитесь, что файл базы данных закрыто, когда IDE переключается между пользовательские экземпляры.

Если бы я рискнул предположить, я бы сказал, что база данных не отсоединена, а автоматически закрыта, и замена MDF после удаления LDF будет (по праву) рассматриваться как ошибка при попытке открыть базу данных.

В качестве примечаний:

  • Никогда не следует удалять файл LDF. Если вы хотите заменить базу данных, замените и MDF и LDF новыми.
  • Убедитесь, что вы заменили на правильные версии MDF и LDF. SQL Server может обновлять базу данных, но никогда не может понизить ее.
  • Получите ошибку. Если SQL Express откажется присоединить базу данных, это даст причину. Просмотрите созданный RANU ERRORLOG (в профиле пользователя), журнал событий systen или присоедините профилировщик к экземпляру пользователя.
0 голосов
/ 11 июля 2011
    private static void DetachMdf(string dbServer, string dbName)
    {
        SqlConnection.ClearAllPools();
        using (SqlConnection conn = new SqlConnection(string.Format("Server={0};Database=master;Integrated Security=SSPI", dbServer)))
        {
            conn.Open();
            using (SqlCommand cmd = new SqlCommand("sp_detach_db", conn))
            {
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@dbname", dbName);
                cmd.ExecuteNonQuery();
            }
        }
    }
...