Chương Một Hoan nghênh đến với vb6



tải về 1.11 Mb.
trang16/16
Chuyển đổi dữ liệu17.08.2016
Kích1.11 Mb.
1   ...   8   9   10   11   12   13   14   15   16

Chương Mười Sáu - Lập trình với ADO (phần I)

Control Data ADO


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 diện Components như dưới đây:



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 3.51 OLE DB Provider, rồi click nút Next >> hay Tab Connection.



Ở 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 Connection phía dưới để thử xem connection có được thiết lập tốt không.



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ỗ trong lúc bạn dùng nó, nếu có ai sửa đổi record nào bạn sẽ 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, ISBNPublisher ID. Kế đó cho thêm 4 textboxes tương ứng và đặt tên chúng là txtTitle, txtYearPublished, txtISBNtxtPublisherID.

Để 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:



Bạn có thể tải về chương trình dùng Control Data ADO nầy từ đây ADODatacontrol.zip.


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...

Khi trang Data Form Wizard - Introduction hiện ra, click Next



Trong trang kế đó chọn Access làm Database Type.



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 LayoutClass cho Binding Type. Đoạn click Next. Nếu ta chọn ADO Data Control thì kết quả sẽ giống giống như khi ta dùng Control Data DAO như trong một bài trước.



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 DataMemberPrimary 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)

End Sub


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"

End Sub

Các mẹo vặt trong VB

Gõ vào đầu đề phía bên trái để nhìn thấy các phần chọn. Muốn khép các phần chọn hãy gõ đầu đề thêm một lần hoặc gõ vào đầu đề khác.

VB Tips & Tricks




Forms
Hiện form khác
Form hiện một cùng chỗ
Event dùng update form
Cấm load form bằng ô X
Làm sao biết form đã load
Form giống form có sẵn
Controls
Làm biến mất control
Chọn controls thành nhóm
Xếp thứ tự TextBox
Cursor trong TextBox
Ðưa data vào List/ComBox
Chọn nhiều hàng trong ListBox
Sort hàng trong ListBox
Sắp ngay cột trong ListBox
Chuyển hàng giữa ListBox
Tìm control của Drag Source
In hàng chọn trong ListBox
Buộc gõ ComboBox chọn hàng
Controls hiện trên Tab Control
Ngày Giờ
Các dạng Ngày và Giờ
Hai cách dùng Timer
Ðợi một chút
Files
Ðọc từ Text file
Cho text vào text file
Linh Tinh
Ðổi Enter key ra Tab key
Mouse pointer ra đồng hồ cát
Tìm Help cho Functions


Làm hiện ra một Form khác


Giả tỉ bạn đang ở trong Form1 và muốn làm cho Form2 hiện ra, dùng:

Form2.Show

Khi muốn dấu Form2, dùng:

Form2.Hide

Khi một Form được 'Show' lần đầu tiên, nó đự ợc 'Load' (cho thành hình) và 'Show' ngay sau đó. Khi một Form đã có rồi, tức là đã được 'Load' rồi, lúc bạn 'Hide' nó cűng giống như kéo một tấm màn che nó lại. Kế đó, khi bạn 'Show' nó cűng giống như mở màn ra, không có gì ảnh hưởng Form.

Bạn có thể cho Form biến mất bằng cách 'Unload' nó, như:

Unload Form2

Lần tới khi bạn 'Show' nó, Form sẽ được 'Load' trở lại. Mỗi khi Form được 'Load', nó 'execute' sub Form_Load. Form_Load là nơi bạn viết các 'statements' để 'initialise' Form, tức là những gì cần phải được sắp xếp cho sẵn sàng trước khi Form thành hình.

Do đó bạn phải quyết định khi nào dùng Unload hay Hide đê? Làm cho Form biến mất. Nhớ rằng mỗi khi Form được 'Load' thì nó 'initialise' và mất một ít thì giờ.

Nếu bạn muốn làm cho một Form hiện ra và khiến nó dành nhận tất cả 'keystrokes' và 'mouse clicks' thì dùng:

Form2.Show vbModal

