VB6 Thao tác ADO

Euler

Administrator
Thành viên BQT
Microsoft ActiveX Data Object (ADO)
Truy cập dữ liệu thông qua OLE DB provider.

[Reference]
Microsoft ActiveX Data Objects 2.5 Library (msado15.dll)

[Khai báo biến]
Mã:
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
[Tạo Object]
Mã:
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
Các chương trình mẫu sẽ giới thiệu trong topic này:

ADO Connection
  • Open :
  • Close :

ADO Recordset : Từ Table, kết quả của lệnh này sẽ là một bản ghi (một hay nhiều dòng dữ liệu)
  1. : Mở con trỏ.
  2. : Con trỏ đang ở vị trí phía trước bản ghi đầu tiên hay là không? <Lời người dịch : Tương tự đầu trang văn bản word>
  3. : Con trỏ đang ở vị trí cuối cùng của bản ghi cuối cùng hay không? <Lời người dịch : Tương tự cuối văn bản word>
  4. : Trả về số lượng bản ghi <Lời người dịch : Tương tự số dòng dữ liệu>
  5. : Đưa con trỏ về vị trí bản ghi đầu tiên <Lời người dịch: Tương tự đưa con trỏ về đầu trang văn bản>
  6. : Đưa con trỏ về vị trí bản ghi cuối cùng <Lời người dịch: Tương tự đưa con trỏ về dòng cuốiccuuar văn bản>
  7. : Di chuyển con trỏ tới bản ghi tiếp theo.
  8. : Di chuyển con trỏ về bản ghi phía trước.
  9. : Tạo bả ghi mới
  10. : Lưu các thay đổi với bản ghi hiện tại.
  11. : Xóa bản ghi.
  12. : Đóng Recordset.

Q&A: Hỏi đáp : Không biên dịch.
 

Euler

Administrator
Thành viên BQT
Chương trình mẫu SELECT :
Kết nối với dữ liệu Access, sau khi thực thi Select thì trích xuất dữ liệu và ngắt kết nối DB.
Mã:
Private Sub getSQL()

    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Set cn = New ADODB.Connection
    Set rs = New ADODB.Recordset

    Dim strSQL

    cn.Open "Driver={Microsoft Access Driver (*.mdb)};DBQ=C:¥WK¥TEST.mdb" 'MS-AccessのDBに接続

    strSQL = "SELECT * FROM TUHOCVBA"     'Cấu trúc SQL
    rs.Open strSQL, cn, adOpenForwardOnly, adLockReadOnly, adCmdText         'Thực thi SQL

    While Not rs.EOF               'Lặp cho tới khi kết thúc
        Debug.Print rs!HoTen   'Trích xuất cột dữ liệu「HoTen」
        rs.MoveNext                 'Di chuyển tới bản ghi tiếp theo
        DoEvents
    Wend

    rs.Close
    cn.Close
    Set rs = Nothing
    Set cn = Nothing

End Sub
Nguồn tham khảo và dịch :
Mã:
http://cya.sakura.ne.jp/vb/ADO.htm#sample1
 
T

thanhphong

Guest
Chương trình mẫu CREATE :
Mã:
'*******************************************************************
'  Ket noi toi MS-Access, sau khi tao ban ghi moi thi ngat ket noi toi DB
'*******************************************************************
Private Sub getSQL()

    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Set cn = New ADODB.Connection
    Set rs = New ADODB.Recordset

    Dim strTBL

    cn.Open "Driver={Microsoft Access Driver (*.mdb)};DBQ=C:¥WK¥THVBA.mdb" 'Ket noi toi MS-Access DB

    strTBL = "SANPHAM"     'TableName
    rs.Open strTBL, cn, adOpenForwardOnly, adLockOptimistic, adCmdTable   'Open table

    rs.AddNew                   'Them ban ghi moi
    rs!SANPHAM = "SuaChua"   'Thiet dinh ten san pham
    rs!SPCODE = "100"     'Thiet dinh ma san pham
    rs!GIA = 70              'Thiet dinh gia san pham
    rs.Update                   'Update & Save

    rs.Close
    cn.Close
    Set rs = Nothing
    Set cn = Nothing

