我有一个数据库" 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();
但是收到错误:
' \'
附近的语法不正确
答案 0 :(得分:6)
你在查询中省略了一个引用,正如@KyleHale指出的那样 - 它需要是数据库的名称,而不是它的路径。
变化:
cmd.CommandText = @"sys.sp_detach_db D:\MDF CONNECTION SAMPLE\BIN\DEBUG\HARMDATABASE.MDF;";
是:
cmd.CommandText = @"sys.sp_detach_db 'dbName'";
答案 1 :(得分:5)
为了分离数据库并同时解决错误
无法分离数据库'YOUR_DATABASE',因为它当前正在使用
您只需使用以下代码:
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 有时会在没有单引号的情况下编写,有时也会使用单引号。只使用没有 .mdf 扩展名的数据库名称替换 YOUR_DATABASE ,并保留字符串的其余部分......
感谢此网站:Detach database dropping connections
这个网站:SQL Server – How to Detach a Database
顺便说一句,这在SQL SERVER 2014上对我有用
答案 2 :(得分: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);
}