2014-09-19 2 views
4

У меня есть база данных «D: \ MDF CONNECTION SAMPLE \ BIN \ DEBUG \ HARMDATABASE.MDF". Я пытаюсь снять или переименовать его, с этим кодом:Отключить базу данных программно

SqlConnection conn = new SqlConnection("Data Source=.\\MSSQLSERVER2008;database=Master;Integrated Security=True;"); 
SqlCommand cmd = new SqlCommand("", conn); 
cmd.CommandText = @"sys.sp_detach_db D:\MDF CONNECTION SAMPLE\BIN\DEBUG\HARMDATABASE.MDF"; 
conn.Open(); 
cmd.ExecuteNonQuery(); 
cmd.Dispose(); 
conn.Dispose(); 

Но получаю сообщение об ошибке:

Incorrect syntax near '\'.

ответ

6

Ты забыл цитату внутри запроса, а также @KyleHale отметил, - это должно быть имя базы данных, а не путь к ней.

Изменение:

cmd.CommandText = @"sys.sp_detach_db D:\MDF CONNECTION SAMPLE\BIN\DEBUG\HARMDATABASE.MDF;"; 

быть:

cmd.CommandText = @"sys.sp_detach_db 'dbName'"; 
+4

Кроме того, sp_detach_db принимает имя базы данных (оно должно быть действительным значением sysname), а не путь к файлу. –

+0

Да, пропустил это. Обновлен мой ответ. Спасибо, что заметили! – Ruslan

+0

Спасибо. Но теперь эта ошибка: невозможно отсоединить базу данных «D: \ MDF CONNECTION SAMPLE \ BIN \ DEBUG \ HARMDATABASE.MDF», поскольку она в настоящее время используется. – user3812553

4

Как насчет использования SMO?

Вам необходимо добавить ссылку на Microsoft.SqlServer.Smo, которая доступна, если на вашем компьютере-разработчике установлена ​​SQL Express или SQL Server.

using Microsoft.SqlServer.Management.Smo; 

void Detach() 
{ 
    Server smoServer = new Server("MSSQLSERVER2008"); 
    smoServer.DetachDatabase("HARMDATABASE", False); 
} 
+0

Я не могу найти Microsoft. SqlServer.Smo.dll в моей системе. – user3812553

+1

Вам нужно добавить ссылку на Microsoft.SqlServer.Smo, который доступен, если на вашем компьютере разработчика установлен SQL Express или SQL Server. Проверьте ссылку SMO выше. –

4

Для того, чтобы отделить базу данных и в то же время решить ошибку

Cannot detach the database 'YOUR_DATABASE' because it is currently in use

вы можете просто использовать следующий код:

private void DetachDatabase() 
    { 
     String databaseConnectionString = "Data Source=localhost;MultipleActiveResultSets=True;Integrated Security=True"; 
     using (SqlConnection sqlDatabaseConnection = new SqlConnection(databaseConnectionString)) 
     { 
      try 
      { 
       sqlDatabaseConnection.Open(); 
       string commandString = "ALTER DATABASE YOUR_DATABASE SET OFFLINE WITH ROLLBACK IMMEDIATE ALTER DATABASE YOUR_DATABASE SET SINGLE_USER EXEC sp_detach_db 'YOUR_DATABASE'"; 
       SqlCommand sqlDatabaseCommand = new SqlCommand(commandString, sqlDatabaseConnection); 
       sqlDatabaseCommand.ExecuteNonQuery(); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
     } 
    } 

Обратите внимание, что YOUR_DATABASE иногда написанные без одинарных кавычек, а иногда и с одиночными кавычками. Только замените YOUR_DATABASE с именем базы данных без .mdf расширения и оставить остальные строки, как это ...

Благодаря этому сайт: Detach database dropping connections

И этот сайт: SQL Server – How to Detach a Database

Кстати, это сработало для меня на SQL SERVER 2014

+0

спасибо, человек, который только что спас мой вечер :) –

Смежные вопросы