2009-11-05 7 views
0

Le sous-programme VBA suivant exécutera la plupart des requêtes correctement. (Ex: SELECT * FROM DUAL)Erreur d'exécution VBA/ADODB: 3704

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 

Cependant, quand je lance la requête ci-dessous, le message d'erreur suivant pops immédiatement: 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 

Pourquoi?

+0

Les bases de données Oracle font des choses intelligentes avec la gestion de la mémoire/le regroupement de connexions, etc. L'objet de connexion peut sembler fermé si l'exécution de la requête est dans une file d'attente. Une solution de contournement pourrait être (a) l'optimisation des requêtes et (b) les requêtes directes. – heferav

+0

Y a-t-il des valeurs nulles dans h.heure? – dendarii

+0

ou les champs de la table d'échantillons? – dendarii

Répondre

0

Je viens de restructurer ma requête (link), pour que je puisse la mettre dans une vue. J'ai ensuite créé une connexion dans Excel pour voir le nom.

0

Si je me souviens bien, l'objet Command ADO a un délai d'attente par défaut (30 secondes, je pense) qui peut être la cause de votre problème: il devrait y avoir un cadre comme

cn.ConnectionTimeout = (your value here) 

que vous pourriez prolonger.

+0

L'ajout d'un ConnectionTimeout ou d'un CommandTimeout ne résout pas ce problème. – Steven

+0

Un dépassement de délai ne donnerait pas cette erreur. Cela donnerait une erreur "expiré". –

Questions connexes