我目前有一个通过 ODBC 连接到 PostgreSQL 数据库的 MS Access 应用程序。这在有 20 个用户的 LAN 上成功运行(每个用户都运行自己的 Access 版本)。现在我正在考虑一些灾难恢复方案,似乎保护数据的一种快速简便的方法是使用日志传送来创建热备份。
这让我想到了把这个暖备用设备放在一个偏远的地方,但是我有一个问题:
Access 通过 ODBC 连接到远程数据库是否可用?即远程数据库可能在同一个国家,ping 时间还可以,而且我有一条 1mbit SDSL 线路。
简短的回答:是的。
长答案:如果您要返回较小的数据集,是的。您还需要在 pgodbc 驱动程序中启用特定的标志和设置,因为 Access 将拒绝从服务器反馈给它的内容:
KSQO(键集查询优化)应该打开。是的,我知道文档说这不是必需的,但正在发生的事情是 MSAccess 正在向服务器传递一些看起来相当粗糙的 SQL。这只是稍微整理了一下 SQL 语句。不相信我?打开 ODBC 日志记录,发送单个查询,关闭日志,翻过几兆的谷壳,在 90% 的过程中,您会看到生成并传递了一条看起来很糟糕的 SQL 语句。不,这不是ODBC 驱动程序,而是 Access 这样做的。
如果您计划以交互方式查看大型数据集,则应启用使用 Declare/Fetch 。这将导致驱动程序从结果集中获取较小的块,而不是将一个怪物负载转储到其中。
文本为 LongVarChar - 您可能希望对此进行测试。我怀疑你会想要它“打开”。
未知大小应设置为最大值。
Max Varchar建议设置为 254 或更低,但您可以设置更多。
额外选项- 设置为 0x6(假 MS SQL Server + ANSI 而非 Unicode 回复)。
(所有这些都可以在http://psqlodbc.projects.postgresql.org/config.html找到)
请记住,大型数据集会给您带来痛苦,尽管从服务器返回的数据通常是紧凑的二进制格式。
我在 MSA 和 WAN 数据库方面的经验从未如此出色。总会有一段时间,Access 决定从数据库中提取大量数据。我成功的两种方法是将 Access 前端也放在远程服务器上并使用终端服务器。或者使用 SQL Passthrough 查询,以便您明确控制传入/传出数据库服务器的内容。
为了让 Access 应用程序在这种情况下正常工作,它必须被设计为检索最少的数据,并且可能最适合未绑定的表单,因为 Access/Jet/ACE 需要每秒左右 ping 一次远程数据库以刷新数据以绑定的形式显示。由于可以在 Access 中设置 ODBC 刷新间隔,因此在走完全不受约束的极端路线之前应该先试验一下,因为这意味着您将错过使用 Access 作为前端的 90% 的好处。
总的来说,我认为所描述的场景并不特别可行。这将意味着摇摆不定的尾巴,而您的灾难故障转移计划将推动您常规应用程序的设计。我想说让 Windows 终端服务器在远程数据库服务器附近托管应用程序将是一个更好的解决方案,因为它不需要对 Access 应用程序进行重大更改。