我想对一个 Access 表应用 SQL 查询,并从中检索另一个 Access 文件中的表中的数据。我环顾四周,似乎无法找到可行的解决方案。
基于此来源 http://support.microsoft.com/kb/113701 ,我想出了以下内容,但仍然没有运气。
sSQL = "UPDATE TableInCurrentDB
SET [Field1InCurrentDB]= DAvg('Field1InExternalDB','[;database=C:\VB\ExternalDB.accdb].[TableInExternalDB]','Field2InExternalDB= & Year(Now()) & ')
WHERE [Field2InCurrentDB]='1';"
DoCmd.RunSQL sSQL
我知道错误出在对外部数据库的引用中,因为如果表位于同一数据库中,代码可以正常工作。但是,很难准确判断出了什么问题,因为我得到的错误是“未知”。
如何修改此语句以从另一个 Access 数据库的表更新 Access 表?
最佳答案
您不希望使用外部数据库中表的链接,但当您想要使用 DAvg
时,这种选择会很复杂。但是,由于您使用 VBA 代码执行此操作,因此您可以放弃 DAvg
并通过 2 个步骤完成您需要的操作:
- 首先从外部表中检索平均值。
- 在
更新
中使用第 1 步的平均值。
对于第 1 步,在 Access 查询设计器中将其作为新查询进行测试...
SELECT Avg(Field1InExternalDB)
FROM TableInExternalDB IN 'C:\VB\ExternalDB.accdb'
WHERE Field2InExternalDB=Year(Date());
假设查询返回正确的值,请调整您的 VBA 代码以检索相同的值。
Dim db As DAO.database
Dim strSelect As String
Dim varAvg As Variant
strSelect = "SELECT Avg(Field1InExternalDB)" & vbCrLf & _
"FROM TableInExternalDB IN 'C:\VB\ExternalDB.accdb'" & vbCrLf & _
"WHERE Field2InExternalDB=Year(Date());"
'Debug.Print strSelect
Set db = CurrentDb
varAvg = db.OpenRecordset(strSelect)(0)
Debug.Print Nz(varAvg, 0) ' see note
请注意,当没有行包含与当前年份匹配的 Field2InExternalDB
值时,查询将返回 Null。这就是 varAvg
被声明为 Variant
的原因。稍后 Nz(varAvg, 0)
将为您提供零而不是 Null。
然后,您可以对 UPDATE
使用参数查询并提供 Nz(varAvg, 0)
作为参数值。
Dim qdf As DAO.QueryDef
Dim strUpdate As String
strUpdate = "UPDATE TableInCurrentDB" & vbCrLf & _
"SET [Field1InCurrentDB]=[pAvg]" & vbCrLf & _
"WHERE [Field2InCurrentDB]='1';"
'Debug.Print strUpdate
Set qdf = db.CreateQueryDef(vbNullString, strUpdate)
qdf.Parameters("pAvg") = Nz(varAvg, 0)
qdf.Execute dbFailOnError
Set qdf = Nothing
Set db = Nothing
关于ms-access - 从另一个数据库 Access SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20076622/