Visual Basic 6 cho ta s l a ch n v k thu t khi l p trình v i database, ho c là
dùng DAO nh trong hai bài tr c, ho c là dùng ADO (ActiveX Data
Objects).
S khác bi t chính gi a ADO và DAO là ADO cho phép ta làm vi c v i m i lo i ngu n d ki n (data sources), không nh t thi t ph i là Access database hay ODBC. Ngu n d ki n có th là danh sách các đa ch Email, hay m t file text string, trong đó m i hàng là m t record g m nh ng fields ng n cách b i các d u ph y (comma separated values).
N u trong DAO ta dùng th ng tên c a MSAccess Database thì trong ADO cho ta
n i v i (connect) m t database qua m t Connection b ng cách ch đnh m t
Connection String. Trong Connection String có Database Provider (thí d
nh Jet, ISAM, Oracle, SQLServer..v.v.), tên Database, UserName/Password
đ logon m t database .v.v.. Sau đó ta có th l y v (extract) nh ng
recordsets, và c p nh t hóa các records b ng cách dùng nh ng l nh SQL trên
các tables hay dùng nh ng stored procedures bên trong database.
Bình th ng, khi ta m i kh i đ ng m t project VB6 m i, Control Data ADO
không có s n trong IDE. Mu n có nó, b n hãy dùng Menu Command Project |
Components..., r i ch n Microsoft ADO Data Control 6.0 (OLEDB) t giao
B n hãy b t đ u m t d án VB6 m i, cho nó tên ADODataControl b ng cách click tên project trong Project Explorer bên ph i r i edit property Name trong Properties Window. S a tên c a form chính thành frmADO, và đánh câu ADO
DataControl Demo vào Caption c a nó.
DoubleClick lên Icon c a Control Data ADO trong Toolbox. M t Control Data ADO tên Adodc1 s hi n ra trên Form. Mu n cho nó n m bên d i Form, gi ng nh m t StatusBar, hãy set property Align c a nó trong Properties Window thành
2 - vbAlignBottom.
Click bên ph i hàng property (Custom), k đó click lên nút browse có ba ch m
đ giao tho i Property Pages hi n ra. Trong giao tho i này, trên Tab General ch n Radio (Option) Button Use Connection String r i click nút Build....
Trong giao tho i Data Link Properties, Tab Provider, ch n Microsoft Jet
ch Select or enter a database name ta ch n E:\Program Files\Microsoft Visual Studio\VB98\BIBLIO.MDB, trong computer c a b n
có th file y n m trên disk C hay D. Sau đó, b n có th click nút Test
L p connection xong r i, ta ch đnh mu n l y gì v làm Recordset b ng cách click property Recordsource c a Adodc1. Trong giao di n Property Pages c a
nó ch n 2-adCmdTable làm Command Type, k đó m Combo box cho
Table or Stored Procedure Name đ ch n table Titles.
Tùy theo cách ta dùng Recordset trong ADO, nó có ba lo i và đ c g i là
Cursor Type. Cursor ch ng qua là m t tên khác c a Recordset:
• Static Cursor: Static Cursor cho b n m t static copy (b n
sao c ng ng c) c a các records. Trong lúc b n dùng Static Cursor, n u có ai khác s a đ i hay thêm, b t gì vào
recordset b n s không th y.
• Keyset Cursor: Keysey Cursor h n Static Cursor ch
bi t. N u ai delete record nào, b n s không th y nó n a. Tuy nhiên b n s không bi t n u có ai thêm m t record nào vào recordset.
• Dynamic Cursor: Nh ch s ng đ ng (dynamic) hàm ý,
trong lúc b n đang dùng m t Dynamic Cursor, n u có ai khác s a đ i hay thêm, b t gì vào recordset b n s th y h t.
B n hãy ch n tr s 2-adOpenDynamic cho property Cursor Type c a Adodc1:
Bây gi b n hãy đ t lên Form 4 labels v i captions: Title, Year Published,
ISBN và Publisher ID. K đó cho thêm 4 textboxes t ng ng và đ t tên chúng là txtTitle, txtYearPublished, txtISBN và txtPublisherID.
th c hi n Data Binding, b n hãy ch n textbox txtYearPublished (n m xu t b n), r i set property Datasource c a nó trong Properties Window thành
Adodc1. Khi click lên property DataField c a txtYearPublished và m
ComboBox ra b n s th y li t kê tên các Fields trong table Titles. ó là vì Adodc1
đ c coi nh trung gian l y table Titles t database. đây ta s ch n c t Year Published.
L p l i công tác này cho 3 textboxes kia, và ch n các c t Title (Tiêu đ ), ISBN (s lý l ch trong th vi n qu c t ), và PubID (s lý l ch nhà xu t b n) làm DataField cho chúng.
n đây, m c d u ch a vi t m t hàng code nào, b n có th ch y ch ng trình và nó s hi n th nh d i đây:
Data Form Wizard
giúp l p trình viên thi t k các data forms nhanh h n, VB6 cho ta Data Form
Wizard đ generate (phát sinh) ra m t form có h tr Edit, Add và Delete records.
Bây gi b n hãy kh i đ ng m t standard project VB6 m i, tên ADOClass và copy MS Access file BIBLIO.MDB, t c là database, vào trong cùng folder c a d án m i này.
Mu n dùng Data Form Wizard, tr c h t ta ph i thêm nó vào môi tr ng phát tri n (IDE) c a VB6. B n hãy dùng IDE Menu Command Add-Ins | Add-In
Manager.... Ch n VB6 Data Form Wizard trong giao tho i, r i click Checkbox Loaded/Unloaded đ ch Loaded hi n bên ph i hàng "VB6 Data Form Wizard" nh trong hình d i đây:
N u b n mu n m i l n kh i đ ng VB6 IDE là có s n Data Form Wizard trong menu Add-Ins thì ngoài option Loaded, b n click thêm check box Load on
Startup.
M t Add-In là m t menu Item m i mà ta có th thêm vào m t ch ng trình ng d ng có s n. Th ng th ng, ng i ta dùng Add-Ins đ thêm ch c n ng cho m t ch ng trình, làm nh là ch ng trình đã có s n ch c n ng y t đ u. B n hãy kh i đ ng Data Form Wizard t IDE Menu Command m i Add-Ins | Data Form Wizard...
Trong trang Database, click Browse đ ch n m t MS Access database file.
đây ta ch n file BIBLIO.MDB t chính folder c a ch ng trình này. o n click
Next.
Trong trang Form, ta ch n Single Record cho Form Layout và Class cho Binding Type. o n click Next. N u ta ch n ADO Data Control thì k t qu s
Trong trang Record Source ta ch n table Titles. Listbox c a Available Fields
s hi n th các fields c a table Titles. Sau khi ch n m t field b ng cách click lên tên field y trong Listbox, n u b n click hình tam giác ch qua ph i thì tên field
y s đ c d i qua n m d i cùng trong Listbox Selected Fields bên ph i. N u b n click hình hai tam giác ch qua bên ph i thì t t c m i fields còn l i bên trái s đ c d i qua bên ph i. B n c ng có th s p đ t v trí c a các selected fields b ng cách click lên tên field y r i click hình m i tên ch lên hay xu ng đ
di chuy n field y lên hay xu ng trong danh sách các fields.
Ngoài ra, b n hãy ch n Title làm Column to Sort By trong cái Combobox c a nó đ các records trong Recordset đ c s p x p theo th t ABC (alphabetical order) c a field Tiêu đ (Title).
Trong trang Control Selection, ta s đ y nguyên đ có đ m i buttons. B n hãy click Next.
Khi Data Form Wizard ch m d t, nó s generate form frmADODataForm. B n hãy remove Form1 và dùng Menu Command Project | ADODataControl
Properties... đ đ i Startup Object thành frmADODataForm. Th là t m xong ch ng trình đ Edit các records c a table Titles.
Chúng ta hãy quan sát cái Form và ph n code đ c Data Form Wizard generated. Trong frmADODataForm, các textboxes làm thành m t array tên txtFields. M i textbox đ u có property DataField đnh s n tên field c a table Titles. Thí d nh txtFields(2) có DataField là ISBN. Form chính không dùng
Control Data ADO nh ng dùng m t Object c a class clsTitles.
Ph n Initialisation c a class clsTitles là Open m t Connection và l y v m t Dataset có tên DataMember là Primary nh sau:
Private Sub Class_Initialize() Dim db As Connection
Set db = New Connection
db.CursorLocation = adUseClient ' Open connection
db.Open "PROVIDER=Microsoft.Jet.OLEDB.3.51;Data
Source=E:\Websites\Vovisoft\VisualBasic\ADOForm\BIBLIO.MDB;" ' Instantiate ADO recordset
Set adoPrimaryRS = New Recordset ' Retrieve data for Recordset
adoPrimaryRS.Open "select Title,[Year
Published],ISBN,Description,Notes,PubID from Titles Order by Title", _ db, adOpenStatic, adLockOptimistic
' Define the only data member, named Primary DataMembers.Add "Primary"
End Sub
V v trí c a database, n u b n không mu n nó ch t c ng m t folder nào thì dùng App.Path đ xác đnh m i liên h gi a v trí c a database và folder c a chính ch ng trình đang ch y, thí d nh :
db.Open "PROVIDER=Microsoft.Jet.OLEDB.3.51;Data Source=" & App.Path & "\BIBLIO.MDB;"
Trong Sub Form_Load, ta có th dùng For Each đ đi qua h t các textboxes trong array txtFields. Vì property Datasource c a textbox là m t Object nên ta dùng keyword Set đ point nó đ n Object PrimaryCLS. ng th i ta c ng ph i ch đnh tên c a DataMember c a m i textbox là Primary:
Private Sub Form_Load()
' Instantiate an Object of class clsTitles Set PrimaryCLS = New clsTitles
Dim oText As TextBox
' Iterate through each textbox in the array txtFields 'Bind the text boxes to the data source, i.e. PrimaryCLS For Each oText In Me.txtFields
oText.DataMember = "Primary"
' Use Set because property Datasource is an Object Set oText.DataSource = PrimaryCLS
Next
End Sub
Khi s di chuy n t record này đ n record khác ch m d t, chính Recordset có raise Event MoveComplete. Event y đ c handled (gi i quy t) trong class clsTitles b ng cách l i raise Event MoveComplete đ nó đ c handled trong Form.
Mu n handle Event trong clsTitles ta ph i declare recordset adoPrimaryRS v i WithEvents:
Dim WithEvents adoPrimaryRS As Recordset
Private Sub adoPrimaryRS_MoveComplete(ByVal adReason As
ADODB.EventReasonEnum, _
ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum,
ByVal pRecordset As ADODB.Recordset) ' Raise event to be handled by main form RaiseEvent MoveComplete
End Sub
Và trong Form ta c ng ph i declare (object clsTitles) PrimaryCLS v i WithEvents:
Private WithEvents PrimaryCLS As clsTitles
Trong Form, Event MoveComplete s làm hi n th v trí tuy t đ i (Absolute Position) c a record b ng code d i đây:
Private Sub PrimaryCLS_MoveComplete()
'This will display the current record position for this recordset lblStatus.Caption = "Record: " & CStr(PrimaryCLS.AbsolutePosition)
Khi user clicks Refresh, các textboxes s đ c hi n th l i v i chi ti t m i nh t c a record t trong recordset, nh khi có ai khác đã s a đ i record. Method
Requery c a clsTitles l i g i method Requery c a Recordset nh sau:
Private Sub cmdRefresh_Click()
'This is only needed for multi user applications On Error GoTo RefreshErr
' fetch the latest copy of Recordset PrimaryCLS.Requery
Exit Sub RefreshErr:
MsgBox Err.Description
End Sub
'In Class clsTitles
Public Sub Requery()
' Fetch latest copy of record adoPrimaryRS.Requery
DataMemberChanged "Primary"