Ошибка выполнения VBA/ADODB: 3704

Следующая подпрограмма VBA будет нормально выполнять большинство запросов. (например: SELECT * FROM DUAL)

Sub DisplayQuery(QueryString As String)
  Dim rs As New ADODB.Recordset
  Dim connStr As String
  connStr = _
   "Provider=MSDAORA.1;" _
   & "User ID=abc;Password=123;" _
   & "Data Source=xxx/xxx;"
  out QueryString

  rs.Open QueryString, connStr, adOpenStatic, adLockOptimistic
  Range("DataTable").Clear
  Cells(1, 1).CopyFromRecordset rs
End Sub

Однако, когда я запускаю приведенный ниже запрос, сразу же появляется следующее сообщение об ошибке: Run-time error '3704':Operation is not allowed when the object is closed.

with all_hours as
  ( select to_date('2009-11-03 05:00 PM','yyyy-mm-dd hh:mi PM') + numtodsinterval(level-1,'hour') hour
      from dual
   connect by level <= 4 /*hours*/

  )
  select h.hour
       , count(case when h.hour = trunc(s.sampled_on,'hh24') then 1 end) sampled
       , count(case when h.hour = trunc(s.received_on,'hh24') then 1 end) received
       , count(case when h.hour = trunc(s.completed_on,'hh24') then 1 end) completed
       , count(case when h.hour = trunc(s.authorized_on,'hh24') then 1 end) authorized
    from all_hours h cross join sample s
   group by h.hour

Почему?


person Steven    schedule 05.11.2009    source источник
comment
Базы данных Oracle делают умные вещи с управлением памятью / пулом соединений и т. Д. Объект соединения может казаться закрытым, если выполнение запроса находится в очереди. Обходной путь может заключаться в (а) оптимизации запросов и (б) сквозных запросах.   -  person heferav    schedule 06.11.2009
comment
Есть ли нулевые значения в h.hour?   -  person dendarii    schedule 06.11.2009
comment
или поля из примера таблицы?   -  person dendarii    schedule 06.11.2009
comment
Запрос не может иметь пустых значений по своей конструкции. Однако многие столбцы (включая указанные) могут быть нулевыми, однако в этом случае выборка не будет включена в «количество (случай, когда ...)».   -  person Steven    schedule 06.11.2009
comment
Можете ли вы попытаться изменить запрос, чтобы учесть нули? например использовать IsNull для возврата 0 вместо того, чтобы полагаться на SQL для их неявной обработки? У меня были странные результаты при запуске SQL через Excel, особенно для коррелированных подзапросов.   -  person dendarii    schedule 09.11.2009
comment
Прочтите сообщение об ошибке! Если бы это была проблема с NULL, вы бы не получили сообщение «Операция не разрешена, когда объект закрыт».   -  person Christian Payne    schedule 10.11.2009


Ответы (2)


Если я правильно помню, объект ADO Command имеет тайм-аут по умолчанию (я думаю, 30 секунд), что может быть причиной вашей проблемы: должна быть такая настройка, как

cn.ConnectionTimeout = (your value here)

который вы могли бы продлить.

person davek    schedule 05.11.2009
comment
Ни добавление ConnectionTimeout, ни CommandTimeout не решает эту проблему. - person Steven; 06.11.2009
comment
Тайм-аут не дал бы эту ошибку. Это выдаст ошибку тайм-аута. - person Gary McGill; 06.11.2009

Я только что реструктурировал свой запрос (ссылка), чтобы представить его в виде. Затем я создал соединение в Excel для просмотра имени.

person Steven    schedule 10.11.2009