End Sub
Nguồn :
Mã:
http://cya.sakura.ne.jp/vb/ADO.htm#sample2
 
B

bvtvba

Guest
Chương trình mẫu UPDATE :
Mã:
'UPDATE DB

'******************************************************
'  Ket noi MS-Access, thay doi noi dung, sau do ngat ket noi voi DB
'******************************************************
Private Sub getSQL()

    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Set cn = New ADODB.Connection
    Set rs = New ADODB.Recordset

    Dim strSQL

    cn.Open "Driver={Microsoft Access Driver (*.mdb)};DBQ=C:¥WK¥TEST.mdb" 'Ket noi voi MS-Access DB

    strSQL = "SELECT * FROM THVBA WHERE MASANPHAM='100'"     'Cu phap SQL
    rs.Open strSQL, cn, adOpenStatic, adLockOptimistic, adCmdText         'Thuc thi SQL

    If Not rs.EOF Then
        rs!PRICE = 80             'Thay doi gia ca
        rs.Update                   'Luu thay doi
    End If

    rs.Close
    cn.Close
    Set rs = Nothing
    Set cn = Nothing

End Sub
Nguồn :
Mã:
http://cya.sakura.ne.jp/vb/ADO.htm#sample3
 
Phương thức Open:
Chức năng :
Kết nối tới cơ sở dữ liệu
Code : cn.Open
DatabaseThông tin kết nối
MS-Access"Driver={Microsoft Access Driver (*.mdb)};DBQ=MDB File Name"
SQL-Server"Driver={SQL Server};SERVER=SeverName;DATABASE=DbName;UID=UserID;PWD=Password;"
postgreSQL"Driver={PostgreSQL};SERVER=SeverName;DATABASE=DbName;UID=UserID;PWD=Password;"
EXCEL"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=XLS_FileName;Extended Properties=EXCEL_Version;"
Ví dụ:
Mã:
cn.Open "Driver={Microsoft Access Driver (*.mdb)};DBQ=C:¥WK¥TEST.mdb"     'Kết nối MS-Access
cn.Open "Driver={SQL Server};SERVER=SICILIAN;DATABASE=BITTER;UID=PE;PWD=PU;"     'Kết nối SQL-Server
cn.Open "Driver={PostgreSQL};SERVER=SICILIAN;DATABASE=BITTER;UID=PE;PWD=PU;"     'Kết nối postgreSQL
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:¥WK¥TEST.XLS;Extended Properties=Excel 8.0;" 'Kết nối EXCEL97
 

Euler

Administrator
Thành viên BQT
Phương thức Close :
Chức năng :
Ngắt kết nối
Code : cn.Close
Ví dụ :
Mã:
Set cn = New ADODB.Connection
cn.Open "Driver={Microsoft Access Driver (*.mdb)};DBQ=C:¥WK¥TEST.mdb"

cn.Close   'Ngắt kết nối
Set cn = Nothing
Khi đóng Connection Object, thì Recordset Object cũng sẽ bị ngắt.
Nếu như Recordset Object đang mở, mà bạn tiến hành đóng Connection Object, thì toàn bộ Recordset Object chưa xử lý, những thay đổi của nó sẽ bị hủy.
Ngay cả đóng Object thì bộ nhớ cũng không bị xóa. Để xóa bộ nhớ mà Object gây ra, thì bạn cần thiết định biến object là Nothing.
 

vbano1

