从Oracle 11g检索数据到Excel 2007 - Excel没有响应

时间:2014-01-06 18:57:20

标签: excel oracle excel-vba oracle11g vba

休斯顿,我们有问题! :)

我有一些Excel文件使用OraOLEDB驱动程序通过VBA连接到Oracle 11g数据库:

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

当我运行SELECT * FROM <view_name_here>之类的SQL查询时,会出现问题。当用户单击一个附加了宏的按钮时,会运行这些查询。

我正在使用什么来进行查询:

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 个答案:

答案 0 :(得分:1)

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