通过拨号连接批量复制SQL数据的最佳方法是什么?

时间:2009-01-13 20:05:29

标签: c# sql-server ras

我需要一些远程SQL服务器来定期提取大量数据(比如每台服务器5,000,000行)。此数据还需要格式化并FTP到另一台服务器。拨号部分很好,我可以连接并与服务器通信,但有时连接速度很慢,可能只有19Kbps。

连接后,我尝试使用System.Data.SqlClient.SqlBulkCopy,但它只是抛出超时错误。我已将批量复制的超时设置为7200秒,并将连接字符串的超时设置为900秒,但它仍然在30秒左右超时。

我尝试使用DataReader并运行SqlCommand.ExecuteNonQuery()来插入每一行,这样可行,但速度很慢,有时会失去连接。

我还尝试在远程服务器上设置DTS包,安排它们转储我需要的文本数据,然后尝试下载文件。但是,它们可能是几百MB(在某些服务器上可能甚至是GB),拨号连接通常会在某些时候丢弃。

7 个答案:

答案 0 :(得分:2)

如果是一个选项,请将其拉​​上,ftp并在您身边进行批量插入。

答案 1 :(得分:1)

距离多少英里?你可以偷DVD吗?

答案 2 :(得分:1)

关于这个主题的一些想法:

  • 在源头构建一个例程来提取 将数据分成几个 较小的文件。 FTP文件 单独检查一下 mechansim确保他们拥有所有 到达。

  • 如果您可以在源代码中识别已更改的数据或新数据,请在源代码中添加某种更改的数据捕获功能,并仅发送增量(如果您已经这样做,请道歉)。

  • 压缩分块文件以减少要发送的数据大小。

答案 3 :(得分:0)

使用ZIP格式压缩数据,它内置于.NET

http://www.windowsdevcenter.com/pub/a/windows/2006/09/12/using-data-compression-in-net-20.html

如果数据仍然太大,您可以尝试使用外部库/可执行文件来RAR或7Zip数据,因为它的大小将是ZIP副本的一半。

答案 4 :(得分:0)

bcp.exe支持“out”参数,该参数允许您将SQL语句的输出转储到平面文本文件。

  • 在源端:将文件转储,压缩并拆分成较小的部分,上传
  • 在目标端:完成所有文件后,下载,解压缩并重新加入文件,然后bcp in。

这不是一个优雅的解决方案。如果你想以编程方式进行,那么你将进行过程调用。但是,它确实完成了工作。

然而,您可能想要问的问题是,如何在没有宽带连接的情况下创建解决方案(如果可能的话),是否具有成本效益。我希望无论您决定使用什么解决方案,使用拨号都会遇到持续的维护问题。

答案 5 :(得分:0)

您可能希望使用组合方法。

  • BCP以原生格式输出表格。

  • 使用可生成一系列文件的工具压缩文件。

  • ftp各个文件。你将能够继续传输。

我发现7Zip(免费开源)具有最佳压缩效果,并且会生成一系列您指定大小的编号文件。我相信它可以从命令行运行。

HTH 安迪

答案 6 :(得分:0)

我最终做的是在C中创建一个小应用程序(其中一些是WINNT,这是最简单的方法,它还允许其他人在必要时手动检索数据而无需更改源代码)一些参数来构建我需要的查询。然后它运行查询并以所需的CSV格式转储结果。然后它调用具有最高压缩级别的7zip来尽可能小地压缩数据(这会将500MB文件减少到大约20MB)。

因为我必须先把数据带回给我,然后才能把它发送到必要的地方,而且远程服务器没有任何互联网访问权限,我仍然只是将文件复制到Windows共享,然后解压缩它本地并将未压缩的数据(按要求)FTP到它的目的地。

这可能不是最好的方法,但它正在发挥作用。感谢