Đố vui về ADO, DAO.

Liên hệ QC
Implicit (đằng sau lưng) !
ADO tự thương lượng và hiệu chỉnh (negotiate, configure) các lệ ước (protocol) với nơi nó muốn kết nối. Nhanh hay chậm là do nó có thể negotiate như thế nào. Nhưng vì hai bên tự thoả thuận với nhau cách "gọn gàng và ít tốn năng lượng nhất" cho nên code VBA không có quyền hạn gì ở đây cả. Recordset nó đưa kết quả về thì lấy, nó không đưa thì ráng chịu.
Cách kết nối explicit (caller làm chủ động) có một số commands để làm việc rõ rệt hơn nếu cần. Vì ở đây quý vị chưa cần đến các luật này cho nên chúng chả hề được nhắc tới.
 
Sẵn đang bàn về ADO, anh/ chị cho em hỏi có cách nào để biết được 1 file Excel đang được mở connection. Mục đích là chờ file Excel đó close kết nối đó rồi mới tạo connection, vì nếu open connection đến một file Excel đang open connection khác thì chương trình Excel sẽ mở file đó ở chế độ ReadOnly. Cảm ơn anh/ chị!
 
Xin nói thêm là nếu như ta dùng trên cùng 1 file thì không cần phải mở kết nối hay khai báo chuỗi kết nối.
Vậy phương pháp để lấy dữ liệu bằng cách này là như thế nào. Mời các bạn cho ý kiến nhé.
quay lại bài này 1 chút
Trường hợp mạnh không xài 2 công cụ sau + ko xài hàm của Excel + Macro4 mà vẫn lấy được dữ liệu của File đóng thì ko biết có phải cái mà HLMT hỏi ko nhỉ ... bỏ 2 dòng sau
Mã:
Set cn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
Bỏ hết 2 Tools trên chỉ xài sơ bộ dòng sau ...:bounce:===\.-0-0-0-
Mã:
sConn = "Provider=Microsoft.ACE.OLEDB.12.0 + abczyx(Linh Tinh)
Trong khi vô tình quậy code tầm bạy .... Bác Bill báo theo hình
ADo.PNG
 
Lần chỉnh sửa cuối:
Anh kiem tra duong dan,
quay lại bài này 1 chút
Trường hợp mạnh không xài 2 công cụ sau + ko xài hàm của Excel + Macro4 mà vẫn lấy được dữ liệu của File đóng thì ko biết có phải cái mà HLMT hỏi ko nhỉ ... bỏ 2 dòng sau
Mã:
Set cn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
Bỏ hết 2 Tools trên chỉ xài sơ bộ dòng sau ...:bounce:===\.-0-0-0-
Mã:
sConn = "Provider=Microsoft.ACE.OLEDB.12.0 + abczyx(Linh Tinh)
Trong khi vô tình quậy code tầm bạy .... Bác Bill báo theo hình
View attachment 211057
Anh kiem tra duong dan, cau trùc sql va file ket nói la excel hay accdb. Nó hiện len trên kia
 
quay lại bài này 1 chút
Trường hợp mạnh không xài 2 công cụ sau + ko xài hàm của Excel + Macro4 mà vẫn lấy được dữ liệu của File đóng thì ko biết có phải cái mà HLMT hỏi ko nhỉ ... bỏ 2 dòng sau
Mã:
Set cn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
Bỏ hết 2 Tools trên chỉ xài sơ bộ dòng sau ...:bounce:===\.-0-0-0-
Mã:
sConn = "Provider=Microsoft.ACE.OLEDB.12.0 + abczyx(Linh Tinh)
Trong khi vô tình quậy code tầm bạy .... Bác Bill báo theo hình
View attachment 211057
Có nghĩa là trên cùng 1 file ta không cần khởi tạo kết nối
 
Các Bạn cho Mình hỏi một chút
1/ Thông thường Mình thấy trên GPE thấy đa số mở kết nối ADO theo cách sau
Mã:
Cnn.Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ExcelPath _
            & ";Extended Properties=""Excel 12.0 Xml;HDR=Yes;"";")
2/ Vậy Mình thử mở kết nối ADO khác đi một tẹo như sau:
Mã:
Cnn.Open "ODBC;DSN=Excel Files;" _
        & "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" _
        & "DBQ=" & ExcelPath & ";ReadOnly=0;"
Mình thấy 2 cách trên điều chạy tốt
Vấn đề mình muốn hỏi ở đây là :

1/ 2 cách trên nó có điểm gì khác nhau và xài nó trong trường hợp nào là tốt nhất ???

2/ cách thứ 2 có chạy trên tất cả các WindowsXP To Windows10 hay không ... hay phải cài thêm cái gì nữa ???

Rất mong sự giải đáp của các Bạn để Mạnh hiểu thêm một chút về ADO !!!
 
1. thử trên 64 bit
2. thử trên 80000 dòng
So sánh kết quả
 
1. thử trên 64 bit
2. thử trên 80000 dòng
So sánh kết quả
1/ Mình có 4 máy điều xài Windows10_x64 + Office2016_x32 thấy chạy tốt

2/ Ko có máy nào cài Officex64 cả nên cũng ko có mà thử vậy cũng ko biết luôn

3/ Mình cũng ko biết được cụ thể chi tiết là sao nữa .... ko biết nó có chạy nhanh hơn cái mục số 1 hay ko ???!!!

4/ suy đoán là khả năng nhiều hạn chế nên thấy Ít bạn xài mục số 2
 
Lần chỉnh sửa cuối:
Tóc đọ là cái tôi xét đến cuói cùng. Cái này nhanh hớn cái kia 1 chút đói với tôi gần như khong quan trọng. Làm việc với CSDL thì tôi chỉ quan tâm việc truy xuất có dễ dàng và chính xác?
Bạn chưa trả lời tôi về việc giới hạn số dòng.
 
Đã từng dùng cách này, tuy nhiên anh hãy test với dữ liệu là Tiếng Việt có dấu (Unicode) nhé.
Thử khai báo lấy nguyên Sheet thấy nó chạy cũng nhanh
Mã:
SQL = "SELECT * FROM [Persons$]"
Hình như dữ liệu thiếu thì phải .... vậy nên thấy ít người xài tới nó :p
 
Nghiên cứu là ngu như kiến, hihi, anh vietmini là tiếp kiem lời nhat, dọc comment của anh em phải nghiệm 1 thời gian mới ra hichic
 
Tóc đọ là cái tôi xét đến cuói cùng. Cái này nhanh hớn cái kia 1 chút đói với tôi gần như khong quan trọng. Làm việc với CSDL thì tôi chỉ quan tâm việc truy xuất có dễ dàng và chính xác?
Bạn chưa trả lời tôi về việc giới hạn số dòng.
Cảm Ơn bạn thôi chạy mất dép cái kiểu kết nối đó thôi HLMT nói đúng thử với Unicode xem sao
Thấy nó lỗi Font
Capture.PNG
 
Web KT
Back
Top Bottom