2014-01-06 41 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