SQL Server LocalDB:在将数据库分离并重新连接到同一台计算机(机器,同一路径)后,无法备份数据库

时间:2016-04-24 07:44:07

标签: c# sql-server backup localdb detach

我的开发环境是C#,SQL Server 2014 LocalDB,SQL Server 2012 Express,Windows 10,Visual Studio 2015。

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

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

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

  

无法打开物理文件,进程无法访问dbfile,因为dbfile正被另一个进程使用

     

BACKUP DATABASE异常终止

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

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

  

无法将'System.DBNull'对象强制转换为'System.String'(Microsoft.SqlServer.Smo)

似乎Microsoft LocalDB Server仍然使用完整路径识别分离的数据库,并且与新附加的数据库混淆(仅限没有完整路径的名称)。

任何出色的创意都将受到高度赞赏!

非常感谢你!

2 个答案:

答案 0 :(得分:2)

在分离localDB时,

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

为了便于解释,在我们关闭餐厅之前,我们必须向餐厅的顾客宣布,“这家餐厅将很快关闭,请完成您的饮食并在关闭餐厅之前到户外”

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

必须避免这些类似的活动以防止鬼(bug?)。

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

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

作为一个错误必须修复的奇怪的事情是,

如果我们从master DB分离localDB,我认为它必须无法以编程方式在代码中打开分离的localDB。但是,像SqlConnection.Open();运行并传递,没有任何异常(错误),并立即创建完整路径鬼。

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

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

希望我的经验可以帮助别人。

答案 1 :(得分:0)

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

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

如果直接运行脚本,则会出现错误,因为您必须删除旧数据(旧/新名称相同),默认情况下脚本使用的是第一行写的db名称,当然您可以删除此行并使用您要使用的新数据库。

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

默认情况下,选择仅为架构。 在运行脚本并删除旧数据后,为sql文件选择目标。你的备份过程应该没有问题。