ADO căn bản: Kết nối truy vấn CSDL từ file Excel đến file Access.
Mình rất đắng đo khi quyết định mở topic này, do kiến thức chấp vá, cách diễn đạt cũng như khả năng hiểu biết về ADO có hạn. Mong nhận được sự góp ý của các anh chị nhiều hơn.
Chuẩn bị môi trường làm việc: Vào cửa sổ code click chọn Tools>Refrences, xong chọn Microsoft ActiveX Data Objects x.x Library (ADO)
9g8izYUQrnE
Lưu ý: Để bài viết được liên tục, các bạn nếu có góp ý hay thảo luận về đề tài này, vui lòng ghé sang topic sau:
[URL='https://www.giaiphapexcel.com/forum/showthread.php?69630-Th%E1%BA%A3o-lu%E1%BA%ADn-v%E1%BB%81-b%C3%A0i-ADO-c%C4%83n-b%E1%BA%A3n-K%E1%BA%BFt-n%E1%BB%91i-truy-v%E1%BA%A5n-CSDL-t%E1%BB%AB-file-Excel-%C4%91%E1%BA%BFn-file-Access']Thảo luận về bài: ADO căn bản Kết nối truy vấn CSDL từ file Excel đến file Access.
Code kết nối với CSDL ví dụ file Access có tên là CSDL.mdb với Pass là 1234 , code kết nối sẽ như sau:
Public cnn As New ADODB.Connection
Sub Moketnoi()
Set cnn = New ADODB.Connection
Dim strCNString As String
strCNString = "Data Source=" & ThisWorkbook.Path & "CSDL.mdb"
With cnn
.Provider = "Microsoft Jet 4.0 OLE DB Provider"
.ConnectionString = strCNString
.Properties("Jet OLEDB:Database Password") = "1234"
.CursorLocation = adUseClient
.Open
End With
End Sub
JicwsL8zrGY
Mình xin gửi Data mẫu để các bạn tiện thực hành.
Lưu ý các bạn chép file này vào chung với folder file excel truy vấn của các bạn nhé.
Phát biểu SQL SELECT
Phát biểu SQL SELECT: Chọn các cột theo ý muốn từ 1 cơ sở dữ liệu, ở đây là tên file cần kết nối là CSDL.mdb:
Dùng phát biểu này để chọn (SELECT) thông tin từ (FROM) một bảng như sau:
SELECT TenCotCanLay FROM TenBang
Ví dụ hình bên dưới là bảng dữ liệu có tên là tblData, trong bảng này có đầy đủ các trường (Cột) như sau:
2921
Bây giờ tôi lấy ví dụ là chỉ lấy 3 cột (TP, ,) Lưu ý đối với những cột có tên đặc biệt và có cách trắng chúng ta nên thêm [] vào tên cột đó.
SELECT TP, ,
FROM tblData;
Kết quả sẽ như sau:
2920
Lưu ý nếu muốn chọn tất cả các cột thì chỉ cần Select * from TenBang là đủ.
Bây giờ bắt đầu ta lấy dữ liệu từ bảng tblData ra Excel cell bắt đầu là A5.
1./ Lấy tất cả các cột có trong bảng:
Sub LayDuLieuTatCaCot()
On Error GoTo loi
Dim lsSQL As String: Dim rst As New ADODB.Recordset
If cnn.State <> 1 Then Moketnoi
lsSQL = "SELECT * " & _
"FROM tblData"
rst.Open lsSQL, cnn, adOpenStatic, adLockReadOnly
Cells.ClearContents
Range("A5").CopyFromRecordset rst
rst.Close
Set rst = Nothing
cnn.Close
Set cnn = Nothing
Exit Sub
loi:
MsgBox Err.Description
End Sub
2./ Lấy 3 cột (SUPPLIER, , ) lưu ý nếu ta select cột nào trước thì nó sẽ ra cột đó trước, ví dụ tôi lấy cột Supplier trước thì nó sẽ hiển thị cột này trước, mặc dù vị trí thực của nó nằm trong bảng ở sau các cột kia.
Sub LayDuLieu3Cot()
On Error GoTo loi
Dim lsSQL As String: Dim rst As New ADODB.Recordset
If cnn.State <> 1 Then Moketnoi
lsSQL = "SELECT SUPPLIER, [MATERIAL NAME], [COLOR NAME] " & _
"FROM tblData"
rst.Open lsSQL, cnn, adOpenStatic, adLockReadOnly
Cells.ClearContents
Range("E5").CopyFromRecordset rst
rst.Close
Set rst = Nothing
cnn.Close
Set cnn = Nothing
Exit Sub
loi:
MsgBox Err.Description
End Sub
MH2-fAElpXw
Mệnh đề SQL WHERE
Để bóc dữ liệu trong 1 bảng dữ liệu theo ý muốn ta có mệnh đề WHERE vào sau phát biểu SELECT với cú pháp như sau:
*./ Cú pháp:
Select TenCot.....
From TenBang
Where Điều kiện của TenCot cần lọc
PHÉP TOÁN | MÔ TẢ
=|So sánh bằng
<>|So sánh không bằng, khác
>|Lớn hơn
<|Nhỏ hơn
>=|Lớn hơn hoặc bằng
<=|Nhỏ hơn hoặc bằng
BETWEEN|Nằm giữa một khoảng
LIKE|So sánh mẫu chuỗi
*./ Lưu ý: – Đối với các điều kiện lọc dữ liệu là chuổi ta nên bao quanh chúng bằng dấu nháy đơn ví dụ ta cần lọc cột là màu BLACK thì ta phải ghi 'BLACK' còn nếu là số thì không cần thêm gì hết.
– Nếu ta muốn lọc theo điều kiện 1 phần của chuổi thì ta thêm dấu % vào điều kiện lọc, ví dụ ta muốn lọc những loại vật tư có tên đầu tiên là POLY thì ta thêm như sau 'POLY%', thì nó sẽ cho ra kết quả là chỉ lọc những loại vật tư bắt đầu là chữ POLY
Ví dụ: Cũng CSDL trên ta có câu lệnh truy vấn so sánh chuổi của cột nào có dữ liệu thõa điều kiện là 'KOREA' thì bóc ra: TA DÙNG PHÉP TOÁN LIKE như sau:
Sub LayDuLieuDK()
On Error GoTo loi
Dim lsSQL As String: Dim rst As New ADODB.Recordset
If cnn.State <> 1 Then Moketnoi
[B][COLOR=#ff0000] lsSQL = "SELECT * " & _
"FROM tblData " & _
"Where [ORIGIN] [/COLOR][COLOR=#0000ff]like [/COLOR][COLOR=#ff0000]'KOREA'"[/COLOR][/B]
rst.Open lsSQL, cnn, adOpenStatic, adLockReadOnly
Cells.ClearContents
Range("A5").CopyFromRecordset rst
rst.Close
Set rst = Nothing
cnn.Close
Set cnn = Nothing
Exit Sub
loi:
MsgBox Err.Description
End Sub
-mrG5xcUXus
www.giaiphapexcel.com/diendan/threads/ado-c%C4%83n-b%E1%BA%A3n-k%E1%BA%BFt-n%E1%BB%91i-truy-v%E1%BA%A5n-csdl-t%E1%BB%AB-file-excel-%C4%91%E1%BA%BFn-file-access.69450/
Khoá học Trưởng phòng nhân sự
Nguồn nhân lực là một trong Tứ trụ kinh doanh của doanh nghiệp, có tác động tới sự tồn tại và phát triển bền...
Xem khóa học
Update
Đợi đã lâu mà anh HTN không viết tiếp, thôi thì mình viết tiếp cho xong phần dang dỡ này vậy:
*) Mệnh đề SQL UPDATE: Dùng để chỉnh sửa hay cập nhật nội dung vào CSDL
*) Cú Pháp:
UPDATE TenBangCanDuocCapNhat
SET TenCot1CanCapNhat=NoiDungCapNhatChoCot1,TenCot2CanCapNhat=NoiDungCapNhatChoCot2,…
WHERE TenCotLamDK=DKDeCapNhat
*) Ví dụ: Cũng với CSDL ở bài [URL="https://www.giaiphapexcel.com/forum/showthread.php?69450-ADO-c%C4%83n-b%E1%BA%A3n-K%E1%BA%BFt-n%E1%BB%91i-truy-v%E1%BA%A5n-CSDL-t%E1%BB%AB-file-Excel-%C4%91%E1%BA%BFn-file-Access&p=426814#post426814"%5D2 mình xin cập nhật cột Supplier = nội dung mới là 'Thu Test Cai coi cap nhat duoc khong?' và cột TP là 'hic hic', với điều kiện cập nhật là ID của dòng cần được cập nhật là 2. Vậy tôi sẽ viết như sau:
Select distinct
*) Mệnh đề SQL SELECT DISTINCT: Dùng để lọc duy nhất
*) Cú Pháp:
SELECT DISTINCT TenCot1, TenCot2…
FROM TenBang
*) Ví dụ: Cũng với CSDL ở bài [URL="https://www.giaiphapexcel.com/forum/showthread.php?69450-ADO-c%C4%83n-b%E1%BA%A3n-K%E1%BA%BFt-n%E1%BB%91i-truy-v%E1%BA%A5n-CSDL-t%E1%BB%AB-file-Excel-%C4%91%E1%BA%BFn-file-Access&p=426814#post426814"%5D2 tôi xin lấy dữ liệu duy nhất của cột Supplier và Origin thì tôi sẽ viết như sau:
Order by
*) Mệnh đề SQL ORDER BY: Nằm ở cuối câu lệnh, dùng để sắp xếp lại dữ liệu các cột.
*) Cú Pháp:
SELECT COT1, COT2…
FROM TENBANG
ORDER BY COT1 ASC|DESC, COT2 ASC|DESC …
Lưu ý: Sắp xếp tăng dần thì ta thêm ASC, ngược lại muốn sắp xếp theo cách giảm dần thì ta thêm DESC ở sau tên cột cần muốn sắp xếp.
(Nếu không ghi ASC hoặc DESC gì hết thì nó sẽ tự sắp xếp theo cách tăng dần)
*) Ví dụ: Cũng với CSDL ở bài [URL="https://www.giaiphapexcel.com/forum/showthread.php?69450-ADO-c%C4%83n-b%E1%BA%A3n-K%E1%BA%BFt-n%E1%BB%91i-truy-v%E1%BA%A5n-CSDL-t%E1%BB%AB-file-Excel-%C4%91%E1%BA%BFn-file-Access&p=426814#post426814"%5D2 tôi xin sắp xếp lại cột TP tăng dần, ID giảm dần thì tôi sẽ viết như sau:
Insert into
*) Mệnh đề SQL INSERT INTO: Là dùng để thêm mới dữ liệu.
*) Cú Pháp:
Cách 1: Chèn thêm dòng không theo tên cột, dữ liệu sẽ được chèn vào CSDL theo thứ tự của cột.
Lưu ý: Cách này phải chèn toàn bộ cột theo thứ tự cột trong CSDL
INSERT INTO TênBảngCầnChèn
VALUES (GiáTrị1,GiáTrị2, GiáTrị3,…)
Cách 2: Chèn thêm dòng theo tên cột, dữ liệu sẽ được chèn vào CSDL theo tên cột.
INSERT INTO TênBảngCầnChèn (Cột1, Cột2, Cột3,…)
VALUES (GiáTrị1, GiáTrị2, GiáTrị3,…)
*) Ví dụ: Cũng với CSDL ở bài [URL="https://www.giaiphapexcel.com/forum/showthread.php?69450-ADO-c%C4%83n-b%E1%BA%A3n-K%E1%BA%BFt-n%E1%BB%91i-truy-v%E1%BA%A5n-CSDL-t%E1%BB%AB-file-Excel-%C4%91%E1%BA%BFn-file-Access&p=426814#post426814"%5D2 tôi xin minh họa chèn dữ liệu theo từng cách ở trên như sau:
Cách 1:
Tôi chèn dòng sau vào bảng:
ID|PONO|W_HDATE|TP|MATERIAL NAME|SPEC 2|COLOR NAME|POQTY|INPUTQTY|BALANCE|UNIT|PRICE|M_UNIT|AMOUNT|ORIGIN|SUPPLIER|REMARK
500
|DW13GW019|
01/06/2013
|AA|MESH 192|44|BLACK|
1000
|
0
|
-1000
|YDS|
1.9
|USD.|
1900
|VIETNAM|YOO SUNG MESH|
Cách 2: Ví dụ tôi chèn ID=501,W_HDate=30/01/2013,Supplier=YOO SUNG MESH thì tôi sẽ viết như sau:
Thì chỉ duy nhất 3 giá trị trên được chèn vào các cột tương ứng với nó, các cột khác sẽ bị trống.
Delete
*) Mệnh đề SQL DELETE: Là dùng để xóa dữ liệu.
*) Cú Pháp:
– Xóa toàn bộ bảng dữ liệu:
DELETE
FROM TênBảngCầnXóa
Hoặc:
DELETE *
FROM TênBảngCầnXóa
– Xóa dữ liệu theo điều kiện:
DELETE
FROM TênBảngCầnXóa
WHERE ĐiềuKiệnXóa
Hoặc:
DELETE *
FROM TênBảngCầnXóa
WHERE ĐiềuKiệnXóa
*) Ví dụ: Cũng với CSDL ở bài [URL="https://www.giaiphapexcel.com/forum/showthread.php?69450-ADO-c%C4%83n-b%E1%BA%A3n-K%E1%BA%BFt-n%E1%BB%91i-truy-v%E1%BA%A5n-CSDL-t%E1%BB%AB-file-Excel-%C4%91%E1%BA%BFn-file-Access&p=426814#post426814"%5D2 tôi xin xóa dòng dữ liệu có ID=2 thì tôi sẽ viết như sau:
And & Or
*) AND & OR: Là dùng để kết hợp điều kiện truy vấn dữ liệu.
– AND: Là sự kết hợp 1 điều kiện thứ nhất và thứ 2 (Đk n). Dữ liệu sẽ xuất hiện nếu cả 2 (Đk n) điều kiện đều được thỏa mãn.
– OR: Dữ liệu sẽ xuất hiện khi thỏa mãn 1 trong nhiều điều kiện.
*) Ví dụ:
– AND: Cũng với CSDL ở bài [URL="https://www.giaiphapexcel.com/forum/showthread.php?69450-ADO-c%C4%83n-b%E1%BA%A3n-K%E1%BA%BFt-n%E1%BB%91i-truy-v%E1%BA%A5n-CSDL-t%E1%BB%AB-file-Excel-%C4%91%E1%BA%BFn-file-Access&p=426814#post426814"%5D2 tôi lọc ra những mặc hàng có điều kiện cột TP='A' và ORIGIN='KOREA' thì tôi sẽ viết như sau:
==> Dữ liệu sẽ được xuất hiện 7 dòng với cột TP=A và ORIGIN=KOREA
– OR: Cũng với CSDL ở bài [URL="https://www.giaiphapexcel.com/forum/showthread.php?69450-ADO-c%C4%83n-b%E1%BA%A3n-K%E1%BA%BFt-n%E1%BB%91i-truy-v%E1%BA%A5n-CSDL-t%E1%BB%AB-file-Excel-%C4%91%E1%BA%BFn-file-Access&p=426814#post426814"%5D2 tôi lọc ra những mặc hàng có điều kiện cột TP='A' hoặc ORIGIN='KOREA' thì tôi sẽ viết như sau:
==> Dữ liệu sẽ được xuất hiện 188 dòng với điều kiện dòng dữ liệu cột thỏa mãn 1 trong 2 điều kiện TP=A hoặc ORIGIN=KOREA.
Anh thử dùng = thay vì dùng like.
Không biết anh test sao trên máy em vẫn là phân biệt được cho dù dùng like hoặc dùng =, đây là file em kiểm đã thử trên máy em
Bạn thử tham khảo bài này:
[URL='https://www.giaiphapexcel.com/forum/showthread.php?69630-Th%E1%BA%A3o-lu%E1%BA%ADn-v%E1%BB%81-b%C3%A0i-ADO-c%C4%83n-b%E1%BA%A3n-K%E1%BA%BFt-n%E1%BB%91i-truy-v%E1%BA%A5n-CSDL-t%E1%BB%AB-file-Excel-%C4%91%E1%BA%BFn-file-Access&p=492170#post492170']https://www.giaiphapexcel.com/forum/…ile-Excel-đến-file-Access&p=492170#post492170
1. Union
2. Join
1. accdb thì provider phải là ACE chứ. (Provider)
2. ACE hay Jet gì thì cũng mở password qua Jet. (Properties)
Tuy nhiên, vì nó là Jet cho nên nó không mở được những files được password encrypted theo kiểu của 2007 trở lên.
Muốn mở bằng connection string này thì phải encrypt nó lại theo kiểu cũ (2003).
– Vào Access, tháo password. Đóng lại.
– vào Access->File->Options->Client
Settings->Advanced, tích "use legacy encryption"
– Đặt password trở lại.
Encrypt kiểu cũ như vầy không an toàn bằng kiểu mới. Nhưng đó là cách duy nhất để kết nối với ADO.
Bạn hoàn toàn có thể thêm và xóa trường dữ liệu bình thường bằng ví dụ sau:
1. Xóa
2. Thêm
1. Dùng câu lệnh truy vấn bỏ trống cột.
2. Tạo bảng mới, lấy ID làm mối quan hệ với bảng gốc. Rồi xử lý bằng câu lệnh SQL chứ ai lại cập nhật trực tiếp vào bảng gốc.
Động cơ hai thì mới chạy xăng pha nhớt. Động cơ 4 thì bắt buộc chạy xăng không pha. Tuy vậy hồi 1976 – 1980 thời mua xăng dầu phải có tem phiếu, xe hai thì dám chạy bằng xăng pha dầu hoả, xe bốn thì cũng pha nhưng pha ít chứ pha nhiều không nổ máy
Nếu coi data là nhiên liệu và app là động cơ thì chuyện chọn nhiên liệu phù hợp với đời động cơ là hợp lý đúng không anh @Kiều Mạnh? Phiên bản Delphi của anh ra năm nào mà sao phải cố nuốt cái data đời 1997 khổ thế?:rolleyes:
Tôi xin lỗi vì chỉ khoe mấy cái nhớ linh tinh về xăng dầu mà tôi nhớ. Còn về phiên bản office và tại sao " Mấy trăm anh kỹ sư MS đã tính kỹ lắm " mà vẫn không mở được Access 1997-2000 thì tôi mù tịt.