休斯顿,我们有问题! :)
我有一些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
阻止当前文件,但不阻止其余文件。这是主要目标。
答案 0 :(得分:1)
ADO提供了一种异步运行查询的方法 - Microsoft提供了一个示例here,它将查询包装在一个类中,使用ADODB.Connection
声明WithEvents
。它实现了一个处理ADODB.Connection对象的ExecutionComplete
事件的函数,它使用ADODB.Recordset
,ADODB.Connection
和adAsyncExecute
标志打开查询,立即返回并允许界面保持响应。