我的开发环境是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仍然使用完整路径识别分离的数据库,并且与新附加的数据库混淆(仅限没有完整路径的名称)。
任何出色的创意都将受到高度赞赏!
非常感谢你!
答案 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文件选择目标。你的备份过程应该没有问题。