从另一个DB访问SQL Query

时间:2013-11-19 16:18:45

标签: ms-access access-vba

我想将SQL查询应用于一个Access表,从该表中检索另一个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表?

2 个答案:

答案 0 :(得分:1)

您不希望在外部数据库中使用指向该表的链接,但是当您想要使用DAvg时,该选择会很复杂。但是,由于您使用VBA代码执行此操作,因此您可以放弃DAvg并按两个步骤执行所需操作:

  1. 首先从外部表中检索平均值。
  2. UPDATE
  3. 中使用第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)会给你零而不是空。

    然后,您可以对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
    

答案 1 :(得分:0)

你能不能一步到位吗?将第一个SQL的输出作为输入合并到第二个“

中的”set“

换句话说,绕过第一个查询,然后使用它作为“strUpdate”字符串执行第二个查询:

strUpdate = "UPDATE TableInCurrentDB" & vbCrLf & _
    "SET [Field1InCurrentDB]=" & vbCrLf & _
    "  (SELECT Val(Nz(Avg(Field1InExternalDB),0))" & vbCrLf & _
    "   FROM TableInExternalDB IN 'C:\VB\ExternalDB.accdb'" & vbCrLf & _
    "   WHERE Field2InExternalDB=Year(Date()) )" & vbCrLf & _
    "WHERE [Field2InCurrentDB]='1';"