2014-01-06 42 views
0

休斯顿,我们有一个问题! :)从Oracle 11g检索数据到Excel 2007 - Excel没有响应

我通过VBA连接到使用OraOLEDB司机一个Oracle 11g数据库的一些Excel文件:当我运行像SELECT * FROM <view_name_here>一个SQL查询

strConn = "User ID=<useridhere>" & _ 
    ";Password=<passwordhere>" & _ 
    ";Data Source=" & xServer & _ 
    ";Provider=OraOLEDB.Oracle" 

的问题发生。当用户单击一个按钮时会运行这些查询 - 该按钮附有一个宏。

我用做查询什么:

Sub Load_Data(ws As Worksheet, sSql As String) 
    Dim oQt As QueryTable 
    OpenConn 
    Dim rs As ADODB.Recordset 
    Set rs = New ADODB.Recordset 
    rs.Open sSql, sConn 

    ws.Activate 
    ClearActiveSheet 

    Set oQt = ActiveSheet.QueryTables.Add(rs, ws.Cells(1, 1)) 
    oQt.Refresh 
    rs.Close 
    sConn.Close 
End Sub 

注:ws是将显示数据的工作表,sSql是检索数据的查询。

我的问题是,Excel冻结 - 没有响应 - 从Oracle数据库检索数据 - 如果我有10个Excel实例打开,所有将无法使用。

我的目标是有一个“非阻塞”数据库访问 - 如果查询需要10分钟,我仍然可以使用excel。

如果有人能帮助我,那将是巨大的:)

注:我已经连接,我认为需要的所有部分的代码。如果你想看到任何可能导致解决方案的东西,请告诉我。

感谢

编辑:我设法得到它与下面的代码工作:

Conn.Open "PROVIDER=MSDAORA.Oracle;DATA SOURCE=" & Server & ";" & "USER ID=" & UID & ";PASSWORD=" & PWD 
Cmd.ActiveConnection = Conn 
Cmd.CommandType = adCmdText 
Cmd.CommandText = sSql 

Set RS = Cmd.Execute 

For X = 0 To noLines 
    Data.Cells(1, X + 1) = RS.Fields(X).Name 
    Next 
    Do While Not RS.EOF 
     Row = Row + 1 
     For Findex = 0 To RS.Fields.Count - 1 
     Data.Cells(Row + 1, Findex + 1) = RS.Fields(Findex).Value 
     Next Findex 
     RS.MoveNext 
    Loop 

Application.Calculation = xlCalculationAutomatic 
Application.Calculate 

Conn.Close 

确实当前文件,但没有其余的。这是主要目标。

回答

1

ADO提供了一种异步运行查询的方式 - Microsoft提供了一个示例here,将查询包装在类中,使用WithEvents声明ADODB.Connection。它实现了处理ADODB.Connection对象的ExecutionComplete事件的函数,并且它使用ADODB.Recordset,ADODB.ConnectionadAsyncExecute标志立即返回并允许接口保持响应状态来打开查询。

+0

感谢您的回复。我会看看它,试一试,并会报告结果。 – hardc0ded

+0

我已经尝试了您的解决方案,但无法使其正常工作。我已经编辑了我的问题,以便提供我的“是的这是一种解决方案,这种工作”:) – hardc0ded

+0

@ hardc0ded好吧,如果你确实想要尝试让“adAsyncExecute”方法工作,请问它作为一个新问题,发布一些代码,以及我自己或另一个SO用户应该能够让你走上正确的轨道。 – Blackhawk