SMod
Thành viên BQT
Phương thức: Open
Chức năng: Mở con trỏ
Code: rs.Open Source, ActiveConnection, CursorType, LockType, Options
SourceLệnh SQL, Table Name, Thủ tục thực thi
ActiveConnectionTên biến của đối tượng kết nối
CursorTypeLoại con trỏ được nhà cung cấp sử dụng khi mở bộ ghi. (Recordset )
CursorTypeThuyết minh
adOpenForwardOnlyĐây là giá trị mặc định. Mở con trỏ loại cuộn tiến.
adOpenKeysetMở con trỏ bộ phím.
adOpenDynamicMở con trỏ động.
adOpenStaticMở con trỏ tĩnh.
LockTypeLoại khóa (điều khiển đồng thời) được nhà cung cấp sử dụng khi mở bộ ghi.
LockTypeThuyết minh
adLockReadOnlyĐây là giá trị mặc định. Chỉ đọc. Không thể thay đổi dữ liệu.
adLockPessimisticKhóa độc quyền cho mỗi bản ghi. Thông thường, nhà cung cấp khóa bản ghi trong nguồn dữ liệu khi chỉnh sửa, sử dụng khóa tối thiểu cần thiết để đảm bảo rằng bản ghi có thể được chỉnh sửa.
adLockOptimisticKhóa dùng chung cho mỗi bản ghi. Nhà cung cấp khóa bản ghi bằng khóa chia sẻ chỉ khi bạn gọi phương thức Cập nhật.
adLockBatchOptimisticCập nhật hàng loạt được chia sẻ . Bắt buộc đối với chế độ cập nhật hàng loạt thay vì chế độ cập nhật tức thì.
OptionsCách trình cung cấp đánh giá đối số nếu đối số Nguồn đại diện cho một cài đặt khác với đối tượng Lệnh hoặc nếu bạn muốn khôi phục Tập bản ghi từ tệp đã lưu trước đó.
OptionsThuyết minh
adCmdTextChỉ định rằng trình cung cấp đánh giá Nguồn dưới dạng định nghĩa chuỗi lệnh.
adCmdTableChỉ định rằng ADO sẽ tạo một truy vấn SQL trả về tất cả các hàng từ bảng có tên Nguồn.
adCmdTableDirectChỉ định rằng trình cung cấp trả về tất cả các hàng từ bảng có tên Nguồn.
adCmdStoredProcChỉ định rằng nhà cung cấp đánh giá Nguồn như một thủ tục được lưu trữ.
adCmdUnknownChỉ định rằng loại lệnh được chỉ định trong đối số Nguồn là không xác định.
adCmdFileChỉ định khôi phục Tập bản ghi đã tồn tại (đã lưu) từ tệp được chỉ định trong đối số Nguồn.
adAsyncExecuteChỉ định rằng đối số Nguồn được thực thi không đồng bộ.
adAsyncFetchChỉ định rằng các hàng còn lại của số tiền ban đầu được chỉ định trong thuộc tính Kích thước tìm nạp ban đầu được tìm nạp không đồng bộ. Nếu một hàng chưa bao giờ được tìm nạp được yêu cầu, thì luồng chính sẽ bị chặn cho đến khi hàng được yêu cầu có sẵn.
adAsyncFetchNonBlockingChỉ định luồng chính chưa bao giờ bị chặn trong quá trình tìm nạp. Nếu hàng được yêu cầu chưa bao giờ được tìm nạp, hàng hiện tại sẽ tự động được chuyển đến cuối tệp.
Ví dụ:
Mã:
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim strSQL
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
cn.Open "Driver={Microsoft Access Driver (*.mdb)};DBQ=C:¥WK¥TEST.mdb"

strSQL = "SELECT * FROM HINMST"     'Cấu trúc SQL
rs.Open strSQL, cn, adOpenForwardOnly, adLockReadOnly, adCmdText     'Thực thi SQL
Mã:
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim strTBL
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
cn.Open "Driver={Microsoft Access Driver (*.mdb)};DBQ=C:¥WK¥TEST.mdb"

strTBL = "HINMST"     'Table Name
rs.Open strTBL, cn, adOpenStatic, adOpenForwardOnly, adCmdTable     'Open Table
 
Thuộc tính BOF, EOF
Chức năng :

