• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Đề cương Sổ Tay VB 6 và CSDL

Các mẹo vặt linh tinh khác, không thuộc nhóm nào
User avatar
truongphu
VIP
VIP
Posts: 4766
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 520 times

Đề cương Sổ Tay VB 6 và CSDL

Postby truongphu » Wed 05/08/2009 7:43 pm

(Đề cương Sổ Tay VB 6 và CSDL

Mục lục sau đây trình bày VB6 kết nối và truy vấn với file MDB. Kết nối với các file khác ở chương cuối
I- Kết nối Giao diện
* Đường dẫn tương đối
1- DAO với Data1
* TextBox và DataBind
* MSFlexGrid Control 6.0 (SP3)

2- ADO với ADODC1
* MSDataGrid Control 6.0

3- ADO với DataEnvironment
* DataReport
II- Kết nối với code VB
* Hàm CreateObject và Add Reference
1- DAO
* Tạo file MDB
* Kết nối file

2- ADODB
* Tạo file MDB
* Kết nối file
3- Các khai báo Connection và hoạt động
Connectionstring, crusor
4- Các khai báo Recordset và hoạt động
Vị trí record, find, move
5- Các khai báo Command và hoạt động

III- Truy vấn SQL cho Recordset
* Rất nhiều mẫu câu truy vấn
* Edit, AddNew, UpDate, Delete

IV- Các Controls hổ trợ khác:
a-
b- List1
c- ListView 5.0 (SP2)

V- Kết nối với XLS
VI- Kết nối với TXT
VII- Kết nối với Foxpro
VIII- Kết nối DNS
IX- Chuyển file từ Access qua Excel và ngược lại

Trên đây là đề cương sơ bộ, mong các bạn góp ý, tôi dự liệu viết trên tư liệu có sẵn của topic Kết nối CSDL dùng VB,VBA
viewtopic.php?t=3942#p24277
Phần Truy vấn là phần "nặng ký" nhất, rất mong các bạn đóng góp
Topic nầy, như tiêu đề, sẽ đề cập tất cả các vấn đề ta hay gặp khi kết nối VB6 với CSDL một cách có hệ thống

Yêu cầu:
1- Để tránh trùng lắp, nếu bài nào không trích dẫn được thì viết lại. Cố tận dụng các bài viết cũ qua LINK
2- Nếu có thắc mắc bình thường, xin hỏi ở mục Nêu Thắc Mắc, xin tránh hỏi ở đây để bài viết liên tục
Last edited by truongphu on Wed 02/09/2009 10:07 am, edited 1 time in total.


o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

User avatar
truongphu
VIP
VIP
Posts: 4766
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 520 times

Re: Đề cương Sổ Tay VB 6 và CSDL

Postby truongphu » Wed 05/08/2009 7:47 pm

I- Kết nối Giao diện
Đây là kiểu kết nối đơn giản nhất: MicroSoft đã cung cấp cho chúng ta những Controls để thiết kê và tự hoạt động trên code viết sẵn
---------
Các Project minh họa:
download/file.php?id=8380

download/file.php?id=8334

download/file.php?id=8262

download/file.php?id=8263

viewtopic.php?f=7&t=8421&p=52790&hilit=Data1#p53108

viewtopic.php?f=7&t=3942&p=49709&hilit=Data1#p49709

viewtopic.php?f=7&t=7697&p=48198&hilit=Data1#p48198

viewtopic.php?f=7&t=3942&p=48055&hilit=Data1#p48055

viewtopic.php?f=7&t=3942&p=41313&hilit=Data1#p41313


* Đường dẫn tương đối
Để ứng dụng có thể làm việc dễ dàng với file CSDL, người ta thường để chung file CSDL cùng folder với ứng dụng.
Đường dẫn của file CSDL khi đó là: App.Path & “\<Tên file>”
Hoặc file CSDL dưới một folder: App.Path & “\<Tên folder>\<Tên file>”
1- DAO với Data1
Trên Form1 của Project1, vẽ Data1
Phần Properties Data1:
- DatabaseName: chọn đến file MDB
- Kéo con trượt xuống RecordSource, chọn Table

H.1 Các bước thiết kế và kết nối Data1

1.JPG


Test Kết nối: Nói chung, khi bạn đã chọn được RecordSource thì đã chứng tỏ rằng kết nối tốt (mới đọc được các Table trong file mdb):

* TextBox và DataBind
Vẽ lên form Text1
Phần Properties Text1:
- DataSource chọn Data1
- DataField chọn Field
Run Project. Kết nối tốt sẽ không báo lỗi. Text1 hiện ra giá trị của recordset first của field được chọn.
Dùng Data1 duyệt recordset

Lưu ý:
a- Với cách làm trên nhanh, gọn nhưng khi move project sẽ bị báo lỗi sai đường dẫn MDB vì đấy là đường dẫn cố định.
Kinh nghiệm xử lý: Dán file MDB cùng folder Project, vd db1.mdb
Sau khi test tốt, tại form1, chọn Data1, phần DatabaseName xóa hết chỉ chừa db1.mdb
Hoặc tại Form Load bạn khai:

Code: Select all

Data1. DatabaseName = “db1.mdb”

Hoặc:

Code: Select all

Data1. DatabaseName = App.Path & “\db1.mdb”

b- Mở tập tin có mật khẩu, ta khai ở Form Load

Code: Select all

Data1.Connect = ";Pwd=<password>;"


c- Nếu chỉ vẽ lên Form1 có Data1 mà không khai báo gì, tại phần Form Load ta viết:
With Data1

Code: Select all

.DatabaseName = App.Path & "\db1.mdb".RecordSource = "Table1".Connect = ";Pwd=<password>;".RefreshEnd With

d- Để duyệt từng record ta dùng Data1. Thể hiện các field cần TextBox có DataField tương ứng.
Nếu số lượng Field lớn khó thiết kế textBox nhiều trên form, ta xử lý như sau:
Form1 có text1 đã có DataSource là Data1, Code trong Command1 để duyệt 4 Field 'qqq', 'www', 'eee', và 'rrr' thể hiện lên Text1 như sau:

Code: Select all

Dim a%Private Sub Command1_Click()Select Case a Mod 4Case 0: Text1.DataField = "www"Case 1: Text1.DataField = "eee"Case 2: Text1.DataField = "rrr"Case 3: Text1.DataField = "qqq"End Selecta = a + 1End Sub


Kinh nghiệm bạn xuanquy_th:
viewtopic.php?f=7&t=3942&p=54424#p53415

e- Data1 sẽ không nhận dạng được Access 2000. Chúng ta nên update:
http://download.microsoft.com/download/ ... 6sp5vb.exe
File 57.1 MB
f- Data1 chỉ hổ trợ Microsoft FlexGrid Control 6.0
* MSFlexGrid Control 6.0 (SP3)
Project1, Components thêm Microsoft FlexGrid Control 6.0
Vẽ lên Form1 MSFlexGrid1, Tại mục Properties, DataSource chọn Data1 là xong!

(Thư mục chi tiết: Kết nối CSDL dùng VB,VBA
viewtopic.php?t=3942#p24277)
Last edited by truongphu on Thu 06/08/2009 2:51 pm, edited 3 times in total.
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

User avatar
truongphu
VIP
VIP
Posts: 4766
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 520 times

Re: Đề cương Sổ Tay VB 6 và CSDL

Postby truongphu » Wed 05/08/2009 7:51 pm

2- ADO với ADODC1
Tại Menu Project1, chọn Project, Components. Kéo thanh trượt chọn Microsoft ADO Data Control 6.0 (OLEDB)
Trên Form1 của Project1, vẽ ADODC1
Phần Properties ADODC1:
ConnectionString nhấn nút ...
Trên Property Pages phần Use Connection String nhấn Build...
Bảng Data Link Properties, thẻ Provider chọn Microsoft Jet 4.0 OLE DB Provider, Next để qua thẻ Connection
Mục 1. Select or Enter ... nhấn nút ... để tìm và chọn file MDB
Nhấn Test Connection để chờ báo "Test Connection Succeeded" là êm. Nhấn OK
Bảng Property Pages hiện ra chữ Apply đậm màu, nhấn Apply
Thẻ RecordSource, mục Command Type, chọn 2 - adCmdTable. Ô bên dưới sáng lên, chọn Table làm việc. Nhấn Apply và OK

H.2 Các bước thiết kế và kết nối ADODC1

2.JPG

Test Hoạt động:
Vẽ lên form Text1
Phần Properties Text1:
- DataSource chọn Adodc1
- DataField chọn Field
Run Project. Kết nối tốt sẽ không báo lỗi. Text1 hiện ra giá trị của recordset first của field được chọn.
Dùng Adodc1 duyệt recordset

a- Ở trên ta có đường dẫn cố định. Xử lý đường dẫn tương đối như cách làm ở Data1: Trong chuỗi ConnectionString dài: cẩn thận ở đoạn ... Data Source= ...db1.mdb ... xóa đường dẫn file, chỉ còn db1.mdb như sau:
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db1.mdb;Persist Security Info=False
b- Với tập tin có mật khẩu, nhớ khai tại thẻ Authentication ở bảng Property Pages , (sau thẻ General)
c- Nếu chỉ vẽ tại Form có ADODC1 mà không khai báo gì, tại Form Load, ta viết:

Code: Select all

  1. Private Sub Form_Load()    
  2.     Adodc1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + App.Path + "\CSDL\db1.mdb" & ";Persist Security Info=False ;Jet OLEDB:Database Password=<password>"    'Dòng này ban thay Ðôi theo Ðuo'ng dân Ðên CSDL cua ban và Password cua ban. Nêu không có Pass thì bo Ði chô Password
  3.     Adodc1.RecordSource = "Select * from Table1"
  4.     Adodc1.Refresh
  5. End Sub


d- ADODC1 tương thích với Datagrid
* MSDataGrid Control 6.0
Project1, Coponent kiểm MSDataGrid Control 6.0
Form1 vẽ lên DataGrid1
Tại phầm Form_Load, ta viết code sau khi Recordset đã truy vấn Table:

Code: Select all

  1. Set DataGrid1.DataSource = objRecordSet


Sau nầy, khi Recordset truy vấn lại Table, ta chỉ viết lại:

Code: Select all

  1. DataGrid1.ReBind


(Thư mục chi tiết: Kết nối CSDL dùng VB,VBA
viewtopic.php?t=3942#p24277)
Last edited by truongphu on Wed 05/08/2009 8:01 pm, edited 2 times in total.
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

User avatar
truongphu
VIP
VIP
Posts: 4766
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 520 times

Re: Đề cương Sổ Tay VB 6 và CSDL

Postby truongphu » Wed 05/08/2009 7:57 pm

3- ADO với DataEnvironment
* DataReport

Để kết nối với CSDL, VB6 có cung cấp cho chúng ta công cụ DataEnvironment
Khi chèn DataEnvironment1 vào Project, ta sẽ có Connection1 (mặc định) mà các bước khai báo kết nối khá giống với ADODC1 đã trình bày ở trên.
viewtopic.php?f=7&t=3942&start=480#p52098

Thông thường DataEnvironment sẽ là công cụ cup cấp dữ liệu cho DataReport
Project bạn chèn DataReport1, các bước thiết kế như link trên. Ngoài ra, bạn có thể tham khảo:
DataReport1 với ADODB.Recordset
(link dưới đây chỉ dẫn đến trang, bạn chịu khó tìm bài: DataReport1)
viewtopic.php?f=7&t=3942&start=480#p51881

DataReport1 với ADODC1
(link dưới đây chỉ dẫn đến trang, bạn chịu khó tìm bài: DataReport (tiếp, phần 3))
viewtopic.php?f=7&t=3942&start=480#p52099

Lưu ý rằng khi dùng DataEnvironment với Connection1, các bước truy vấn cũng dùng như ADODB.Recordset
Tham khảo:
(link dưới đây chỉ dẫn đến trang, bạn chịu khó tìm bài cuối trang)
viewtopic.php?f=7&t=3942&start=480#p52583

* Một câu hỏi hay gặp trong DataReport là đánh số thứ tự. Bạn có thể tham khảo:
58- Đánh số thứ tự trong DataReport
viewtopic.php?f=7&t=3942&start=60#p26335

* Để in giấy nằm ngang, mời bạn đọc bài:
50- Định dạng khổ giấy của Report nằm ngang?
viewtopic.php?f=7&t=3942&start=60#p25683

Các vấn đề về DataEnvironment và DataReport tôi sẽ bổ sung sau.
Last edited by truongphu on Sat 08/08/2009 10:25 am, edited 5 times in total.
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

User avatar
truongphu
VIP
VIP
Posts: 4766
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 520 times

Re: Đề cương Sổ Tay VB 6 và CSDL

Postby truongphu » Thu 06/08/2009 2:53 pm

II- Kết nối với code VB

Dùng một biến đối tượng để kết nối mở file MDB và một biến đối tượng khác để duyệt các record

* Hàm CreateObject và Add Reference

Ta có thể tạo một biến đối tượng bằng cách khai báo tường minh, vd:

Code: Select all

  1. Dim Con As New ADODB.Connection

Trường hợp nầy ta phải Add Reference thư viện thích hợp.

Hoặc tạo một biến đối tượng với hàm CreateObject mà không cần Add Reference thư viện
Chi tiết, mời đọc bài:
Quan hệ giữa hàm VBS CreateObject và VB6
http://caulacbovb.com/forum/viewtopic.php?t=7752#p49155

1- Kết nối bằng DAO
Tại Menu Project1, chọn Project, References. Kéo thanh trượt chọn Microsoft DAO 3.6 Object Library

* Tạo file MDB
viewtopic.php?f=7&t=3942&p=54424#p53472

Code kết nối và duyệt recordset đơn giản như sau đây:

Code: Select all

  1. Dim Dtb As DAO.Database     ' Có thê dùng: Dim Dtb As Database
  2.    Dim Rcs As DAO.Recordset    ' Có thê dùng: Dim Rcs As Recordset
  3.    Set Dtb = OpenDatabase("db1.mdb")
  4.    Set Rcs = Dtb.OpenRecordset("SELECT * FROM table1")
  5.    Do While Not Rcs.EOF
  6.     MsgBox Rcs.Fields("www")
  7.     Rcs.MoveNext
  8.    Loop
  9.    Rcs.Close
  10.    Dtb.Close


a- Tập tin mdb không mật khẩu: như trên
b- Tập tin mdb có mật khẩu:

Code: Select all

  1. Set Dtb = OpenDatabase("db1.mdb", False, False, ";PWD=<password>")

c- Trong câu trên, db1.mdb được hiểu nằm cùng folder với project, bạn cũng có thể viết:

Code: Select all

  1. Set Dtb = OpenDatabase(App.Path & "\db1.mdb", False, False, ";PWD=<password>")

Hoặc:

Code: Select all

  1. Set Dtb = OpenDatabase(App.Path & "\TaiLieu\db1.mdb", False, False, ";PWD=<password>")

Hoặc đường dẫn cố định:

Code: Select all

  1. Set Dtb = OpenDatabase(“D:\HocTap\DuAn\db1.mdb”, False, False, ";PWD=<password>")

d- Cú pháp của OpenDatabase là:
OpenDatabase(<mdbName>, <Options>, <ReadOnly>, <Connect>
ở trên đã nói về mdbName
* Options mặc định là False. Nếu là True thì không ai cùng được mở thêm CSDL nầy nữa. False thì nhiều người cùng mở
* ReadOnly mặc định là False, nếu là True thì không sửa đổi CSDL được
* Connect là chuỗi chỉ cách thức mở CSDL

2- Kết nối bằng ADO
Tại Menu Project1, chọn Project, References. Kéo thanh trượt chọn Microsoft ActiveX Data Object Library từ 2.5 trở lên (hiện là 2.8)
• Tạo file MDB
http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&p=54424#p53472

hoặc chi tiết hơn:
http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942#p24367


Code kết nối và duyệt recordset đơn giản như sau đây:

Code: Select all

  1. Dim Con As New ADODB.Connection
  2.     Con.CursorLocation = adUseClient
  3.     Con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db1.mdb"
  4.     Con.Open
  5. Dim Rec As New ADODB.Recordset
  6. Rec.Open "Select * from table1", Con, adOpenDynamic, adLockOptimistic,
  7. Do While Not Rec.EOF
  8.     MsgBox Rec.Fields("www")
  9.     Rec.MoveNext
  10.    Loop
  11.    Rec.Close
  12.    Con.Close


a- Tập tin mdb không mật khẩu: như trên
b- Tập tin mdb có mật khẩu:

Code: Select all

  1. Con.ConnectionString = "Provider = Microsoft.Jet.OLEDB.4.0;" & "Data Source = db1.mdb; Persist Security Info=False; Jet OLEDB:Database Password =<password>"

Có vài bạn sơ ý viết DataSource =… và máy báo lỗi "Could not find installable ISAM", sửa lại: Data Source

c- Xử lý các hình thức đường dẫn như các mục trên
d- Thuộc tính .CursorLocation của Con cũng được hoặc Rec cũng được, chọn một trong hai. Khai báo nó trước khi Rec.Open

e- Cú pháp của lệnh ADODB.Recordset.Open là:
<Recordset.Open> <SQLString>, <ActiveConnection>, < CursorType>, <LockType>, < CommandType >
* ActiveConnection chính là Con ta đã khai báo kết nối với db1.mdb. Đây là cú pháp bắt buộc phải khai
Các hằng sau đây nếu không khai báo, ADODB.Recordset sẽ lấy giá trị mặc định: (ý nghĩa các hằng xin tham khảo các bài viết trên CLB VB vì dài quá!)
* CursorType là thuộc tính của ADODB.Recordset gồm 5 hằng, 2 hằng quen dùng là adOpenDynamic hoặc adOpenStatic mà adOpenDynamic là mạnh nhất.
(adOpenUnspecified, adOpenForwardOnly, adOpenKeyset, adOpenDynamic, adOpenStatic)
* LockType cũng là thuộc tính của ADODB.Recordset gồm 5 hằng, hằng quen dùng là adLockOptimistic: tạm khóa record khi Update được gọi
(adLockUnspecified, adLockReadOnly, adLockPessimistic, adLockOptimistic, adLockBatchOptimistic)
* CommandType thuộc về ADODB gồm 7 hằng.
(adCmdUnspecified, adCmdText, adCmdTable, adCmdStoredProc, adCmdUnknown, adCmdFile, adCmdTableDirect)
Ta có thể viết trước lệnh Rec.Open để khai báo một lần, tránh lập lại:

Code: Select all

  1. With Rec
  2.     .ActiveConnection = Con
  3. .CursorType = adOpenStatic
  4.     .LockType = adLockOptimistic
  5. End With

Thì câu lệnh từ nay sẽ đơn giản

Code: Select all

  1. Rec.Open "Select * from table1"


Riêng CommandType không đề cập vì giá trị mặc định khi thao tác với mdb là truy xuất các Table với adCmdTable

D- Đóng và mở các kết nối:
* Nhiều bạn khi mới bắt đầu mở kết nối đã ghi câu:

Code: Select all

  1. If Con.State = 1 Then Con.Close

Thành ra là thừa một câu vô dụng.
Câu nầy chỉ dùng khi ta muốn chuyển Con qua một Database khác
thay vì lệnh:

Code: Select all

  1. Con.Close

người cẩn thận ghi:

Code: Select all

  1. If Con.State = 1 Then Con.Close

để tránh trường hợp viết 2 lệnh Con.Close sẽ gây lỗi

* Khi ra lệnh đóng kết nối, muốn mở lại cùng Database thì chỉ cần viết open là xong

Code: Select all

  1. Con.Close
  2. Con.Open


* Mở database khác, phải khai báo lại Con.ConnectionString

Code: Select all

  1. Con.Close
  2. Con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db2.mdb"
  3. Con.Open


* Để giải phóng bộ nhớ SAU khi đóng các kết nối ở trên, Bảo Đảm Công Việc Đã Xong, người ta ghi:

Code: Select all

  1. Set Con = Nothing

Trong trường hợp nầy ta không còn viết:

Code: Select all

  1. Con.Open

sẽ báo lỗi vì Con không còn gì. Muốn kết nối chịu khó khai lại như trên, Bảo Đảm Công Việc Đã Xong là như thế

* Có Rec là ADODB.Recordset thì trong câu lệnh sau sẽ báo lỗi:

Code: Select all

  1. Con.Close
  2. Rec.Close


vì Rec chưa đóng thì Con chưa đươc đóng. Phải viết

Code: Select all

  1. Rec.Close
  2. Con.Close


Các bài viết sau chủ yếu dùng ADO vì đây là kiểu kết nối tân tiến nhất



(Thư mục chi tiết: Kết nối CSDL dùng VB,VBA
viewtopic.php?t=3942#p24277)
2- Nếu có thắc mắc bình thường, xin hỏi ở mục Nêu Thắc Mắc, xin tránh hỏi ở đây để bài viết liên tục
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

User avatar
truongphu
VIP
VIP
Posts: 4766
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 520 times

4- Các khai báo Recordset và hoạt động

Postby truongphu » Fri 14/08/2009 11:58 am

4- Các khai báo Recordset và hoạt động
Recordset là đối tượng chính trong kết nối với file Access, chúng phụ trách truy vấn CSDL và chuyển tải kết quả.

** Riêng về Truy vấn, xin dời lại cuối bài vì đây là phần hay nhất và phức tạp nhất, sẽ còn nhiều đóng góp của tập thể

Bài nầy viết theo thứ tự abc

a- Recordset.AbsolutePage: số trang tuyệt đối của Recordset
Thông thường một trang của recordset chứa 10 Record, bắt đầu từ record first
Số trang là: (AbsolutePosition + 9) \ 10
Code như sau:

Code: Select all

  1. MsgBox Rec.AbsolutePage


b- Recordset.AbsolutePosition: vị trí tuyệt đối record của Recordset
Code như sau: (sẽ trả về dạng số)

Code: Select all

  1. MsgBox Rec.AbsolutePosition

Cũng lưu ý ngoài dạng số, các từ sau đây còn hay dùng:
- first: vị trí 1
- last: vị trí cuối (Rec.RecordCount)
- next: vị trí kế tới (Recordset.AbsolutePosition + 1)
- previous: vị trí kề lùi (Recordset.AbsolutePosition – 1)
ngoài ra có 3 hằng với vị trí đặc biệt:
-2 = adPosBOF
-3 = adPosEOF
-1 = adPosUnknown

c- Recordset.ActiveCommand : đối tượng command tự thực hiện thao tác
Để có Recordset.ActiveCommand, ta khai báo như sau:

Code: Select all

  1. Set com = CreateObject("ADODB.Command")
  2. With com
  3.     .ActiveConnection = con ' (ADODB.connection)
  4.     .CommandType = 1 '1 = adCmdText 4 = adCmdStoredProc
  5.     .CommandText = "select * from Table1"
  6. End With
  7. Set Rec = com.Execute

Do đó Rec.ActiveCommand chính là com, ta viết code:

Code: Select all

  1. MsgBox Rec.ActiveCommand.CommandText


d- Recordset.ActiveConnection
đấy chính là ADODB.Connection, ta viết:

Code: Select all

  1. Rec.ActiveConnection = Con

- lưu ý 1: chỉ viết được câu trên khi Con đã Open kết nối
- lưu ý 2: Đã khai báo như thế tại form_Load thì lần sau, Rec.Open với câu lệnh truy vấn, khỏi khai thêm Con, tương tự với các hằng con trỏ:

Code: Select all

  1. Rec.Open "select * into table3 from table1 where [ngay sinh] < #1/1/1986#"


e- Recordset.AddNew
(còn tiếp)
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

User avatar
truongphu
VIP
VIP
Posts: 4766
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 520 times

Re: Đề cương Sổ Tay VB 6 và CSDL

Postby truongphu » Sat 15/08/2009 1:14 pm

e- Recordset.AddNew
Thêm record khi Recordset đã có dữ liệu. Ta dùng lệnh AddNew, ghi dữ liệu rồi dùng lệnh Update.

Code: Select all

  1. Rec.AddNew
  2. Rec!SBD = 102
  3. Rec![ho ten] = "dd d"
  4. Rec.Fields("ngay sinh") = #1/1/2006#
  5. Rec.Fields(4) = 25
  6. Rec.Update

Lưu ý 1: như thường lệ, giá trị số để yên, giá trị chuỗi trong dấu “”, giá trị ngày trong dấu ##
Lưu ý 2: có 3 cách viết field của Recordset: Rec! SBD, Rec.Fields("ngay sinh"), Rec.Fields(4) __ nếu cách sau thì Index tính từ 0
Lưu ý 3: Theo thông lệ, tên field không có khoảng cách. Nếu có khoảng cách, khi viết code, tên field để trong cặp dấu [] hoặc “” tùy trường hợp

f- Recordset.BOF
vị trí recordset đầu mẫu tin (không có record), đây là vị trí chết sẽ gây lỗi, tương tự Recordset.EOF là vị trí recordset cuối mẫu tin (không có record), khi viết code, ta phải bẫy lỗi nầy

Code: Select all

  1. If Not Rec.BOF Then Rec.MovePrevious

Câu trên có nghĩa là: Nếu Recordset chưa ở vị trí đầu mẫu tin thì di chuyển kế lùi 1 record
Như vậy Rec.BOF = true thì ta chỉ MoveFirst, MoveLast và MoveNext

g- Recordset.Bookmark
là một mảng ghi các vị trí record trên Recordset, Tại mỗi record, đấy cũng chính là Rec. AbsolutePosition
ta viết:

Code: Select all

  1. MsgBox Rec.Bookmark & " " & Rec.AbsolutePosition


h- Recordset.CacheSize
là bộ đệm để recordset nhớ bao nhiêu record ngay khi recordset load dữ liệu từ table, điều nầy làm recordset hoạt động truy xuất dữ liệu nhanh hơn.
Khai báo nhiều sẽ tốn bộ nhớ, thông thường từ 5-30 là phù hợp
Khai báo bằng 0 sẽ báo lỗi vì recordset tối thiểu luôn luôn đáp ứng 1 record (recordset. AbsolutePosition)
Ta viết thông thường ở Form_Load:

Code: Select all

  1. Recordset.CacheSize = 5


i- Recordset.Close
Đóng recordset. Thao tác nầy bắt buộc khi muốn dùng Recordset.Open một câu truy vấn mới

Code: Select all

  1. Rec.Close
  2. Rec.Open "select * into table3 from table1 where [ngay sinh] < #1/1/1986#"


j- Recordset. CursorLocation
vị trí con trỏ thuộc Server quy định (default) hay User quy định. Để sử dụng con trỏ, ta phải khai với hằng adUseClient. Thường khai báo tại form_load. Nếu không khai báo (tức là dùng default), hoặc dùng nhầm hằng adUseServer thì khi sử dụng DataGrid sẽ báo lỗi: Runtime error 7004: ‘The rowset is not bookmarkable’
Code tại Form Load như sau:

Code: Select all

  1. Rec.CursorLocation = adUseClient

Phải khai báo trước khi Rec.Open
Nếu khai báo Con.CursorLocation = adUseClient thì cũng tương đương, nghĩa là chỉ cần Rec (Recordset) hay Con (connection) .CursorLocation = adUseClient là đủ

(còn tiếp)
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

User avatar
truongphu
VIP
VIP
Posts: 4766
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 520 times

Re: Đề cương Sổ Tay VB 6 và CSDL

Postby truongphu » Thu 20/08/2009 11:00 am

k- Recordset.CursorType

hằng thuộc tính con trỏ tác động lên tập tin. Mời xem bài:
Ý nghĩa các thuộc tính
viewtopic.php?f=7&t=3942&p=50854&hilit=Rec.CursorType#p50854

l- Recordset.Delete
xóa record tại vị trí con trỏ

m- Recordset.EOF
vị trí recordset cuối mẫu tin (không có record), đây là vị trí chết sẽ gây lỗi, tương tự Recordset.BOF là vị trí recordset đầu mẫu tin (không có record), khi viết code, ta phải bẫy lỗi nầy

Code: Select all

  1. If Not Rec.EOF Then Rec.MoveNext

Câu trên có nghĩa là: Nếu Recordset chưa ở vị trí cuối mẫu tin thì di chuyển kế tới 1 record
Như vậy Rec.EOF = true thì ta chỉ MoveFirst, MoveLast và MovePrevious

n- Recordset. Fields
xem cách sử dụng ở Recordset.AddNew

o- Recordset.Filter
Đây là property khá hay, thông thường chúng ta hay sử dụng lệnh Recordset.Open để thi hành một câu truy vấn, ví dụ:

Code: Select all

  1. Private Sub Form_Load()
  2. ‘…
  3. Recordset.Open “Select * From Table1”
  4. ‘…
  5. End Sub
  6.  
  7. Private Sub Command10_Click()
  8. Rec.Close
  9. Rec.Open "Select* from table1 Where [ho ten] like 'n%'"
  10. DataGrid1.ReBind
  11. MsgBox Rec.RecordCount
  12. End Sub


Bạn chú ý: vì Rec.Close rồi Rec.Open nên ta phải gọi lệnh DataGrid1.ReBind, nếu không, DataGrid1 là bảng trắng
(DataGrid1.ReBind là lệnh thay thế câu Set DataGrid1.DataSource = Rec sau khi đã khai báo Set DataGrid1.DataSource = Rec ở phần Form_Load)

Bây giờ ta sử dụng property Recordset.Filter

Cú pháp: Recordset.Filter = “<tên field> <cấu trúc so sánh> <chuỗi so sánh>”
• cấu trúc so sánh: <, >, <=, >=, <>, =, LIKE

ta có code như sau

Code: Select all

  1. Private Sub Command10_Click()
  2. Rec.Filter = "[ho ten] like 'n%'"
  3. MsgBox Rec.RecordCount
  4. End Sub


Thế thôi: Rec không Close, hoạt động ngay, và do đó khỏi viết DataGrid1.ReBind

Bạn dùng thử xem, quá tiện phải không?
(Còn tiếp)
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

User avatar
truongphu
VIP
VIP
Posts: 4766
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 520 times

Re: Đề cương Sổ Tay VB 6 và CSDL

Postby truongphu » Fri 21/08/2009 8:39 am

Để minh họa bài viết trên, tôi gởi đến các bạn một project đơn giản dùng 2 property FilterFind

Với 2 lệnh nầy, các bạn sẽ thấy việc truy vấn giờ đây quá đơn giản!

Code: Select all

  1. Dim Con As New ADODB.Connection
  2. Dim Rec As New ADODB.Recordset
  3.  
  4. Private Sub Command1_Click()
  5. Rec.Filter = "hoten like '" & Text1.Text & "%'"
  6. End Sub
  7.  
  8. Private Sub Command2_Click()
  9. Rec.MoveFirst
  10. Rec.Find "hoten like '" & Text1.Text & "%'"
  11. End Sub
  12.  
  13. Private Sub Command3_Click()
  14. If Not Rec.EOF Then Rec.MoveNext
  15. Rec.Find "hoten like '" & Text1.Text & "%'"
  16. If Rec.EOF Then Label1.Caption = "Tìm Xong"
  17. End Sub
  18.  
  19. Private Sub Command4_Click()
  20. Rec.Filter = "hoten like '% %'"
  21. End Sub
  22.  
  23. Private Sub Form_Load()
  24. Con.CursorLocation = adUseClient
  25. Con.Open "provider=microsoft.jet.oledb.4.0;data source=" & App.Path & "\db1.mdb"
  26. Rec.Open "select * from table1", Con, adOpenDynamic, adLockOptimistic
  27. Set DataGrid1.DataSource = Rec
  28. Set Label1.DataSource = Rec
  29. Label1.DataField = "hoten"
  30. End Sub
  31.  
Attachments
Find Filter.rar
(8.54 KiB) Downloaded 659 times
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

User avatar
truongphu
VIP
VIP
Posts: 4766
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 520 times

Re: Đề cương Sổ Tay VB 6 và CSDL

Postby truongphu » Sun 23/08/2009 10:08 am

p- Recordset.Find
Hàm tìm kiếm như ví dụ ở bài trên
Cấu trúc hàm thu gọn dùng phổ biến:
Recordset.Find “<tên field> <so sánh> <chuỗi so sánh>
Hàm không có giá trị trả về, chỉ nhận biết qua con trỏ di chuyển; trong trường hợp Recordset.EOF nghĩa là không tìm thấy
Ghi chú: hàm Find không phân biệt chữ hoa hay thường (Sensitive UpperCase)
• Đa số hàm find dò tìm một giá trị
Tham khảo:
viewtopic.php?f=7&t=3942&start=20#p24439
• Có thể tìm nhiều giá trị
Tham khảo: 36- Dùng lệnh Find với nhiều điều kiện
viewtopic.php?f=7&t=3942&start=40#p25189

q- Recordset.GetRows
38- Hiển thị nhanh 5 dòng đầu của table ngay khi kết nối
viewtopic.php?f=7&t=3942&start=40#p25259

r- Recordset.LockType
Hằng khóa mẫu tin, tham khảo:
Ý nghĩa các thuộc tính
viewtopic.php?f=7&t=3942&p=50854&hilit=+adLockOptimistic#p50854
s- Recordset.Move
Lệnh di chuyển con trỏ từ record nầy sang record khác
• Recordset.Move <count>
Recordset từ vị trí đang đứng move (tới, lui) bao nhiêu record

Code: Select all

  1. Recordset.Move 0
  2. Recordset.Move -5
  3. Recordset.Move 6

Recordset.MoveFirst
Chuyển về record đầu tiên, dùng lệnh nầy bất cứ lúc nào, chỉ cần Recordset.Recordcount > 0
Recordset.MoveLast
Chuyển về record cuối cùng, dùng lệnh nầy bất cứ lúc nào, chỉ cần Recordset.Recordcount > 0
Recordset.MoveNext
Chuyển tới 1 record. Nếu Recordset.EOF sẽ báo lỗi, do đó:

Code: Select all

  1. If Not Recordset.EOF then Recordset.MoveNext

Recordset.MovePrevious
Chuyển lùi 1 record. Nếu Recordset.BOF sẽ báo lỗi, do đó:

Code: Select all

  1. If Not Recordset.BOF then Recordset.MovePrevious


tham khảo:
28- Truy xuất bản ghi thứ 20 trong database
viewtopic.php?f=7&t=3942&start=20#p24773

viewtopic.php?f=7&t=3942&p=51629&hilit=+Move#p51629
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

User avatar
truongphu
VIP
VIP
Posts: 4766
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 520 times

Re: Đề cương Sổ Tay VB 6 và CSDL

Postby truongphu » Sat 29/08/2009 9:57 am

t- Recordset.Open
Lệnh mở Recordset quen thuộc, chỉ lưu ý rằng khi Recordset đã có dữ liệu, muốn thực hiện câu truy vấn khác, ta phải Recordset.Close trước khi Recordset.Open
u- Recordset.PageCount: số trang của Recordset
Thông thường một trang của recordset chứa 10 Record, bắt đầu từ record first
Số trang là: (Recordset.recordCount \ 10) + 1
Code như sau:

Code: Select all

  1. MsgBox Rec. PageCount

u'- Recordset.PageSize: mặc định là 10
Code như sau:

Code: Select all

  1. MsgBox Rec.PageSize

v- Recordset. Properties: Một tập hợp (lớn) các thuộc tính nội tại của Recordset mà bản thân tôi đọc thấy rối trí vì mình chưa bao giờ khai thác các thuộc tính nầy. Mời các bạn chạy thử code sau:

Code: Select all

  1. For i = 0 To Rec.Properties.Count - 1
  2. List1.AddItem Rec.Properties.Item(i).Attributes & " / " & Rec.Properties.Item(i).Name & " / " & Rec.Properties.Item(i).Type & " / " & Rec.Properties.Item(i).Value
  3. Next


w- Recordset.RecordCount: số Record mà Recordset đang có

Code: Select all

  1. MsgBox Rec.RecordCount

x- Recordset.Requery: thực hiện truy vấn lại

Code: Select all

  1. Rec.Requery

y- Recordset.Resync: Refresh Recordset

Code: Select all

  1. Rec.Resync adAffectAllChapters, adResyncAllValues

z- Recordset.Save: Lưu dữ liệu ra trong 2 định dạng: ADGT hoặc XML

Code: Select all

  1. Rec.Save App.Path & "\Luu.xml", adPersistXML

aa- Recordset.Seek: Tôi test thấy không hổ trợ. Đây cũng là lệnh tìm

Code: Select all

  1. If Rec.Supports(adSeek) Then  
  2.     Rec.Index = "[ho ten]"
  3.     Rec.Seek "Phan", adSeekLastEQ
  4. Else
  5.     MsgBox "không hô tro'"
  6. End If

ab- Recordset.Sort: lệnh sắp xếp độc lập ngoài câu truy vấn

Code: Select all

  1. Rec.Sort = "[ho ten]"


Còn một số ít các hoạt động của Recordset. Tôi tạm kết thúc phần 4- Các khai báo Recordset và hoạt động nơi đây để chuyển qua III- Truy vấn SQL cho Recordset

(còn tiếp)
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

User avatar
truongphu
VIP
VIP
Posts: 4766
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 520 times

Re: Đề cương Sổ Tay VB 6 và CSDL

Postby truongphu » Mon 18/01/2010 10:04 am

Để bổ sung phần:
III- Truy vấn SQL cho Recordset

tôi tạm gởi ứng dụng: Test SQL, phiên bản mới nhất 2.0

* khi chạy ứng dụng: Menu có cung cấp tất cả các mẫu câu truy vấn
* Nếu muốn Test, bạn chỉ việc để file mdb bên cạnh là xong

So với phiên bản 1.0, phiên bản nầy khác nhiều:
- Định dạng DataGrid
- Connect được nhiều file chọn lựa
- bổ sung phần mật khẩu file. Riêng phần access phân quyền tạm thời không tính đến
- các mẫu câu truy vấn
- Fix các lỗi...
Attachments
Test SQL.rar
(19.1 KiB) Downloaded 813 times


Last bumped by truongphu on Mon 18/01/2010 10:04 am.
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh


Return to “[VB] Mẹo vặt khác”

Who is online

Users browsing this forum: No registered users and 0 guests