【问题标题】:How to insert Records to SQL/Server from Access to SQL/Server using "Insert Into" with slow connection如何在连接速度较慢的情况下使用“插入”将记录从访问 SQL/Server 插入 SQL/Server
【发布时间】:2010-05-05 22:30:16
【问题描述】:

这是我尝试过的。我还有什么遗漏或应该尝试的?

我的情况:

  • SQL/Server 在另一个国家 - 直接互联网连接 不可靠,专线 成本高昂,线路状况不断变化(ping 180 到 500+)
  • 通过 VPN 连接访问 SQL/Server - 非常慢但干净/可靠
  • 在美国访问 ACCDB (ace) 数据库 - 容量小,工作正常
  • 需要“插入select * from”

我已经尝试了以下所有方法:

DAO - (currentdb.execute) 运行 Access SQL,OLEDB 通过 VPN 连接到远程 SQL/Server - 可以使用“插入”非常慢。

使用 Access SQL 的 ADO - 更慢。

仅OLEDB,向远程SQL/Server发出的SQL命令看不到本地ACCDB文件,所以你必须循环遍历记录集,为每条记录建立一条SQL语句。非常慢。大量额外的编码。

OLEDB 访问 SQL/Server 的链接表。读取数据快,插入记录很慢。

SQL/Server 两端。本地 SQL/Server 将表链接到 ACCDB 和远程服务器。工作,但不提高速度。插入 1000 条相当小的记录需要 5 分钟以上。

批量插入。不能那样做,源数据不是文本文件,是ACCDB。这不是一次性转换,而是每天更新/更改的记录。

SSIS -- 看起来很快,因为我能够快速迁移整个数据库,但对于日常使用普通的插入和删除操作来说似乎不太合适或不方便。

尚未尝试:SQL/Server 订阅者-发布者镜像/复制以将远程表“虚拟”保持在本地。

因此,令人惊讶的是,我发现远程 ACCDB(无 SQL/Server)的 DAO 的工作速度比通过 VPN 的 SQL/Server 快 20 倍。但是,我更愿意使用 SQL/Server。

我还有什么遗漏或应该尝试的?

【问题讨论】:

  • 我不做这种事情,但是有一种方法可以在使用批处理模式的 ADO 中执行 DML。使用 ODBC 的问题在于它将每条记录作为独立的插入发送,因此您需要将其强制为批处理模式插入,据我所知,ADO 方法是唯一的方法。但是我没有将此作为答案发布,因为我的建议涉及过多的挥手! :)
  • 感谢您的想法——我开始使用 SqlBulkCopy 类进行查找。有谁知道如何在 T-SQL 中执行此操作,还是只有 ADO.NET?我会单独发一篇文章。

标签: sql-server ms-access ms-access-2007


【解决方案1】:

在 SQL Server & 上启用了双重检查 TCP/IP 连接,并且客户端实际上正在使用(而不是命名管道) - 如果您在连接字符串的末尾使用 OLEDB 棒 ;Network Library=DBMSSOCN 来强制执行此操作。

您是否尝试过从远程 SQL 服务器“拉取”?即您的应用程序调用一个使用 OPENROWSET/OPENQUERY 从本地 SQL 服务器提取数据的存储过程? - 适用于非对称上/下速度的连接。

【讨论】:

  • 有趣 - 谢谢。我正在使用 SSMS 进行测试。 TCP/IP 和命名管道在远程服务器上启用。如何强制使用 SSMS?回复:拉——要拉的数据在 Access 数据库中,但 ACCDB 可以作为链接服务器添加到本地 SQL/Server。远程上的 OpenRowSet 查询会看到它吗?我会试试的。
  • 在 SMSS 中单击登录对话框上的选项后,它应该位于连接选项选项卡上。从访问中拉取(这只是一个文件而不是服务器托管的应用程序)的问题是它可能必须通过网络拉取整个文件。
  • 谢谢。也许我不明白如何跨服务器插入记录。我的 SQL 命令在我的本地 SQL 服务器上运行为 "Insert into vpn.db.dbo.table (fieldlist) select (fieldlist) from openrowset('Microsoft.ace.oledb.12.0','z:\myfile.accdb', mytable ) 其中vp​​n是链接服务器有连接信息,所以我把tcp:放在IP地址前面,不应该强制吗?没有速度差异。有没有更好的方法?
  • 接下来我会尝试拉取;不完全确定如何,但我认为我需要一个链接服务器来访问本地数据库并在远程运行此查询:从 openrowset 插入远程表(字段列表)选择(字段列表)( on local>) .我有正确的想法吗?
  • 拉取假设我可以从远程访问本地服务器,例如 IP 地址。我正在使用无法从远程访问的本地 SQL/Express 进行测试,所以我必须设置一个不同的环境,对吗?远程必须能够连接到本地。仅在本地的 SSMS 中拥有两台服务器无济于事。
猜你喜欢
  • 2015-09-29
  • 2016-06-02
  • 1970-01-01
  • 1970-01-01
  • 2015-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多