Trả về giá trị Boolean cho biết vị trí của bản ghi hiện tại là trước bản ghi đầu tiên hay sau bản ghi cuối cùng.
Code :
result = rs.BOF ※Vị trí bản ghi ở trước bản ghi đầu tiên hay không
result = rs.EOF ※Vị trí bản ghi ở sau bản ghi cuối cùng hay không
Ví dụ:
Mã:
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
cn.Open "Driver={Microsoft Access Driver (*.mdb)};DBQ=C:¥WK¥TEST.mdb"
strSQL = "SELECT * FROM HINMST"     'Cú pháp SQL
rs.Open strSQL, cn, adOpenForwardOnly, adLockReadOnly, adCmdText     'Thực thi SQL

While Not rs.EOF         'Lặp trong khi chưa tới vị trí bản ghi cuối cùng
    Debug.Print rs!HINMEI
    rs.MoveNext           'Đi tới bản ghi tiếp theo
    DoEvents
Wend

rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
※Nếu bạn xóa bản ghi cuối cùng còn lại trong đối tượng Recordset, các thuộc tính BOF và EOF vẫn là False cho đến khi bạn di chuyển vị trí của bản ghi hiện tại.
 
Thuộc tính RecordCount
Chức năng :
Trả về số lượng bản ghi
Cấu trúc : result = rs.RecordCount
Ví dụ :
Mã:
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
cn.Open "Driver={Microsoft Access Driver (*.mdb)};DBQ=C:¥WK¥TEST.mdb"
strSQL = "SELECT * FROM HINMST"     'SQL文
rs.Open strSQL, cn, adOpenStatic, adLockOptimistic, adCmdText     'Thuc thi SQL

result = rs.RecordCount     'Lay so luong ban ghi

rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
-Trường hợp không biết số lượng bản ghi, hoặc, provider, chủng loại con trỏ không hỗ trợ RecordCount, thì giá trị trả về cho thuộc tính này là -1 .
-Thuộc tính RecordCount sẽ trả về -1 với con trỏ của thanh cuộn di chuyển về hướng trước. Hoaawcj với con trỏ tĩnh hay Keyset thì sẽ trả về con số thực tế.
-Nếu thuộc tính BOF và EOF là True, thuộc tính RecordCount là 0.
 
Phương thức: MoveFirst、MoveLast、MoveNext、MovePrevious
Cấu trúc :
rs.MoveFirst : Đưa con trỏ về bản ghi đầu tiên
rs.MoveLast : Đưa con trỏ về bản ghi cuối cùng
rs.MoveNext : Đưa con trỏ tới bản ghi tiếp theo
rs.MovePrevious : Đưa con trỏ lùi về bản ghi trước đó


Mã:
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
cn.Open "Driver={Microsoft Access Driver (*.mdb)};DBQ=C:¥WK¥TEST.mdb"
strSQL = "SELECT * FROM HINMST"     'SQL文
rs.Open strSQL, cn, adOpenStatic, adLockOptimistic, adCmdText     'SQLを発行

While Not rs.EOF         'Von lap cho toi khi ket thuc
    Debug.Print rs!HINMEI
    rs.MoveNext           'tien toi ban ghi tiep theo
    DoEvents
Wend

rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
* Nếu thuộc tính EOF đã là True, sẽ xảy ra lỗi nếu bạn cố gắng tiếp tục.
* Nếu thuộc tính BOF đã là True, sẽ xảy ra lỗi nếu bạn cố gắng lùi lại.
* Nếu MoveLast được gọi khi đối tượng Recordset không hỗ trợ cuộn lùi, lỗi sẽ xảy ra.
 
Phương thức AddNew
Chức năng: Tạo bản ghi mới
Cấu trúc : rs.AddNew

Ví dụ:
Mã:
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
cn.Open "Driver={Microsoft Access Driver (*.mdb)};DBQ=C:¥WK¥TEST.mdb"
strTBL = "HINMST"     'Table Name
rs.Open strTBL, cn, adOpenForwardOnly, adLockOptimistic, adCmdTable  'Open Table
rs.AddNew                   'Thêm bản ghi mới
rs!HINMEI = "あんぱん"   'Đặt「Tên Sản phẩm」
rs!HINCODE = "100"     'Đặt「Mã Sản Phẩm
rs!PRICE = 70             'Đặt「Giá」
rs.Update                   'Cập nhật (Save)

rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
Sau khi gọi phương thức AddNew, bản ghi mới sẽ trở thành bản ghi hiện tại và ngay cả sau khi gọi phương thức Cập nhật, con trỏ sẽ ở vị trí bản ghi hiện tại.
Nếu bạn gọi phương thức AddNew trong khi chỉnh sửa bản ghi hiện tại hoặc thêm bản ghi mới, thì phương thức Cập nhật được gọi để lưu tất cả các thay đổi và tạo bản ghi mới một cách chính thức.
 
Phương thức Update
Chức năng:Lưu các thay đổi của bạn vào bản ghi hiện tại
Cấu trúc : rs.Update

Ví dụ:
Mã:
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
cn.Open "Driver={Microsoft Access Driver (*.mdb)};DBQ=C:¥WK¥TEST.mdb"
strSQL = "SELECT * FROM HINMST WHERE HINCODE='100'"  'SQL文
rs.Open strSQL, cn, adOpenStatic, adLockOptimistic, adCmdText  'SQL文を実行

If Not rs.EOF Then
    rs!PRICE = 120   'Thay đổi giá
    rs.Update        'Lưu thay đổi
End If

rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
Trước khi phương thức Update được gọi, nếu bạn di chuyển từ một bản ghi đang được cập nhật hay thực hiện Add (thêm bản ghi) thì việc update sẽ được diễn ra tự động.
Sau khi gọi phương thức Cập nhật (Update), bản ghi hiện tại được duy trì như trước đó.
 
Phương thức : Delete
Chức năng: Xóa bản ghi đã chỉ định
Cấu trúc : rs.Delete

Ví dụ:
Mã:
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
cn.Open "Driver={Microsoft Access Driver (*.mdb)};DBQ=C:¥WK¥TEST.mdb"

strSQL = "SELECT * FROM HINMST WHERE HINCODE='100'"  'Cấu trúc SQL
rs.Open strSQL, cn, adOpenStatic, adLockOptimistic, adCmdText  'Thực thi SQL

If Not rs.EOF Then
    rs.Delete        'Xóa bản ghi
End If

rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
Chú ý:
Lỗi sẽ xảy ra nếu tính năng xóa bản ghi không có sẵn trên đối tượng Recordset.
Trong chế độ cập nhật ngay lập tức, cơ sở dữ liệu sẽ bị xóa ngay lập tức. Trong các chế độ khác, bản ghi bạn muốn xóa khỏi bộ đệm được đánh dấu và thực sự bị xóa khi bạn gọi phương thức UpdateBatch.
Bản ghi hiện tại đã xóa vẫn là bản ghi hiện tại cho đến khi nó được chuyển sang bản ghi khác.
Nếu giao dịch của bạn chứa các bản ghi đã xóa, bạn có thể sử dụng phương pháp RollbackTrans để khôi phục các bản ghi đã xóa.
 
Phương thức Close
Chức năng:
Đóng Recordset
Code : rs.Close
Ví dụ:
Mã:
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
cn.Open "Driver={Microsoft Access Driver (*.mdb)};DBQ=C:¥WK¥TEST.mdb"
strSQL = "SELECT * FROM HINMST WHERE HINCODE='100'"  'SQL
rs.Open strSQL, cn, adOpenStatic, adLockOptimistic, adCmdText

rs.Close   'Dong Recordset
cn.Close 'Dong ket noi
Set rs = Nothing
Set cn = Nothing
Chú ý:
Trong khi đang ở chế độ biên tập mà gọi phương thức Close thì sẽ dẫn đến lỗi. Trong trường hợp này hãy gọi phương thức Update hoặc CancelUpdate trước khi tiến hành Close.
Việc đóng (Close) đối tượng không xóa nó khỏi bộ nhớ. Để xóa vĩnh viễn đối tượng khỏi bộ nhớ, hãy đặt biến đối tượng thành Nothing.
 
Top