Hai câu lệnh này tương tự nhau nhưng nguyên nhân thứ hai khiến Excel bị lỗi mỗi khi nó được thực hiện. Sự khác biệt duy nhất là giữa model
và model return updated rows
(tôi đã thiết kế đặc biệt ví dụ nhỏ này để các truy vấn trở lại chính xác cùng một dữ liệu trong cả hai trường hợp, SQL thực thế giới của tôi là khác nhau tất nhiên):Làm cách nào để làm việc xung quanh Excel gặp sự cố với một số câu lệnh SELECT?
select * from(select * from (select 1 id, 100 val from dual union all select 2 id, 200 val from dual) model dimension by (id) measures (val) rules (val[1] = val[cv()]+1)) where val=101
select * from(select * from (select 1 id, 100 val from dual union all select 2 id, 200 val from dual) model return updated rows dimension by (id) measures (val) rules (val[1] = val[cv()]+1)) where val=101
đây có phải là một ví dụ đơn lẻ của một lỗi trong ADO hoặc là có một lớp tiếng của câu lệnh SQL mà sụp đổ phân tích cú pháp (tôi thậm chí không chắc chắn lý do tại sao ADO sẽ phân tích báo cáo kết quả hơn là chỉ đi nó t hrough vào cơ sở dữ liệu).
Dưới đây là đoạn code VBA trong đầy đủ cho phiên bản đó bị treo:
Option Explicit
Sub Go()
Dim lConn As ADODB.Connection
Dim lRecordset As ADODB.Recordset
'Dim lRecordset
Dim sSQL As String
Set lConn = New ADODB.Connection
Set lRecordset = New ADODB.Recordset
'Set lRecordset = CreateObject("ADODB.Recordset")
lConn.Open "Provider=MSDAORA;Data Source=(DESCRIPTION=(CID=GTU_APP)(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=devdb)(PORT=1521)))(CONNECT_DATA=(SID=oracle)(SERVER=DEDICATED)));User Id=csuk;Password=thisisnotmyrealpassword;"
With lRecordset
sSQL = "select * " & _
"from(select * " & _
" from (select 1 id, 100 val from dual " & _
" Union all " & _
" select 2 id, 200 val from dual) " & _
" model return updated rows " & _
" dimension by(id) " & _
" measures (val) " & _
" rules (val[1] = val[cv()]+1)) " & _
"where val=101"
.Open sSQL, lConn
While Not .EOF
Sheets(1).Cells(1, 1) = ![Val]
.MoveNext
Wend
.Close
End With
Set lRecordset = Nothing
lConn.Close
Set lConn = Nothing
End Sub
Để đối phó với một lời nhận xét, tôi đã cố gắng cùng SQL sử dụng DAO, và bối rối của tôi, chúng tôi nhận được kết quả tương tự. Các mã sau đây bị treo Excel, nhưng loại bỏ các return updated rows
là tất cả những gì cần thiết để làm cho nó làm việc như mong đợi:
Option Explicit
Sub Go()
Dim lWorkspace As DAO.Workspace
Dim lDatabase As DAO.Database
Dim lRecordset As DAO.Recordset
Dim sSQL As String
sSQL = "select * " & _
"from(select * " & _
" from (select 1 id, 100 val from dual " & _
" Union all " & _
" select 2 id, 200 val from dual) " & _
" model return updated rows " & _
" dimension by(id) " & _
" measures (val) " & _
" rules (val[1] = val[cv()]+1)) " & _
"where val=101"
Set lWorkspace = DBEngine.Workspaces(0)
Set lDatabase = lWorkspace.OpenDatabase("", False, False, "Driver={Microsoft ODBC for Oracle};Server=devdb:1521/oracle;Uid=charts_csuk_uksoft;Pwd=thisisnotmyrealpassword;")
Set lRecordset = lDatabase.OpenRecordset(sSQL, dbOpenDynaset, dbSQLPassThrough)
With lRecordset
While Not .EOF
Sheets(1).Cells(1, 1) = ![Val]
.MoveNext
Wend
End With
Set lRecordset = Nothing
Set lDatabase = Nothing
Set lWorkspace = Nothing
End Sub
thêm 'Đặt lConn = Nothing' bên dưới' lConn.Close' để liên kết miễn phí với kết nối. Bây giờ, Excel có gặp sự cố với sự ràng buộc muộn của ADODB.Recordset không? Ngoài ra, hãy xem [mẹo] này (http://www.vbforums.com/showthread.php?511763-Classic-VB-Why-shouldn-tI-use-quot-Dim-As-New-quot) liên quan đến việc sử dụng 'As Mới'. Làm thế nào về việc sử dụng các lựa chọn thay thế ADODB? Hãy cho chúng tôi biết nếu bất kỳ điều nào trong số này giúp được –
Cảm ơn, tôi đã thử thêm 'set lConn = Nothing' và cập nhật câu hỏi với cải tiến đó. Tôi cũng đã cố gắng ràng buộc muộn (xem dòng bình luận trong câu hỏi sửa đổi. Không ai trong số này ngăn chặn sự sụp đổ, tôi muốn được biết những gì ADODB lựa chọn thay thế bạn đề nghị cố gắng? –
Người đầu tiên tôi có thể nghĩ là [DAO] (http://allenbrowne.com/ser-29.html) Một tùy chọn khác là viết thư viện COM của riêng bạn bằng cách sử dụng C# hoặc VB.NET và thêm tham chiếu đến 'dll' của bạn (giống như thêm bất kỳ tham chiếu nào khác tức là Microsoft Scripting Sử dụng một thư viện COM cho phép bạn tạo các đối tượng của riêng bạn trong Excel, nói rằng nó sẽ cho phép bạn truyền các truy vấn trực tiếp đến thư viện COM, nó sẽ thực thi nó đối với cơ sở dữ liệu của bạn bỏ qua trình phân tích cú pháp ADODB. sử dụng 'SQL Connection' từ thư viện' System.Data.SqlClient' –