Ngay sau khi Form2 được 'Show' dưới dạng vbModal, nó dành ngay CPU process, đến đổi statement nằm ngay dưới đó trong Form1 cűng đợi cho đến khi Form2 biến mất bằng Unload hay Hide mới chạy tiếp được.

Nếu bạn muốn Form2 hiện ra trong Modeless (không phải Modal) nhưng luôn luôn nằm trên Form1, ngay cả khi Form1 trở thành active, dùng:

Form2.Show ,Me ' Me là Form1






Làm cho Form luôn luôn hiện ra một chỗ và cùng một cở


Trong Sub Form_Load, dùng

Move fLeft, fTop, fWidth, fHeight

Ðể nhớ thứ tự các parameters trong Sub Move hãy nhớ tọa độ có X,Y . trong Sub Move ta nói đến vị trí X,Y ( fLeft, fTop) rồi cở X,Y (fWidth, fHeight).

Move là một method có thể được dùng cho Form hay Control và rất hiệu quả.

Nếu muốn Frame1 luôn luôn nằm ở đỉnh trái, dùng:

Frame1.move 0,0

Nếu muốn chỗ và cở của Form 'configurable' (user có thể thay đổi) thì chứa các dừ kiện đó trong Registry rồi đọc fLeft, fTop, fWidth, fHeight từ Registry trong Sub Form_Load. ( xem Function GetSetting )

Ðể cho Form2 hiện ra bên phải và ngang hàng với Form1, trom Sub Form_Load của Form2 dùng:

Sub Form_Load()

Move Form1.Width, Form1.Top

End Sub




Dùng Event nào để update Form?


Mỗi khi trở lại một Form sau khi làm việc ở một Form khác, ta muốn 'update' một số dữ kiện đang được 'display' để phản ảnh nhừng thay đổi vừa mới xãy ra.

Ðể code trong Sub Form_Activate.






Làm sao ta biết một Form đã được Loaded?


Dùng Function sau đây của Microsoft:

Function FormIsLoaded(MyFormName As String) As Boolean

' Determines if a form is loaded.

Dim i As Integer

FormIsLoaded = False
For i = 0 To Forms.Count - 1
If Forms(i).FormName = MyFormName Then
FormIsLoaded = True
Exit Function ' Quit function once form has been found.
End If
Next i

End Function

Ði qua hết collection của Forms để xem có Form nào trùng tên.

Cách dùng:

If FormIsLoaded("Form2") then

MsgBox "Form2 is already loaded"

End If




Không cho User Unload Form bằng cách click dấu X


Nhiều khi bạn muốn thu xếp mọi chuyện đàng hoàng trước khi Unload một Form nên bạn làm một Exit hay Close button cho user dùng. Ðể làm mất dấu X phía đỉnh phải, 'set' Property ControlBox của Form ra False. Nếu làm thế nầy có điểm bất lợi là khi 'minimize' Form, ta không thấy icon của Form. Có một cách vẫn để nguyên dấu X, nhưng khi user click nó thì ta check 'unloadMode' trong Sub Form_QueryUnload để biết lý do tại sao Form phải unload. Trong Sub Form_Unload có thể 'assign' Cancel ra True để 'abort' Unload.

Nếu bạn muốn không cho user minimise Form thì set Property MinButton ra False.






Làm một Form giống một Form có sẵn


Nhiều khi bạn muốn làm một Form giống giống một Form đã có sẵn trong Project. Thí dụ bạn muốn 'duplicate' Form2 để làm nên một Form3 để sau đó sữa chữa nó chút đỉnh. Bạn làm như sau:

1. Mở Form2 ra


2. Dùng Properties để đổi tên Form2 ra Form3
3. Dùng File | Save As menu command để chứa Form nầy dưới tên Form3.frm

Bây giờ bạn có thêm Form3 trong Project, trong khi Form2.frm vẫn còn đó nhưng không còn thuộc về Project nữa. Nếu bạn muốn cho nó vào Project trở lại thì dùng Project | Ad File .. menu command để chọn Form2.frm bỏ vào Project.









Trang
1   ...   8   9   10   11   12   13   14   15   16


Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2016
được sử dụng cho việc quản lý

    Quê hương