【问题标题】:Ignore connection error on OBDC query忽略 OBDC 查询上的连接错误
【发布时间】:2017-10-26 06:08:54
【问题描述】:

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

我正在使用带有 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 来测试所有机器是否都打开,然后动态生成查询 SQL。
  • @Erik,我希望我可以在没有 VBA 的情况下做到这一点,但如果这是唯一的选择,我认为我可以提出解决方案
  • 好吧,查询只是 SQL,除了 Access 中的行或错误检测之外,它们没有任何逻辑。这里没有存储过程之类的东西,所以任何更复杂的事情都会失败(你可以做CREATE PROCEDURE,但这只会创建一个查询)

标签: ms-access


【解决方案1】:

我最终使用 VBA 来解决每个 @Erik 的 cmets:

它遍历每个连接检查它,如果连接良好,它会修改查询并运行。

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

【讨论】:

    猜你喜欢
    • 2022-01-21
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-16
    • 1970-01-01
    相关资源
    最近更新 更多