如何通过ODBC更新Access表而不加载整个表

时间:2012-09-26 00:25:22

标签: sql ms-access odbc

我正在尝试通过使用ODBC连接从远程PostgreSQL数据库中提取数据来更新本地Access 2010表。当我在Access更新查询中手动指定WHERE条件时,我可以在数据库服务器上看到有限数量的行传递给Access。但是,当我根据本地Access表中的最后一行使WHERE条件动态化---整个表似乎被拉入Access并且条件应用于内存(我认为,因为它永远不会完成。)

例如,此查询仅从远程数据库中提取2012行,我可以在删除服务器上看到WHERE子句:

INSERT INTO local (dt, latitude, longitude)
SELECT dt, latitude, longitude
FROM remote_odbc
WHERE remote_odbc.dt > #2011-12-31 23:59:59#;

但我真正想要的是访问查看本地表中的最后一个日期时间(dt)并仅从远程数据库中检索这些行。

这就是我的尝试:

INSERT INTO local (dt, latitude, longitude)
SELECT dt, latitude, longitude
FROM remote_odbc, (SELECT max(dt) AS max_dt FROM local) AS sub
WHERE remote_odbc.dt > max_dt;

当我这样做时,在服务器上运行的查询根本没有WHERE子句,这让我觉得Access正在检索整个远程表,然后在本地应用WHERE子句。该表太大,因特网太慢而无法实现。

如何重新编写更新查询,以便只通过ODBC链接检索我想要的行?

1 个答案:

答案 0 :(得分:1)

“FROM remote_odbc,(...)AS sub”让我怀疑这是问题的原因。请尝试使用此INSERT语句...

INSERT INTO local (dt, latitude, longitude)
SELECT dt, latitude, longitude
FROM remote_odbc
WHERE remote_odbc.dt > DMax("dt", "local");

由于您报告建议未限制发送回Access的服务器行,因此请使用参数查询在WHERE子句中放置单个日期/时间值。以下过程可能不适合您当前的应用程序上下文,但我提供它更像是一个诊断测试......看看我们是否能够正常工作。

Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim dteLast As Date
Dim strInsert As String

dteLast = DMax("dt", "local")
Debug.Print "dteLast: " & dteLast
Set db = CurrentDb
strInsert = "PARAMETERS which_date DateTime;" & vbCrLf & _
    "INSERT INTO local (dt, latitude, longitude)" & vbCrLf & _
    "SELECT dt, latitude, longitude" & vbCrLf & _
    "FROM remote_odbc" & vbCrLf & _
    "WHERE remote_odbc.dt > which_date;"
Debug.Print "strInsert:" & vbCrLf & strInsert
Set qdf = db.CreateQueryDef("", strInsert)
qdf.Parameters("which_date") = dteLast
qdf.Execute dbFailOnError
Set qdf = Nothing
Set db = Nothing

请注意,代码未经测试,因为我没有要使用的表和示例数据。但是,它在Access 2007中编译时没有错误。

相关问题