VBA SQL查询表错误

时间:2008-10-30 15:08:47

标签: excel vba

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

(sCW是一个常见的单词字符串,等于eCallByCallStat和 sDate是

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

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


@ loopo 我实际上将""添加到连接字符串中,并且实际上将用户名和密码硬编码到带有引号的查询中,为了清楚起见,我已将其删除


我收到的错误是

  

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


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

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

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

6 个答案:

答案 0 :(得分:1)

看起来像查询本身的错误......

如果您可以单步执行代码并发布sSql的内容,则可能有助于排除故障...

当您通过它时,请确保引号正确转义。

答案 1 :(得分:1)

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

你应该使用“double double”引号设置sConn,如:

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

答案 2 :(得分:1)

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

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

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

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

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

答案 3 :(得分:1)

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

其次,既然你说过这个错误,你可以测试一下当没有其他人访问系统时它是否仍然存在? 当您的查询尝试阅读时,某些行被锁定可能是个问题

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

答案 4 :(得分:0)

我首先删除带有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

答案 5 :(得分:0)

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

由于某些原因,我不知道。引用 QueryTable对象时,刷新仅在您第一次运行vba代码时有效。如果再次运行,运行时错误将提示运行时错误'-2147217842(80040e4e):对象'_QueryTable'的方法'Refresh'失败

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

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

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