以编程方式分离数据库

6

我有一个名为 "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();

但是出现了错误:

“\” 附近的语法不正确。

3个回答

7
为了分离数据库并同时解决错误
“无法分离数据库'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 扩展名,其余字符串保持不变。
感谢以下网站:Detach database dropping connectionsSQL Server – How to Detach a Database
顺便说一下,在 SQL SERVER 2014 上对我有效。

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值),而不是文件路径。 - Kyle Hale
是的,我漏掉了那个。我更新了我的答案。谢谢你指出来! - Ruslan
谢谢。但现在出现了这个错误:无法分离数据库 'D:\MDF CONNECTION SAMPLE\BIN\DEBUG\HARMDATABASE.MDF',因为它当前正在使用中。 - user3812553
我的数据库名称是'D:\ MDF CONNECTION SAMPLE \ BIN \ DEBUG \ HARMDATABASE.MDF'。当我从目录附加MDF文件时,数据库名称就是它。 - user3812553
路径是你的数据库的名称吗?它是在 SQL Management Studio 左侧看到的,在那里列出了数据库的名称吗?整个路径都是吗? - Ruslan
显示剩余3条评论

5

使用SMO怎么样?

你需要添加对Microsoft.SqlServer.Smo的引用,该引用可在你的开发计算机上安装了SQL Express或SQL Server后获得。

using Microsoft.SqlServer.Management.Smo;

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

我在我的系统中找不到 Microsoft.SqlServer.Smo.dll。 - user3812553
1
你需要添加对Microsoft.SqlServer.Smo的引用,当你在开发机器上安装了SQL Express或SQL Server时它是可用的。请查看上面的SMO链接。 - C-Pound Guru

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接