在 Access 97 的 SQL 查询中访问另一个受密码保护的数据库
Posted
技术标签:
【中文标题】在 Access 97 的 SQL 查询中访问另一个受密码保护的数据库【英文标题】:Accessing another password protected database in an SQL query in Access 97 【发布时间】:2014-07-05 13:48:11 【问题描述】:我目前正在处理 Access 97 的 SQL 查询。给定以下表格(出于演示目的进行了简化),每个表格都位于单独的 mdb 文件中:
C:\db\db1.mdb 中的表1:
PartyId (PK) Name
------------ --------
1 A
2 B
3 C
C:\db\db2.mdb 中的表2:
PartyId (PK) Date (PK) Value
------------ --------- -----
1 6/30/2014 4
1 7/1/2014 8
2 5/3/2014 3
3 5/5/2014 5
3 5/3/2014 1
3 5/2/2014 2
在这里,我想根据定义的日期查找每一方的最新值。因此,假设我将 7/5/2014 标记为目标日期,那么我的查询应返回以下内容:
PartyId Name Date Value
------- ---- -------- -----
1 A 7/1/2014 8
2 B 5/3/2014 3
3 C 5/5/2014 5
我在 C:\db\db1.mdb 数据库中创建了以下查询:
SELECT T.TPartyId, Name, T.TDate, T.TValue
FROM Table1 INNER JOIN [
SELECT Table2.PartyId AS TPartyId, MAX(Table2.Date) AS TDate, FIRST(Value) AS TValue
FROM Table2 IN 'C:\db\db2.mdb'
WHERE Table2.Date <= #7/5/2014#
GROUP BY Table2.PartyId]. AS T
ON (Table1.PartyId = T.TPartyId);
问题在于 Table2 实际上位于受密码保护的数据库文件中。因此,我尝试按照http://support.microsoft.com/kb/113701 中的说明将查询修改为以下内容:
SELECT T.TPartyId, Name, T.TDate, T.TValue
FROM Table1 INNER JOIN [
SELECT Table2.PartyId AS TPartyId, MAX(Table2.Date) AS TDate, FIRST(Value) AS TValue
FROM [;database=C:\db\db2.mdb;PWD=mypwd].Table2
WHERE Table2.Date <= #7/5/2014#
GROUP BY Table2.PartyId]. AS T
ON (Table1.PartyId = T.TPartyId);
但是,这总是会导致语法错误。我怀疑在
INNER JOIN [ … [;database= … ] … ]
语句是失败的原因。不幸的是,Access 97 总是要求别名用方括号括起来,后跟一个句点,而 Access 2000 和更高版本没有这个限制。有什么方法可以用 Access 97 完成这个查询吗?谢谢。
【问题讨论】:
我怀疑是一个老错误。自从我使用'97以来已经很长时间了,但是您是否尝试过在SQL视图中编辑并将INNER JOIN [...]
替换为INNER JOIN (...)
这曾经在2000年工作,但是一旦您在设计视图中打开,查询就会被破坏再次。
@Remou 是的,我在 Access 2000 上也观察到了这种行为。不幸的是,Access 97 不支持INNER JOIN (...)
语法并将其归类为语法错误。因此,我不得不使用INNER JOIN [...]
语法。
只是猜测..,您是否在代码中尝试过(...),而不是查询设计窗口?
@Remou 当我在代码中创建查询时(例如,在 VBA 中通过 ADO 接口),同时使用 INNER JOIN (... [;database=...] ...)
语法,限制就消失了。这与 Access 2000 及更高版本表现出的行为相同。因此,该语法似乎与 Access 97 拒绝支持的合法 JET 语句有关。不幸的是,将查询外包到代码中并不是一个可行的选择,因为我正在处理的任务需要将查询嵌入到访问数据库中。
我的意思是你可以使用 DAO 来构建保存的查询查询:qdf.sql = ...
吗?这只是一个模糊的希望。
【参考方案1】:
最后,经过无数次反复试验,我找到了解决方案。这条线似乎可行,并且还避免了将两个左方括号放在一起:
FROM Table2 IN '' ';database=C:\db\db2.mdb;PWD=mypwd'
很遗憾,这没有以适当的方式记录在某处。
【讨论】:
【参考方案2】:Create Qry1 ="SELECT Table2.PartyId AS TPartyId,
MAX(Table2.Date) AS TDate, FIRST(Value) AS TValue
FROM [;database=C:\db\db2.mdb;PWD=mypwd].Table2
WHERE Table2.Date <= #7/5/2014#
GROUP BY Table2.PartyId "
SELECT T.TPartyId, Name, T.TDate, T.TValue
FROM Table1 INNER JOIN Qry1
ON (Table1.PartyId = Qry1.TPartyId);
【讨论】:
以上是关于在 Access 97 的 SQL 查询中访问另一个受密码保护的数据库的主要内容,如果未能解决你的问题,请参考以下文章
使用带有日期的 C# 在 MS Access 97 数据库中清除查询
无法使用 Ucanaccess 3.0.6 将值插入 access 97。它显示访问是只读的