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

发布于 2024-08-14 10:59:01 字数 408 浏览 2 评论 0原文

SQLEXPRESS 的 MSDN 文档 说:

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

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

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

The MSDN documentation for SQLEXPRESS says:

When an application first establishes a connection from a running instance of SQL Server Express, SQL Server Express will automatically attach an .mdf file. When the user closes the application, SQL Server Express detaches the .mdf file from the instance.

This does not appear to be happening. If I replace the MDF file with a new one of the same name (after deleting the log file, of course) SQL Server Express will refuse to attach it.

I've tried just about every combination of connection string parameters possible, and it's driving me crazy. Any suggestions?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

苏佲洛 2024-08-21 10:59:01

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

  • 用户实例数据库具有 Auto
    关闭选项集
    ,这样如果有
    8-10 没有与数据库的连接
    分钟,数据库关闭并且
    文件已关闭。发生这种情况
    自动,但可能需要一段时间
    同时,特别是如果连接
    已为您启用池化
    连接。
  • 分离数据库
    通过调用从实例中
    sp_detach_db 将关闭该文件。这
    是 Visual Studio 使用的方法

    确保数据库文件是
    当 IDE 之间切换时关闭
    用户实例。

如果我大胆猜测,我会说数据库没有分离,而是自动关闭,并且在删除 LDF 后重新写入 MDF 将在尝试打开数据库时(正确地)被视为错误。

作为旁注:

  • 永远不应该删除 LDF 文件。如果要替换数据库,请将 MDF 和 LDF 都替换为新数据库。
  • 确保更换为正确的 MDF 和 LDF 版本。 SQL Server 可以升级数据库,但永远不能降级。
  • 得到错误。如果 SQL Express 拒绝附加数据库,它会给出一个原因。查看 RANU 创建的错误日志(在用户配置文件中)、系统事件日志,或将探查器附加到用户实例。

The detach/close does happen. If it wouldn't happen then you could not possibly replace the MDF file, because it would be in use. The documentation you quote is not entirely accurate. The correct documentation is at SQL Server 2005 Express Edition User Instances:

  • User instance databases have the Auto
    Close option set
    so that if there are
    no connections to a database for 8-10
    minutes, the database shuts down and
    the file is closed. This happens
    automatically, but it can take a
    while, especially if connection
    pooling is enabled for your
    connections.
  • Detaching the database
    from the instance by calling
    sp_detach_db will close the file. This
    is the method Visual Studio uses
    to
    ensure that the database file is
    closed when the IDE switches between
    user instances.

If I'd venture a guess I'd say that the database is not detached but auto-closed, and replcing the MDF after deleting the LDF will be (rightfully) seen as an error when trying to open the database.

As side notes:

  • One should never ever delete the LDF file. If you want to replce the database, replace both the MDF and the LDF with the new ones.
  • Make sure you replace with proper MDF and LDF versions. SQL Server can upgrade a database, but can never downgrade it.
  • Get the error. If SQL Express refuses to attach a database, it will give a reason. Look into the RANU created ERRORLOG (in the user profile), the systen event log, or attach profiler to the user instance.
神仙妹妹 2024-08-21 10:59:01
    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();
            }
        }
    }
    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();
            }
        }
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文