Ошибка таблицы запросов SQL 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» не выполнен


Спасибо за ваш вклад, Кевин. База данных никогда не находится в состоянии, когда к ней никто не обращается, это система обработки вызовов, которая работает круглосуточно и без выходных и всегда подключена к своим клиентам. По крайней мере, это мое понимание. Если я делаю это вручную через Excel, я никогда не получаю ошибку или имею какие-либо проблемы только тогда, когда я делаю это с помощью макроса, это дает мне проблемы, которые заставляют меня думать, что это был мой код, вызывающий проблему.

Я подключаюсь к базе данных через ODBC в соответствии с рекомендациями производителя, но мне интересно, предвидели ли они когда-нибудь такое.

Я посмотрю, смогу ли я использовать это в проекте .NET, и посмотрю, поможет ли это.


person CABecker    schedule 30.10.2008    source источник
comment
то же самое, какой номер ошибки и сообщение, которое вы получаете?   -  person Russ Cam    schedule 30.10.2008


Ответы (6)


Похоже на ошибку самого запроса...

Если вы сможете просмотреть свой код и опубликовать содержимое sSql, это, вероятно, поможет устранить неполадки...

Когда вы пройдете через это, убедитесь, что кавычки правильно экранированы.

person Kevin Fairchild    schedule 30.10.2008

Похоже, в вашей строке подключения есть двойные кавычки. Потенциально это может быть связано с некоторым синтаксическим анализом на веб-сайте.

вам, вероятно, следует установить sConn, используя «двойные двойные» кавычки, например:

sConn = "ODBC;DSN=Aus1S002;UID=""somevaliduser"";PWD=""avalidpassword"";SRVR=""Thecorrectserver"";DB=blue"
person Loopo    schedule 30.10.2008

Какое фактическое сообщение об ошибке вы получаете?

В предложении FROM вы пытаетесь ВЫБРАТЬ из двух разных таблиц с одним и тем же именем в разных пространствах имен? (В этом случае я думаю, что они должны быть разделены запятой, а не пробелом)

Или должен быть другой '.' вместо пробела в предложении FROM? Или это псевдоним?

Вам нужно указать таблицу для каждого поля? почему бы просто не сделать:

SELECT Timestamp, CallEvent, ... ,Time 
       FROM blue.dbo.eCallByCallStat" & sDate & " ORDER BY Timestamp 
person Loopo    schedule 31.10.2008

Во-первых, если вы подключаетесь к неуниверсальной базе данных (SQL Server, Oracle и т. д.), попробуйте использовать соединение с базой данных, относящееся к ней.

Во-вторых, поскольку вы сказали, что эта ошибка появляется и исчезает, можете ли вы проверить, возникает ли она, когда никто другой не обращается к системе? Возможно, это связано с блокировкой определенных строк, пока ваш запрос пытается их прочитать...

В-третьих, либо переключитесь на другой метод отчетности, либо найдите другой способ получения данных. Существуют ограничения на этот тип вызова в Excel. Хотя да, он, безусловно, позволяет вам подключаться к базам данных и извлекать данные, вы можете столкнуться с тем, что этого недостаточно, если вы работаете с большими наборами данных, сложными запросами или привередливыми подключениями к базе данных.

person Kevin Fairchild    schedule 06.11.2008

Я начинаю с удаления содержимого 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
person CABecker    schedule 30.10.2008
comment
Таблица существует, все эти столбцы существуют и т. д., да? Можете ли вы опубликовать точное сообщение об ошибке? Спасибо. - person Kevin Fairchild; 30.10.2008

У меня была такая же проблема при попытке обновить запрос.

По какой-то причине, которую я не знаю. При ссылке на объект QueryTable обновление работает только при первом запуске кода vba. Если вы запустите его снова, ошибка времени выполнения предложит Ошибка времени выполнения '-2147217842(80040e4e): метод 'Обновить' объекта '_QueryTable' не выполнен

Это пример неудачного обновления запроса. Ws.ListObjects("TableName").QueryTable.Refresh BackgroundQuery:=False

Вот найденное решение. ThisWorkbook.Connections("ConnectionName").Refresh

Если кто-то знает причину сбоя метода обновления объекта QueryTable. пожалуйста, дайте нам знать.

person szabo357    schedule 28.05.2020