2016-11-22 109 views
0

我正在执行一个从Excel中的工作表连接起来的sql语句,并将结果返回给另一个工作表。如果我运行嵌入式嵌套查询,结果返回时没有错误(虽然性能比3分钟和几秒钟慢很多),如果我使用公用表表达式CTE,如下所示我得到运行时错误'3704'该对象被关闭。我正在使用Excel 2010并查询Oracle 11g数据库。在蟾蜍查询工作正常,我似乎记得从Excel对Excel运行CTE查询,所以我不认为这是问题。我无法控制对数据库进行任何更改或将其设置为存储过程。预先感谢任何帮助。vba公用表表达式cte当对象关闭时不允许操作

的完整代码为消毒保密:

Sub RefreshData() 

'Turn off screen updating and alerts 
Application.ScreenUpdating = False 
Application.DisplayAlerts = False 

'User cell selection when running macro 
Dim iRowRef As Integer 
Dim iColRef As Integer 
SheetRef = ActiveSheet.Name 
iRowRef = ActiveCell.Row 
iColRef = ActiveCell.Column 

Worksheets("Dashboard").Cells(2, 2).Value = "Start time: " & Now() 

'Create connection 
Dim cn As Object 
Dim rs As Object 
Set cn = CreateObject("ADODB.Connection") 
Set rs = CreateObject("ADODB.Recordset") 

If strUname = "" Then 
    strUname = InputBox(Prompt:="USERNAME", Title:="Authentication", Default:=(Environ$("Username"))) 
End If 
If strPword = "" Then 
    'strPword = InputBox(Prompt:="PASSWORD", Title:="Authentication", Default:="Password") 
    strPword = modPWMask.InputBoxPW("PASSWORD", "Authentication") 
End If 

***编辑:问题是与连接字符串中的供应商。 CTE支持依赖提供者。由于@TimWilliams

'Connection string 
cn.ConnectionString = "Provider=MSDAORA.1;User ID=" & strUname & ";Password=" & strPword & ";Data Source=(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP) (HOST = host.com)(PORT = 100))(CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = db_prd)))" 
'Open connection 
cn.Open 

'Query Data Runoff 
strQuery = Worksheets("SQL").Cells(2, 2).Value & UCase(Format(Worksheets("Dashboard").Cells(7, 3).Value, "dd-mmm-yyyy")) & Worksheets("SQL").Cells(2, 3).Value 
'Send query string to clipboard 
Dim DataObj3 As New MSForms.DataObject 
DataObj3.SetText strQuery 
DataObj3.PutInClipboard 

    'Clear old data 
    Worksheets("Data").Cells.EntireColumn.Hidden = False 
    Worksheets("Data").Range("C20:E20").ClearContents 

    'Create recordset from query 
    Set rs = cn.Execute(strQuery) 

这是我收到错误的行:

'Paste data from record set 
    Worksheets("Data").Range("C20").CopyFromRecordset rs 

'Timestamp end time 
Worksheets("Dashboard").Cells(3, 2).Value = "Last refreshed: " & Now() 

'Turn on screen updating and alerts 
Application.ScreenUpdating = True 
Application.DisplayAlerts = True 

'Return to starting cell 
Worksheets(SheetRef).Activate 
Cells(iRowRef, iColRef).Select 

End Sub 

而这又是消毒的保密SQL:

with cte as 
(
select 
    ENTITY 
    , ENDPOINT 
    , case 
    when RWS = 1 and ENDPOINT in (13,14) then PCT_B 
    when RWS = 2 and ENDPOINT in (13,14) then PCT_A 
    else PCT_A end as PCT 
    , SUM(case 
    when RWS = 1 and ENDPOINT in (13,14) then cast(BAL_B AS decimal (18,2)) 
    when RWS = 2 and ENDPOINT in (13,14) then cast(BAL_A AS decimal (18,2)) 
    when RWS = 2 then cast(BAL AS decimal (18,2)) 
    else 0 end) as BAL 
    , ROUND(SUM((case 
    when RWS = 1 and ENDPOINT in (13,14) then cast(BAL_B AS decimal (18,2)) 
    when RWS = 2 and ENDPOINT in (13,14) then cast(BAL_A AS decimal (18,2)) 
    when RWS = 2 then cast(BAL AS decimal (18,2)) 
    else 0 end) 
    * 
    (case 
    when RWS = 1 and ENDPOINT in (13,14) then PCT_B 
    when RWS = 2 and ENDPOINT in (13,14) then PCT_A 
    else PCT_A end) 
    /100),2) as ADJ_BAL 
from 
    SCHEMA.VIEW 
    cross join (select 1 as RWS from dual union select 2 as RWS from dual) 
where 
    AS_OF_DATE = '01-NOV-2016' 
group by 
    ENTITY 
    , ENDPOINT 
    , case 
    when RWS = 1 and ENDPOINT in (13,14) then PCT_B 
    when RWS = 2 and ENDPOINT in (13,14) then PCT_A 
    else PCT_A end 
) 

select sum(case 
      when ENTITY = 'ENTITYA' and ENDPOINT <> 33 then ADJ_BAL 
      when ENTITY = 'ENTITYB' then ADJ_BAL 
      when ENTITY = 'ENTITYC' and ENDPOINT <> 33 then ADJ_BAL 
      else 0 
     end) as BAL_CONSOL 
    , sum(case 
      when ENTITY = 'ENTITYA' then ADJ_BAL 
      else 0 
     end) as BAL_ENTITYA 
    , sum(case 
      when ENTITY = 'ENTITYB' then ADJ_BAL 
      else 0 
     end) as BAL_ENTITYB 
from cte 
+1

含义是行cn.open失败,并且您没有检查连接是否已成功打开。 – xQbert

+0

我可以添加该检查,但在上述检查之前我成功执行了2个其他查询,所以我不认为是这种情况。 ?cn.State 1 – clarencebuttowski

+0

(1)检查'rs.State',而不是'cn.State'(2)检查Connection's Errors集合https://support.microsoft.com/en-us/kb/167957 –

回答

1

对我的作品与供应商OraOLEDB.Oracle

cn.CursorLocation = adUseClient 

无法与MSDAORA.1供应商合作

相关问题