Lp trình vi ADO (ph n I)

Một phần của tài liệu Tự học Visual Basic phần 3 (Trang 58 - 72)

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. (adsbygoogle = window.adsbygoogle || []).push({});

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. (adsbygoogle = window.adsbygoogle || []).push({});

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: (adsbygoogle = window.adsbygoogle || []).push({});

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"

Một phần của tài liệu Tự học Visual Basic phần 3 (Trang 58 - 72)