SQL 服务器 LocalDB:将数据库分离并重新附加到同一台计算机(机器,相同路径)后,无法备份数据库

SQL Server LocalDB: after detach and re-attach database to same computer(machine, same path), cannot backup database

我的开发环境是C#,SQLServer 2014 LocalDB,SQLServer 2012 Express,Windows10,Visual Studio2015.

当我的应用程序的用户需要将他们的 localDB (.mdf) 文件移动到另一个地方,另一台计算机(LocalDB 服务器),从计算机 A 分离并连接到计算机 B 然后,我们可以 运行备份数据库命令成功。

但是,如果用户错误地分离或用户改变主意继续使用计算机 A,我的应用程序必须能够将分离的 LocalDB 数据库文件 (.mdf) 重新附加到同一台计算机(相同的 LocalDB 服务器)。

当我的应用程序成功将数据库文件重新附加到同一台计算机后,我 运行 BACKUP DATABASE 命令时,错误消息显示为,

Unable to open physical file, The process cannot access the dbfile because the dbfile is in use by another process

BACKUP DATABASE terminated abnormally

因此,我进入了 Microsoft Server Management Studio,可以看到 2 个具有特定名称的 dbfile,第一个是 greendb.mdf(仅名称),第二个是 c:\users\kay\appdata\greendb.mdf(具有完整路径)。

我认为 c:\users\kay\appdata\greendb.mdf(带完整路径)是在分离数据库时创建的。当我通过 security-login-kay-user 映射单击它时,与其他数据库在内部显示其权限不同,具有完整路径的分离数据库不显示其权限并显示错误消息,如

Unable to cast 'System.DBNull' object to 'System.String' (Microsoft.SqlServer.Smo)

Microsoft LocalDB Server 似乎仍能识别具有完整路径的分离数据库,并与新附加的数据库混淆(只有名称而没有完整路径)。

任何优秀的想法将不胜感激!

非常感谢!

好吧,我使用附加和分离操作进行了大量工作,最后我发现对于我们开发人员来说,最佳实践是使用脚本。

因此,如果您想(分离)您的数据库以使用新名称或相同名称再次重新(附加)。我建议您为您的数据库生成脚本并重新编写脚本。

如果你直接运行脚本你会得到一个错误,因为你必须删除旧数据(旧/新具有相同的名称)并且脚本默认使用写入的数据库名称在第一行,确定你可以删除这一行并使用你想使用的新数据库。

  • 对于包含数据的脚本数据库,请确保从向导中设置首选项(高级设置 => 仅模式/仅数据/模式和数据。)选择模式和数据

默认情况下,选择仅模式。 在 运行 脚本并删除旧数据之后,为您的 sql 文件选择一个目的地。您的备份过程应该没有问题。

在分离 localDB 时,

我们必须先运行 ALTER DATABASE ROLLBACK IMMEDIATE 命令来终止所有未完成的事务。

简单解释一下,在我们关闭餐厅之前,我们必须向餐厅的顾客宣布,'This Restaurant will be closed very soon, please complete your eating and get outside before closing of Restaurant'

如果您需要将 localDB 重新连接到同一台计算机(同一台 localDB 服务器),

必须避免此类活动以防止幽灵(错误?)。

1) 尝试以编程方式在代码中打开 localDB

2) 似乎用分离的localDB的名称计数也提醒localDB服务器存在localDB。(SELECT master数据库中的COUNT dbname命令)

奇怪的是,必须作为错误修复,

如果我们从主数据库中分离一个 localDB,我认为它必须不能以编程方式在代码中打开分离的 localDB。但是,像 SqlConnection.Open(); 这样的代码运行s 并无任何异常(错误)通过并立即创建完整路径重影。

似乎在主数据库上删除了分离的 localDB 的名称,但服务器通过提供的连接字符串中的物理路径连接分离的 localDB。

为了决定是否需要附加一些 localDB 或检查它是否已分离,我开发了自己的解决方案(简单代码)来执行此操作。

希望我的经验对其他人有所帮助。