SQL Server Express 2008没有分离自动附加文件?

时间:2009-12-14 16:49:07

标签: sql-server sql-server-2008 sql-server-express

SQLEXPRESS的MSDN documentation说:

  

当应用程序首次从正在运行的SQL Server Express实例建立连接时,SQL Server Express将自动附加.mdf文件。当用户关闭应用程序时,SQL Server Express会从实例中分离.mdf文件。

这似乎没有发生。如果我用相同名称的新文件替换MDF文件(当然,在删除日志文件之后)SQL Server Express将拒绝附加它。

我已经尝试了几乎所有连接字符串参数的组合,这让我发疯了。有什么建议吗?

2 个答案:

答案 0 :(得分:4)

分离/关闭确实发生了。如果它不会发生,那么你不可能替换MDF文件,因为它将被使用。您引用的文档并不完全准确。正确的文档位于SQL Server 2005 Express Edition User Instances

  
      
  • 用户实例数据库具有自动   关闭选项设置,以便如果有   8-10没有与数据库的连接   分钟,数据库关闭和   该文件已关闭。有时候是这样的   自动,但它可以采取   而特别是如果连接   池已启用   连接。
  •   
  • 分离数据库   从实例通过调用   sp_detach_db将关闭该文件。这个   是Visual Studio使用的方法   确保数据库文件是   IDE切换时关闭   用户实例。
  •   

如果我冒昧地猜测我会说数据库没有分离但是自动关闭,并且在删除LDF后重新执行MDF将(正确地)在尝试打开数据库时被视为错误。< / p>

附注:

  • 永远不应该删除LDF文件。如果要重新创建数据库,请将MDF和LDF的两者替换为新的。
  • 确保使用正确的MDF和LDF版本进行更换。 SQL Server可以升级数据库,但永远不能降级它。
  • 获取错误。如果SQL Express拒绝附加数据库,则会给出原因。查看RANU创建的ERRORLOG(在用户配置文件中),systen事件日志,或将profiler附加到用户实例。

答案 1 :(得分:0)

    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();
            }
        }
    }