0

我有一些远程 SQL 服务器,我需要定期从中提取大量数据(例如每台服务器 5,000,000 行)。此数据还需要格式化并通过 FTP 传输到另一台服务器。拨号部分没问题,我可以和服务器连接和通信,但有时连接很慢,可能只有19Kbps。

连接后,我尝试使用 System.Data.SqlClient.SqlBulkCopy,但它只会引发超时错误。我已将大容量复制的超时设置为 7200 秒,将每个数据库的连接字符串的超时设置为 900 秒,但它仍然在 30 秒左右超时。

我尝试使用 DataReader 并运行 SqlCommand.ExecuteNonQuery() 来插入每一行,这可以正常工作,但是速度很慢,有时连接会丢失。

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

4

7 回答 7

2

如果可以选择,请将其拉​​上拉链,ftp 并在您身边进行批量插入。

于 2009-01-13T20:09:35.153 回答
1

它有多少英里远?你能打出 DVD 吗?

于 2009-01-13T20:07:57.557 回答
1

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

  • 从源头构建例程以提取数据并将其分割成几个较小的文件。单独 FTP 文件并进行一些检查机制以确保它们都已到达。

  • 如果您可以从源头识别更改的或新的数据,请在源头放置某种更改的数据捕获功能,并且只发送增量(如果您已经这样做了,请道歉)。

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

于 2009-01-13T20:17:29.550 回答
0

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

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

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

于 2009-01-13T20:09:19.443 回答
0

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

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

这不是一个优雅的解决方案。如果您想以编程方式执行此操作,您将进行流程调用。但是,它确实完成了工作。

但是,您可能想问的问题是,围绕没有宽带连接与获得宽带连接(如果可能)的限制创建解决方案的成本效益如何。我希望无论您决定采用何种解决方案,使用拨号都会遇到持续的维护问题。

于 2009-01-13T20:46:05.547 回答
0

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

  • BCP 以本机格式输出表。

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

  • ftp 单个文件。您将能够继续传输。

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

HTH安迪

于 2009-01-14T00:33:09.613 回答
0

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

因为我必须先将数据带回给我,然后才能将其 FTP 到必要的位置,并且远程服务器没有任何 Internet 访问权限,所以我仍然只是将文件复制到 Windows 共享,然后在本地解压缩并将未压缩的数据(按要求)通过 FTP 传输到其目的地。

这可能不是最好的方法,但它正在工作。谢谢

于 2009-01-14T16:15:58.697 回答