【发布时间】:2015-01-26 09:52:05
【问题描述】:
如何通过 C# 应用程序将数据库从远程服务器“克隆”到 LocalDB 数据库?不需要与远程数据库建立关系。
背景
应用程序是使用 .NET 4.5.2 用 C# 编写的,支持两种模式 - 连接到远程 MS SQL Server 数据库的联机模式和连接到LocalDB 数据库的脱机模式。该应用程序主要针对较新版本的服务器(如果重要,只支持 2014 版是可以的)。
在用户下线之前,它应该要求应用程序将远程数据库克隆到LocalDB 数据库(本地数据库被完全覆盖)。本地数据库应该独立于远程数据库,即没有从属或复制。
在线和离线连接字符串都包含各自数据库的名称。应用程序本身不直接知道数据库名称或表名称,因为这是由连接字符串和实体框架管理的。
问题
如何将远程数据库“克隆”到LocalDB 数据库(远程数据库名称和LocalDB 数据库名称可能不同)?
我更喜欢不需要启动外部程序的解决方案,但这不是硬性要求。
问题
通过实体框架复制没有跟踪实体是不可接受的慢。
我知道BACKUP DATABASE和RESTORE DATABASE命令,但我发现了以下困难:
他们要求我指定数据库的名称。有没有办法将它们默认为连接字符串中指定的初始数据库?
RESTORE DATABASE命令包含光盘上各个数据文件的名称和路径(MOVE部分)。有没有办法通过仅指定数据库名称而不提供数据文件路径来处理它?或者如何通过 SQL 命令获取数据文件路径(要获取文件名,我将创建一个空白数据库,获取文件名,可选择删除数据库并使用检索到的文件名)?
有更好的方法吗?
【问题讨论】:
-
我建议使用 SqlBulkCopy 类。它在您的标签中,但您根本没有在文本中提及它。你试过了吗?
-
谢谢,我不知道它实际上是一个类。感谢您的建议,我找到了codeproject.com/Articles/18418/… 并使用提供的
PerformBulkCopy示例代码来构建实际代码。 -
我建议使用 SSIS 包来获取最新数据。您可以使用它进行增量或完全刷新。
-
我很抱歉之前没有说明。用户可以在离线运行时进行(非常有限的)一组更改。然后,当切换到在线时,应用程序会在在线数据上模拟这些变化。因此,为了安全起见,我更喜欢完全重写离线数据库。 SSIS 不包含在 Express 版本中,因此它可能会让我们的生活更加艰难(数据库服务器上的应用程序会产生非常少的流量,因此如果没有更好的部署,Express 版本就可以了)。
-
截断表+老派插入到本地数据库中会起作用。或者 SqlBulkCopy 。您最大的表中有多少条记录?
标签: c# sql-server sqlbulkcopy