【问题标题】:Detach database programmatically以编程方式分离数据库
【发布时间】:2014-11-14 13:16:50
【问题描述】:

我有一个数据库“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();

但出现错误:

'\' 附近的语法不正确。

【问题讨论】:

    标签: c# sql-server tsql ado.net


    【解决方案1】:

    您在查询中遗漏了一个引号,正如@KyleHale 指出的那样 - 它需要是数据库的名称,而不是它的路径。

    变化:

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

    成为:

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

    【讨论】:

    • 另外,sp_detach_db 采用数据库名称(它必须是有效的 sysname 值),而不是文件路径。
    • 是的,错过了。更新了我的答案。感谢您的关注!
    • 谢谢。但是现在出现这个错误:Cannot detach the database 'D:\MDF CONNECTION SAMPLE\BIN\DEBUG\HARMDATABASE.MDF' because it is current in use.
    • 我的 dbname 是 'D:\MDF CONNECTION SAMPLE\BIN\DEBUG\HARMDATABASE.MDF'。当我从目录附加 mdf 文件时,数据库名称就是它。
    • 路径是你数据库的名字?这是您在 SQL Management Studio 左侧看到的,其中列出了数据库?整条路?
    【解决方案2】:

    为了分离数据库同时解决错误

    无法分离数据库“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 有时不用单引号,有时用单引号。仅将 YOUR_DATABASE 替换为没有 .mdf 扩展名的数据库名称,并将字符串的其余部分保持原样...

    感谢这个网站:Detach database dropping connections

    还有这个网站:SQL Server – How to Detach a Database

    顺便说一句,这在 SQL SERVER 2014 上对我有用

    【讨论】:

      【解决方案3】:

      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。
      • 您需要添加对 Microsoft.SqlServer.Smo 的引用,当您的开发计算机上安装了 SQL Express 或 SQL Server 时,该引用可用。查看上面的 SMO 链接。
      猜你喜欢
      • 2010-10-19
      • 2015-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-09
      • 2015-05-24
      • 2018-11-27
      • 1970-01-01
      相关资源
      最近更新 更多