ADO - Làm việc với Recordset (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

tan.ngohoangquoc

Thành viên hoạt động
Tham gia
10/7/14
Bài viết
100
Được thích
41
Nghề nghiệp
M&A Specialist - RM Assistant
Xin chào mọi người.

Em có vấn đề hỏi liên quan đến recordset. Nếu trong trường hợp em tạo nhiều sub và trong mỗi sub có một câu lệnh query riêng thì trong mỗi sub chúng ta phải new lại recordset một lần phải không?

Mã:
Option ExplicitPrivate Module


Public cn As ADODB.Connection
Public rst As ADODB.Recordset
Public cmd As ADODB.Command


Sub OpenConnection()
    Set cn = New ADODB.Connection
       
    cn.Open ("Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};dbq=" & ThisWorkbook.FullName & ";")
End Sub


Sub CloseConnection()
    On Error GoTo ExitWithoutClose
    cn.Close
    rst.Close
    
    Set cn = Nothing
    Set rst = Nothing
ExitWithoutClose:


End Sub


Sub ValidationSummary()
    Dim ary() As Variant
    Set rst = New ADODB.Recordset
    
    rst.Open ("SELECT DISTINCT Manager from [Managers$] WHERE Manager IS NOT NULL"), cn
    
    If Not rst.EOF Then
        ary = Application.Transpose(Application.Transpose(rst.GetRows))
    With Sheets("Summary").Range("C2").validation
        .Delete
        .Add Type:=xlValidateList, Formula1:=Join(ary, ",")
    End With
    End If
        
    rst.Close
    Set rst = Nothing
    
End Sub


Sub ManagerInfo()
    Dim mgtName As String
    Dim ary() As Variant
    Set rst = New ADODB.Recordset
    
    mgtName = Range("C2").value
    rst.Open ("SELECT DISTINCT Department,Position from [Managers$] WHERE Manager='" & mgtName & "'"), cn
    If Not rst.EOF Then
        ary = Application.Transpose(Application.Transpose(rst.GetRows))
        Range("C3:C4").value = ary
    End If
    
    rst.Close
    Set rst = Nothing


End Sub
 
Thử chỉ "new" 1 lần rồi xem kết qủa, hỏi tiếp.
 
Upvote 0
Có thấy gọi sub OpenConnection ở chỗ nào đâu mà xét nhanh với chậm.
 
Upvote 0
Update dữ liệu bằng sự kiện, nhất là sự kiện chỉ xảy ra 1 lần, là cách làm việc hết sức nguy hiểm.
Lỡ vì lý do nào đó, sự kiện bị chận không chạy thì làm sao biết dữ liệu có up-to-date hay không?
 
Upvote 0
ADO chậm nhất ở lúc kết nối. Hỏi làm cách nào chạy nhanh, trước hết phải biết kết nối và đóng vào lúc nào.

Câu lệnh là lọc duy nhất. Tuỳ theo dữ liệu có nhiều trùng lặp hay không mà phương pháp DISTINCT và phương pháp GROUP BY cái nào hữu hiệu hơn.
 
Upvote 0
ADO chậm nhất ở lúc kết nối. Hỏi làm cách nào chạy nhanh, trước hết phải biết kết nối và đóng vào lúc nào.

Câu lệnh là lọc duy nhất. Tuỳ theo dữ liệu có nhiều trùng lặp hay không mà phương pháp DISTINCT và phương pháp GROUP BY cái nào hữu hiệu hơn.

Với file này thì mình mở kết nối lúc mở file và đóng kết nối lúc đóng file.

Còn về DISTINCT Và GROUP BY thì mình hem biết cái nào nhanh hơn.
 
Upvote 0
...
Còn về DISTINCT Và GROUP BY thì mình hem biết cái nào nhanh hơn.


Đọc cho kỹ chỗ này:

...
Câu lệnh là lọc duy nhất. Tuỳ theo dữ liệu có nhiều trùng lặp hay không mà phương pháp DISTINCT và phương pháp GROUP BY cái nào hữu hiệu hơn.

Tôi đã mách cho nguyên tắc. Khi SQL giải quyết các lệnh lọc, tốc độ truy vấn tuỳ vào tình trạng dữ liệu. Người ta phải dựa vào dữ liệu của mình mà tuỳ chọn chỉnh sửa các kiểu truy vấn.

Dữ liệu của bạn thì bạn phải tự biết.
 
Upvote 0
Cũng với vấn đề này. Việc mở connection trong file 1 lần từ lúc làm mở file đến lúc đóng file. Nhưng torng lúc làm việc thì lại hay bị mất connection.
Mình sửa lại với mỗi sự kiện thì mở 1 connection lại và đóng khi kết thúc sự kiện. Như vậy thì có làm chậm quá trình không nhỉ.
 

File đính kèm

Upvote 0
ADO là object chuyên việc lấy dữ liệu. Kết nối của bạn bảo nó dùng Excel Driver. Excel Driver dùng MS Access để truy cập dữ liệu theo lệnh SQL.

3 cái nêu trên đều có khả năng làm chậm hay nhanh. Bạn phải nắm vững kỹ thuật mới biết được cách làm nó chạy nhanh hơn. Và nếu bạn có làm được thì cũng tuỳ theo từng trường hợp. Vì vậy bạn có tìm hiểu thêm nữa cũng vô ích. Trừ phi cái file trên bạn chạy thường xuyên một ngày 2-3 lần thì mới nên phí thới giờ tối ưu hoá nó. Chính bản thân tôi, nếu tôi có chạy 1 lần mỗi ngày thì tôi cũng mặc kệ cho nó chạy chậm.

Cái mà bạn cần biết là, ADO có khả năng lock memory, tức là nó có thể khoá một vùng nào đó trong bộ nhớ RAM của bạn để làm việc hiệu quả, không bị gián đoạn. Vì vậy dùng xong thì phải đóng nó để vùng nhớ được giải toả. Nếu không, bạn đọc chừng chục trang sau sẽ hết bộ nhớ. Tuy nhiên, đề bài của bạn là đọc trong chính workbook này. Khi đọ trong chính wokbook thì dẫu có đóng kết nối, bộ nhớ vẫn không giải toả, và bạn có khả năng bị treo máy. Để tránh trường hợp này, người ta phải vào gpedit để chận việc lock memory. Nhưng không lok memory thì ứng dụng chạy chậm. Và cái vòng lẩn quẩn tiếp tục.

Nếu bạn không hiểu tôi nói gì thì nên tìm hiểu kỹ hơn về các công cụ CSDL (database) rồi hãy nói chuyện tiếp về nhanh hay chậm.
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom