【问题标题】:VBA SQL Query Table ErrorVBA SQL 查询表错误
【发布时间】:2010-09-20 00:19:59
【问题描述】:

我正在尝试从 ACD 呼叫数据系统中提取数据,确切地说是Nortel Contact Center 6.0,如果您使用该特定系统,我试图捕获的是每日呼叫数据。但是,当我使用此代码时

(sCW 是一个普通的字符串,等于eCallByCallStat 和 s日期是

dDate = Format(Month(deffDate) & "/" & iStartDay & "/" & Year(deffDate), "mm/dd/yyyy")

sDate = Format(dDate, "yyyymmdd") )

sSql = ""
        sConn = "ODBC;DSN=Aus1S002;UID=somevaliduser;PWD=avalidpassword;SRVR=Thecorrectserver;DB=blue"
        sSql = "SELECT " & sCW & sDate & ".Timestamp, "
        sSql = sSql & sCW & sDate & ".CallEvent, "
        sSql = sSql & sCW & sDate & ".CallEventName, "
        sSql = sSql & sCW & sDate & ".CallID, "
        sSql = sSql & sCW & sDate & ".TelsetLoginID, "
        sSql = sSql & sCW & sDate & ".AssociatedData, "
        sSql = sSql & sCW & sDate & ".Destination, "
        sSql = sSql & sCW & sDate & ".EventData, "
        sSql = sSql & sCW & sDate & ".Source, "
        sSql = sSql & sCW & sDate & ".Time " & vbCrLf
        sSql = sSql & "FROM blue.dbo.eCallByCallStat" & sDate & " " & sCW & sDate & vbCrLf
        sSql = sSql & " ORDER BY " & sCW & sDate & ".Timestamp"


        Set oQT = ActiveSheet.QueryTables.Add(Connection:=sConn, Destination:=Range("A1"), Sql:=sSql)

        oQT.Refresh BackgroundQuery:=False

        Do While oQT.Refreshing = True
        Loop"

当我运行它时,我在 oQT.Refresh BackgroundQuery:=False 处收到一条奇怪的错误消息

奇怪的是它工作了一个月左右然后就死了


@循环 我实际上将"" 添加到连接字符串中,并且实际上将用户名和密码硬编码到不带引号的查询中,为了在发布中清晰起见,我已经删除了它们


我收到的错误是

运行时错误“-2147417848(80010108)”: 对象“_QueryTable”的方法“刷新”失败


感谢您的意见,凯文。数据库永远不会处于没有人访问它的状态,它是一个全天候 24 x 7 并且始终连接到客户端的呼叫处理系统。至少这是我的理解。如果我通过 Excel 手动执行此操作,我永远不会出错,或者只有当我通过宏执行此操作时才会出现任何问题,这是否会给我带来问题,让我认为是我的代码导致了问题。

我按照制造商的建议通过 ODBC 连接到数据库,但我想知道他们是否曾设想过这种事情。

我会看看是否可以将其用于 .NET 项目,看看是否有帮助。

【问题讨论】:

  • 同上,您收到的错误编号和消息是什么?

标签: excel vba


【解决方案1】:

查询本身似乎有错误...

如果您可以单步调试您的代码并发布 sSql 的内容,它可能有助于解决问题...

当您浏览它时,请确保引号被正确转义。

【讨论】:

    【解决方案2】:

    看起来您的连接字符串中有双引号。 这可能是由于网站的某些解析

    您可能应该使用“双双”引号设置 sConn,如下所示:

    sConn = "ODBC;DSN=Aus1S002;UID=""somevaliduser"";PWD=""avalidpassword"";SRVR=""Thecorrectserver"";DB=blue"
    

    【讨论】:

      【解决方案3】:

      您收到的实际错误消息是什么?

      在 FROM 子句中,您是否尝试从 2 个不同的表中选择,在不同的命名空间中具有相同的名称? (在这种情况下,我认为它们应该用逗号而不是空格分隔)

      或者应该有另一个'.'而不是 FROM 子句中的空格?还是别名?

      您需要为每个字段指定表格吗?为什么不这样做:

      SELECT Timestamp, CallEvent, ... ,Time 
             FROM blue.dbo.eCallByCallStat" & sDate & " ORDER BY Timestamp 
      

      【讨论】:

        【解决方案4】:

        首先,如果您要连接到非通用数据库(SQL Server、Oracle 等),请尝试使用特定于它的数据库连接

        其次,既然你说这个错误来来去去,你能测试一下当没有其他人访问系统时它是否仍然发生? 当您的查询尝试读取它们时,可能是某些行被锁定的问题...

        第三,要么切换到不同的报告方法,要么找到不同的方式来获取数据。 Excel 中对此类调用存在限制。虽然,是的,它确实允许您连接到数据库并提取数据,但如果您正在处理大量数据、复杂查询或挑剔的数据库连接,您可能会发现它不够用。

        【讨论】:

          【解决方案5】:

          我先用sSql=""删除sSQL的内容

          之后,因为查询是在 for 循环中运行的,所以我在接下来的每一行中构建查询,每一行都建立在前一行的基础上,我这样做是为了便于编辑和理解下一个人。

          通过sSQL运行后是这样的

          sSQL=SELECT eCallByCallStat20081001.Timestamp, eCallByCallStat20081001.CallEvent,
          eCallByCallStat20081001.CallEventName, eCallByCallStat20081001.CallID,
          eCallByCallStat20081001.TelsetLoginID, eCallByCallStat20081001.AssociatedData,
          eCallByCallStat20081001.Destination, eCallByCallStat20081001.EventData,
          eCallByCallStat20081001.Source, eCallByCallStat20081001.Time FROM 
          blue.dbo.eCallByCallStat20081001 eCallByCallStat20081001 ORDER BY
          eCallByCallStat20081001.Timestamp
          

          【讨论】:

          • 表存在,所有这些列都存在,等等,是吗?你能发布确切的错误信息吗?谢谢。
          【解决方案6】:

          我在尝试刷新查询时遇到了同样的问题。

          出于某种我不知道的原因。当引用 QueryTable 对象 时,刷新仅在您第一次运行 vba 代码时起作用。再次运行会出现运行时错误提示Run-time error '-2147217842(80040e4e): Method 'Refresh' of object '_QueryTable' failed发生

          这是一个失败的查询刷新示例。 Ws.ListObjects("TableName").QueryTable.Refresh BackgroundQuery:=False

          这是找到的解决方案。 ThisWorkbook.Connections("ConnectionName").Refresh

          如果有人知道QueryTable 对象的刷新方法失败的原因。请告诉我们。

          【讨论】:

            猜你喜欢
            • 2018-02-15
            • 2017-07-21
            • 2014-05-01
            • 1970-01-01
            • 1970-01-01
            • 2012-03-03
            • 2015-09-29
            • 1970-01-01
            相关资源
            最近更新 更多