Ms access 忽略OBDC查询上的连接错误

Ms access 忽略OBDC查询上的连接错误,ms-access,Ms Access,我有一个查询,它连接到几个远程机器,将数据合并到一个表中。当所有机器都已连接时,它可以正常工作,但有时任何给定的机器都可能被关闭(这会导致错误),我希望我的查询忽略任何不可用的连接,并继续查询的其余部分。有没有办法做到这一点 我正在使用带有OBDC连接的链接表(驱动程序:MySql ODBC 5.3 Ansi驱动程序) 我的问题是: SELECT "HX32" AS workcenter, "HX32." & [HX32].[dataid] AS tbldataid, HX32.data

我有一个查询,它连接到几个远程机器,将数据合并到一个表中。当所有机器都已连接时,它可以正常工作,但有时任何给定的机器都可能被关闭(这会导致错误),我希望我的查询忽略任何不可用的连接,并继续查询的其余部分。有没有办法做到这一点

我正在使用带有OBDC连接的链接表(驱动程序:MySql ODBC 5.3 Ansi驱动程序)

我的问题是:

SELECT "HX32" AS workcenter, "HX32." & [HX32].[dataid] AS tbldataid, HX32.dataid AS dataid, HX32.TS, DMin("[TS]","[HX32]","[TS] > #" & [TS] & "#") AS EndTS, DateDiff("s",[TS],EndTS) AS durationsec, Format(Int([durationsec]/86400)) & " " & Format([durationsec]/86400,"hh:nn:ss") AS duration, Format(TS,"mm/dd/yyyy") AS [Day], Switch(incycle=0,'Down',incycle=1,'Running') AS Status
FROM HX32
WHERE (((HX32.TS)>Date()-3) AND ((HX32.incycle)=0))

UNION ALL 

SELECT "VL65A" AS workcenter, "VL65A." & [VL65A].[dataid] AS tbldataid, VL65A.dataid AS dataid, VL65A.TS, DMin("[TS]","[VL65A]","[TS] > #" & [TS] & "#") AS EndTS, DateDiff("s",[TS],EndTS) AS durationsec, Format(Int([durationsec]/86400)) & " " & Format([durationsec]/86400,"hh:nn:ss") AS duration, Format(TS,"mm/dd/yyyy") AS [Day], Switch(incycle=0,'Down',incycle=1,'Running') AS Status
FROM VL65A
WHERE (((VL65A.TS)>Date()-3) AND ((VL65A.incycle)=0))

UNION ALL 

SELECT "VL68B" AS workcenter, "VL68B." & [VL68B].[dataid] AS tbldataid, VL68B.dataid AS dataid, VL68B.TS, DMin("[TS]","[VL68B]","[TS] > #" & [TS] & "#") AS EndTS, DateDiff("s",[TS],EndTS) AS durationsec, Format(Int([durationsec]/86400)) & " " & Format([durationsec]/86400,"hh:nn:ss") AS duration, Format(TS,"mm/dd/yyyy") AS [Day], Switch(incycle=0,'Down',incycle=1,'Running') AS Status
FROM VL68B
WHERE (((VL68B.TS)>Date()-3) AND ((VL68B.incycle)=0))
;

我最终使用VBA解决了per@Erik的评论:

它循环检查每个连接,如果连接良好,它将修改查询并运行

Dim cnn As ADODB.Connection
Dim canConnect As Boolean
Set cnn = New ADODB.Connection

Dim conctns As Variant
Dim conctn As Variant

conctns = Array("HX32", "VL65A", "VL68B")

For Each conctn In conctns

    On Error GoTo sub_error

    cnn.Open conctn
    If cnn.State = adStateOpen Then
        canConnect = True

        strSQL = "SELECT '" & conctn & "' AS workcenter, '" & conctn & ".' & [" & conctn & "].[dataid] AS tbldataid, " & conctn & ".dataid AS dataid, " & conctn & ".TS, DMin('[TS]','[" & conctn & "]','[TS] > #' & [TS] & '#') AS EndTS, DateDiff('s',[TS],EndTS) AS durationsec, Format(Int([durationsec]/86400)) & ' ' & Format([durationsec]/86400,'hh:nn:ss') AS duration, Format(TS,'mm/dd/yyyy') AS [Day], Switch(incycle=0,'Down',incycle=1,'Running') AS Status FROM " & conctn & " WHERE (((" & conctn & ".TS)>Date()-3) AND ((" & conctn & ".incycle)=0));"
        CurrentDb.QueryDefs("unionall").SQL = strSQL
        DoCmd.OpenQuery "appendall", acViewNormal, acEdit
        DoCmd.OpenQuery "splithours", acViewNormal, acEdit

        MsgBox conctn & " updated: " & canConnect
        cnn.Close

    End If

sub_error:
  MsgBox conctn & ": " & Error$
  Resume sub_error_exit
sub_error_exit:
Next conctn

这不能仅使用查询来完成。您必须使用一些VBA来测试所有机器是否都已打开,然后动态生成SQL查询。@Erik,我希望我可以在没有VBA的情况下完成,但如果这是唯一的选择,我想我可以想出一个解决方案。嗯,查询只是SQL,除了行或Access中的错误检测之外,它们没有任何逻辑。这里没有存储过程,因此任何更复杂的事情都会失败(您可以执行
createprocedure
,但这只会创建一个查询)