Giáo trình Visual Basic (Phần 2) - Lâm Hoài Bảo

pdf 99 trang cucquyet12 2370
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Visual Basic (Phần 2) - Lâm Hoài Bảo", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfgiao_trinh_visual_basic_phan_2_lam_hoai_bao.pdf

Nội dung text: Giáo trình Visual Basic (Phần 2) - Lâm Hoài Bảo

  1. Visual Basic CHƯƠNG 6: LẬP TRÌNH XỬ LÝ GIAO DIỆN & ĐỒ HỌA Mục tiêu: Chương này giới thiệu về cách tạo menu cũng như một số hàm xử lý đồ họa, những thành phần quan trọng trong các ứng dụng chạy trên Windows. Học xong chương này, sinh viên phải nắm bắt được các vấn đề sau: - Sử dụng menu trong thiết kế giao diện. - Sử dụng các hộp thoại trong thiết kế ứng dụng. - Sử dụng các phương thức đồ họa cùng với cách xử lý một số sự kiện để tạo các ứng dụng đồ họa. Kiến thức có liên quan: - Các cấu trúc lập trình trong VB. - Cách thức xử lý sự kiện. Tài liệu tham khảo: - Microsoft Visual Basic 6.0 và Lập trình Cơ sở dữ liệu - Chương 7, trang 99 - Nguyễn Thị Ngọc Mai (chủ biên), Nhà xuất bản Giáo dục - 2000. Trang 60
  2. Visual Basic I. Menu I.1. Khái niệm Menu là một loại điều khiển trong đó người sử dụng có thể lựa chọn các mục từ một danh sách cho trước. Có 2 loại menu: - Menu thả xuống (Drop-Down Menu): là dạng menu thông dụng nhất. - Menu bật ra (Pop-Up Menu): thường hiển thị khi ta ấn nút phải chuột. I.2. Các thuộc tính của Menu Các thuộc tính của Menu không chứa trong cửa sổ Properties mà chứa trong Menu Editor. - Caption: Là chuỗi hiển thị trên menu. - Name: Phải duy nhất và dễ nhớ. Đây là tên để nhận biết thành phần nào của Menu được chọn. - Shortcut: dùng để thiết lập các phím tắt (Shortcut key). - WindowList: Dùng trong các ứng dụng MDI (Multipe Document Interface). Đây là ứng dụng có một biểu mẫu chính và nhiều biểu mẫu con. Thuộc tính này ra lệnh cho VB hiển thị tiêu đề của các biểu mẫu con trên menu. - Checked: Nếu chọn thuộc tính này thì sẽ có một dấu hiển thị bên cạnh trái, nhưng thuộc tính này không được áp dụng cho những mục menu có chứa menu con. - Enabled: Nếu thuộc tính này không được chọn thì mục này sẽ bị xám đi và người dùng không thể chọn. - Visible: Nếu thuộc tính này không được chọn thì mục này sẽ không được hiển thị. - NegotiatePosition: quản lý vị trí gắn menu trong trường hợp sử dụng các đối tượng ActiveX. I.3. Các sự kiện - Click: Xảy ra khi người sử dụng chương trình nhấp chuột vào một mục nào đó của Menu. I.4. Cách tạo Menu Menu cũng là một loại điều khiển, nhưng Windows sẽ kiểm soát việc vẽ menu. Lập trình viên chỉ quản lý việc điều hành các sự kiện mà thôi. Trang 61
  3. Visual Basic Hình VI.1 Trình soạnthảoMenu Menu không chứa trong hộp công cụ mà được thiết kế từ trình soạn thảo menu. Trong Visual Basic 6.0 IDE, chọn Tools, rồi Menu Editor để mở chương trình này. Ví dụ: Tạo một Drop-Down Menu. - Tạo một đề án mới. - Ấn Ctrl-E để mở Menu Editor - Ta sẽ tạo một Menu File với Menu con là Open và Save As. - Trước tiên ta nhập vào &File trong ô Caption và nhập một tên bất kỳ vào ô Name (chẳng hạn là mfile). Ký tự & trước chữ F cho biết chữ F sẽ là phím tắt (ấn Ctrl- F) coi như chọn menu File. - Tiếp theo ta nhập &Open và &Save As. Để Open và Save As là Sub menu của File, ta chọn Open rồi ấn mũi tên sang trái. Tương tự đối với Save As. Hình VI.2 Ví dụ tạo Popup Menu Trang 62
  4. Visual Basic Tách nhóm menu: Trong trường hợp Menu có nhiều mục, ta sẽ tách nhóm Menu để tiện theo dõi. Chẳng hạn ta thêm vào Menu File mục Exit và tách riêng ra với Open và Save As. Ta sẽ xen vào giữa hai mục Save As và Exit một mục mới có Caption là “-“. Ta có thể theo dõi qua hình VI.3. Hình VI.3 Ví dụ tách nhóm các Ví dụ: Tạo Pop-up menu - Sử dụng lại menu đã dùng ở ví dụ trước, nhưng ta sẽ tắt thuộc tính Visible của menu File. - Sau đó, mở cửa sổ Code của ứng dụng, dùng sự kiện MousUp, nhập vào đoạn lệnh sau: Private Sub Form_MouseUp (Button As Integer, Shift As _ Integer, X As Single, Y As Single) If Button = vbRightButton Then PopupMenu mfile, vbPopupMenuLeftAlign End If End Sub - Chạy thử ứng dụng, khi ta ấn chuột phải, một menu sẽ bật ra. - Lệnh PopupMenu cho biết tên menu cần bật ra, đó là tên mà ta đã đặt trong trình soạn thảo MenuEditor, ở đây là mfile. - Kế đến, đó là tham số xác định cách hiển thị menu: vbPopupMenuLeftAlign, vbPopupMenuRightAlign, vbPopupMenuCenterAlign. Sau khi đã thiết kế xong menu, ta sẽ viết các đoạn mã để VB sẽ thi hành một công việc nào đó tương ứng với mục được chọn. Công việc thi hành sẽ được viết bên trong sự kiện Click của mục đó. Trang 63
  5. Visual Basic II. Hộp thoại II.1. Khái niệm Hộp thoại (Dialog Box) là một trong những cách VB dùng để giao tiếp với người dùng. Có 4 loại hộp thoại: - Hộp thông điệp (Message Box). - Hộp nhập (Input Box). - Các hộp thoại thông dụng (Common Dialog) - Hộp thoại hiệu chỉnh (Custom Dialog). II.2. Hộp thông điệp Hộp thông điệp cũng có 2 loại: Loại chỉ xuất thông báo, loại có tương tác với người dùng. II.2.1 Loại chỉ xuất thông báo - Lúc này ta dùng MsgBox như là một thủ tục. - Cú pháp: MsgBox Prompt, Button, Title. Trong đó: Prompt: Chuỗi thông báo sẽ hiển thị. Button: Các nút nhấn sẽ được hiển thị trên hộp thông báo. Title: Chuỗi hiển thị trên thanh tiêu đề của hộp thông báo. - Ví dụ: Hình VI 4 Hộp thông điệp Chẳng hạn ta xây dựng một biểu mẫu dùng để hiển thị tên và điểm trung bình cuối năm của một học sinh khối lớp 12. Do đó giá trị điểm trung bình cũng như họ tên học sinh là không thể thay đổi. Do đó khi ngưòi dùng Click vào một ô Text nào đó, ta sẽ xuất thông báo rằng giá trị này không thể thay đổi. Trang 64
  6. Visual Basic Private Sub Text2_Click() MsgBox "Vous ne pouvez pas changer la value de ce champ!" End Sub Sau khi xuất thông báo, VB sẽ đợi ta ấn vào nút OK hoặc Enter. Sau đó VB sẽ thi hành dòng lệnh ngay sau dòng lệnh MsgBox. Đôi khi dòng thông báo quá dài, VB sẽ tự động cắt để đưa xuống dòng khác, tuy nhiên có khi sẽ không như mong muốn của lập trình viên. Ta có thể thực hiện công việc này như sau: MsgBox “This is a multi-line “ & chr$(10) & “ message” Tùy theo thông số truyền vào MsgBox mà có nhiều loại hộp thoại thông điệp khác nhau. Hằng số Giá trị Diễn giải vbOKOnly 0 Chỉ hiển thị nút OK . vbOKCancel 1 Hiển thị 2 nút OK và Cancel. vbAbortRetryIgnore 2 Hiển thị các nút Abort, Retry, và Ignore. vbYesNoCancel 3 Hiển thị các nút Yes, No, và Cancel. vbYesNo 4 Hiển thị 2 nút Yes và No. vbRetryCancel 5 Hiển thị 2 nút Retry và Cancel. Các loại biểu tượng trên hộp công cụ Hằng số Diễn giải Dùng cho những thông báo lỗi thất bại khi vbCritical thi hành công việc nào đó. Dùng cho những câu hỏi yêu cầu người vbQuestion dùng chọn lựa. vbExclamation Dùng cho các thông báo của chương trình. Dùng cho các thông báo cung cấp thêm vbInformation thông tin. II.2.2 Loại tương tác với người dùng Lúc này MsgBox được dùng như một hàm, khi một nút nào đó trên hộp thông báo được ấn, VB sẽ trả về giá trị của nút ấn đó. Cú pháp: MsgBox (Prompt, Button, Title) As Integer Hằng số Giá trị Nút vbOK 1 OK vbCancel 2 Cancel vbAbort 3 Abort vbRetry 4 Retry vbIgnore 5 Ignore vbYes 6 Yes Trang 65
  7. Visual Basic vbNo 7 No Với những thông điệp quan trọng, ta mong muốn người dùng phải chọn lựa một trong các đề xuất mà ta đưa ra trước khi chuyển qua ứng dụng khác, ta sẽ dùng thông số vbSystemModal. Trang 66
  8. Visual Basic II.3. Hộp nhập Đây là loại hộp thông điệp cho phép nhận thông tin từ phía người sử dụng. Tuy nhiên trong các ứng dụng, hộp nhập rất ít khi được dùng do: - Ta không có cách nào để kiểm tra thông tin do người dùng nhập vào khi mà Enter chưa được ấn. - Thông tin được nhập là rất ít. Sau đây là một ví dụ về hộp nhập: Public Sub Main () Dim ReturnString As String ReturnString = InputBox(“Nhap vao ten cua ban”) End Sub Giá trị trả về của hộp nhHìnhập làVI mộ5t chuHộỗpni. hậptên II.4. Các hộp thoại thông dụng Có 6 loại hộp thoại thông dụng: - Mở tập tin - Lưu tập tin - Chọn màu - Chọn Font - In ấn - Trợ giúp Tuy có 6 loại, nhưng khi thiết kế biểu mẫu, ta chỉ thấy một công cụ duy nhất đó là CommonDialog. Muốn đưa Common Dialog vào dự án, ta chọn: Project/Components /Controls/Microsoft Common Dialog Control 6.0. Sau đó, Common Dialog sẽ xuất hiện trong hộp công cụ ToolBox. II.4.1 Hộp thoại mở và lưu tập tin Hai hộp thoại này có chức năng và thể hiện như nhau. Cả hai hộp thoại đều hiển thị danh sách các tập tin, người dùng có thể duyệt qua các ổ đĩa để tìm các tập tin. Chúng chỉ khác nhau phần tiêu đề và nút nhấn. Các thuộc tính quan trọng: o Name: tên của Common Dialog. o Filter: đây là một chuỗi xác định phần mở rộng của tên các tập tin mà hộp thoại có thể mở hay lưu. Trang 67
  9. Visual Basic o FilterIndex: nếu có nhiều phần mở rộng của tên tập tin được mô tả trong thuộc tính Filter thì thuộc tính này xác định mặc định loại tập tin nào được chọn (là một số nguyên). o FileName: trả về tên tập tin sau khi người sử dụng hộp thoại chọn một tập tin nào đó. o CancelError: nếu TRUE thì trả về giá trị lỗi khi người dùng chọn nút Cancel, mặc nhiên giá trị này là False. Phương thức: o ShowOpen: mở ra hộp thoại mở tập tin. o ShowSave: mở ra hộp thoại lưu tập tin. Ví dụ: Private Sub Form_Load() On Error GoTo ErrHandler dlgFile.Filter = "All Files (*.*)|*.*|Text Files “ & _ “(*.txt)|*.txt|Batch Files (*.bat)|*.bat" dlgFile.FilterIndex = 2 dlgFile.ShowOpen Exit Sub ErrHandler: MsgBox Err.Description End Sub Ở ví dụ trên, ta thiết kế một hộp thoại mở tập tin, trong đó các tập tin được hiển thị theo 3 nhóm tập tin đó là: - All Files: (*.*) - Text Files: (*.txt) - Batch Files: (*.bat) Các nhóm tập tin được thể hiện trong thuộc tính Filter. Mỗi nhóm tập tin cách nhau bởi dấu phân cách |. Thuộc tính FilterIndex = 2 tức là khi hộp thoại Open được mở lên, thì loại tập tin hiển thị mặc định là Text Files. Sau khi đã chọn một tập tin và nhấn nút Open, ta sử dụng thuộc tính FileName để nhận về tên tập tin đã chọn. Khi ta chọn thuộc tính CancelError là TRUE, thì khi người dùng ấn nút Cancel trên hộp thoại, ta sẽ nhận được một lỗi và sẽ có cách xử lý lỗi này. Ta chọn phương thức ShowOpen để hiển thị hộp thoại mở tập tin. Trang 68
  10. Visual Basic Hình VI.6 Hộp thoạimở tậptin Các thuộc tính cũng tương tự đối với hộp thoại lưu tập tin, ta chỉ cần thay đổi tiêu đề của Dialog và dùng phương thức ShowSave. Dưới đây là minh họa cho hộp thoại lưu tập tin. Hình VI.7 Hộp thoại lưu tập tin Trang 69
  11. Visual Basic II.4.2 Hộp thoại chọn màu Đây là hộp thoại cho phép người dùng chọn và hiển thị các màu có sẵn trong bảng màu của Windows cũng như thiết lập thêm nhiều màu mới. Một thuộc tính quan trọng đối với hộp thoại chọn màu đó là thuộc tính Color, thuộc tính này trả về giá trị của màu đã được chọn. Ta sẽ dùng phương thức ShowColor để hiển thị hộp thoại chọn màu. Hình VI.8 Hộp thoại chọn màu Trong một số ứng dụng, ta sẽ dùng hộp thoại chọn màu để thay đổi giá trị màu của các điều khiển trong một số trường hợp nào đó. Ví dụ thay đổi màu nền của điều khiển TextBox trong ví dụ dưới đây: Trang 70
  12. Visual Basic Hình VI.9 Ví dụ sử dụng hộp thoại chọn mầu Ta sẽ thiết kế một nút nhấn nhỏ bên cạnh điều khiển TextBox, nút nhấn này cho phép người sử dụng chọn màu nền của TextBox. Ta có đoạn mã lệnh sau: Private Sub Command2_Click() On Error GoTo ErrHandler CommonDialog1.ShowColor Text1.BackColor = CommonDialog1.Color ErrHandler: CommonDialog1.ShowColor End Sub Trước khi chạy chương trình cần xác định thuộc tính CancelError = TRUE. II.4.3 Hộp thoại chọn Font chữ Cho phép người dùng chọn Font màn hình, máy in hay cả hai. Khi dùng hộp thoại chọn Font ta phải dùng thuộc tính Flags quy định loại Font nào sẽ được hiển thị. Hình VI.10 Hộp thoại Font Thuộc tính Giải thích Color Lưu giữ giá trị của màu được chọn FontBold TRUE nếu người dùng chọn chế độ đậm (Bold) và FALSE nếu Trang 71
  13. Visual Basic ngược lại. FontItalic TRUE nếu người dùng chọn chế độ nghiêng (Italic) và FALSE nếu ngược lại. FontStrikeThru TRUE nếu chọn chế độ gạch ngang các ký tự. FontUnderLine TRUE nếu chọn chế độ gạch dưới FontName Tùy ý Max Kích cỡ lớn nhất của Font được hiển thị Min Kích cỡ nhỏ nhất của font được hiển thị FontSize Kích cỡ của Font được chọn Các giá trị của thuộc tính Flags: Hằng Giá trị Hiệu quả cdlCFPrinterFonts &H2 Chỉ hiển thị font máy in cdlCFScreenFonts &H1 Chỉ hiển thị font màn hình cdlCFBoth &H3 Chỉ hiển thị font màn hình và font máy in cdlCFScalableOnly &H20000 Hiển thị font tỷ lệ như là fonts TrueType Nếu muốn chọn màu cho Font, ta thêm 256 vào giá trị của thuộc tính Flags. Nếu không có điều này, ta chỉ thấy tên Font, kiểu Font và kích cỡ Font mà thôi. Để mở hộp thoại chọn Font, ta sử dụng phương thức ShowFont. II.4.4 Hộp thoại in ấn Đây là hộp thoại cho phép xác lập các thông tin về máy in chẳng hạn như bao nhiêu dữ liệu được in, máy in sẽ hoạt động như thế nào Hộp thoại in ấn, nó trả về 3 thuộc tính thông dụng: Copies, FromPage và ToPage. Hình VI.11 Hộp thoại in ấn Thuộc tính Giải thích Copies Số bản in FromPage Số thứ tự của trang bắt đầu Max Số bản in tối đa cho phép Trang 72
  14. Visual Basic Min Số bản in tối thiểu cho phép PrinterDefault Nếu gán thành TRUE, mọi thay đổi mà người dùng thực hiện sẽ được ghi lại thành các thay đổi trên hệ thống và có ảnh hưởng đến các ứng dụng khác nếu có sử dụng máy in. ToPage Số thứ tự của trang in cuối cùng Để mở hộp thoại in ấn, ta sử dụng phương thức ShowPrinter. III. Xử lý các sự kiện chuột và bàn phím III.1 Sự kiện chuột Biểu mẫu hoặc điều khiển có thể nhận biết sự kiện chuột khi có con trỏ chuột đi ngang qua. Có 3 sự kiện chuột chủ yếu, đó là Sự kiện Giải thích MouseDown Xảy ra khi người sử dụng ấn chuột (chuột trái hoặc phải) MouseUp Xảy ra khi người sử dụng thả một nút chuột bất kỳ MouseMove Xảy ra khi con trỏ chuột di chuyển đến một điểm mới trên màn hình. Các tham số Tham số Giải thích Button Cho biết phím chuột nào được ấn Shift Cho biết SHIFT hay CTRL hay ALT được ấn X, Y Xác định vị trí của con trỏ chuột đối với hệ tọa độ của điều khiển Ví dụ 1: Sử dụng sự kiện MouseDown để vẽ các đoạn thẳng nối tiếp nhau mỗi khi ta dùng chuột chấm một điểm trên biểu mẫu. Ta có thể thực hiện điều đó với đoạn mã lệnh xử lý sự kiện Form_MouseDown như sau: Private Sub Form_MouseDown(Button As Integer, & _ Shift As Integer, X As Single, Y As Single) Line -(X, Y) End Sub Trang 73
  15. Visual Basic Ví dụ 2: Sử dụng sự kiện MouseUp để hiển thị một thông điệp cho biết nút chuột nào vừa được thả. Sự kiện Form_MouseUp được xử lý: Private Sub Form_MouseUp (Button As Integer, & _ Shift As Integer, X As Single, Y As Single) If Button = 1 Then Print “Ban vua tha phim chuot trai” End If If Button = 2 Then Print “Ban vua tha phim chuot phai” End If If Button = 4 Then Print “Ban vua tha phim chuot giua” End If End Sub Ví dụ 3: Sử dụng sự kiện MouseMove để vẽ các đường tròn liên tục trên biểu mẫu. Sự kiện Form_MouseMove được xử lý: Private Sub Form_MouseMove(Button As Integer, & _ Shift As Integer, X As Single, Y As Single) Circle (X, Y), 50 End Sub Trang 74
  16. Visual Basic Hình VI.13 Ví dụ về MouseMove Với ví dụ 3 ta nhận thấy rằng: sự kiện MouseMove không nhất thiết phải xảy ra ứng với mỗi Pixel khi con trỏ chuột đi qua. Thực ra mỗi đơn vị thời gian nào đó, hệ điều hành phát ra một số thông điệp. Ở đây, ta vẽ đường tròn ứng với sự kiện MouseMove, nếu người dùng di chuyển chuột chậm, thì các đường tròn sẽ được vẽ sát nhau và ngược lại nếu chuột được di chuyển nhanh. Hiệu chỉnh con trỏ chuột Ta có thể dùng thuộc tính MousePointer để hiển thị một biểu tượng, con trỏ màn hình hay con trỏ chuột đã được hiệu chỉnh. Dưới đây là các giá trị của thuộc tính MousePointer: Hằng Giá trị Diễn giải ccDefault 0 (Default) Shape determined by the object. ccArrow 1 Arrow. ccCross 2 Cross (cross-hair pointer). ccIbeam 3 I Beam. ccIcon 4 Icon (small square within a square). ccSize 5 Size (four-pointed arrow pointing north, south, east, and west). ccSizeNESW 6 Size NE SW (double arrow pointing northeast and southwest). ccSizeNS 7 Size N S (double arrow pointing north and south). ccSizeNWSE 8 Size NW, SE. ccSizeEW 9 Size E W (double arrow pointing east and west). ccUpArrow 10 Up Arrow. ccHourglass 11 Hourglass (wait). ccNoDrop 12 No Drop. ccArrowHourglass 13 Arrow and hourglass. ccArrowQuestion 14 Arrow and question mark. ccSizeAll 15 Size all. Trang 75
  17. Visual Basic ccCustom 99 Custom icon specified by the MouseIcon property. III.2 Sự kiện bàn phím Bàn phím cũng có 3 sự kiện, đó là sự kiện KeyPress (khi một phím có mã ASCII bất kỳ được ấn), KeyDown (khi một phím bất kỳ được ấn), KeyUp (khi một phím bất kỳ được thả) Chỉ có điều khiển đang có Focus mới bắt sự kiện bàn phím. Còn đối với biểu mẫu, nó chỉ bắt được sự kiện bàn phím mỗi khi nó đã được kích hoạt và không có bất kỳ điều khiển nào trên nó có Focus. Tuy nhiên ta có khể khắc phục điều này nếu như gán giá trị thuộc tính KeyPreview của biểu mẫu là True, biểu mẫu sẽ nhận mọi sự kiện bàn phím của mọi điều khiển đặt trên nó, điều này hữu ích khi ta muốn thực hiện cùng một công việc nào đó cho một phím được ấn mà không quan tâm rằng Focus đang thuộc điều khiển nào. Các sự kiện KeyDown, KeyUp có thể phát hiện một số tình huống mà sự kiện KeyPress không phát hiện: - Khi người dùng bấm một tổ hợp phím SHIFT, CTRL và ALT. - Phím định hướng. - PAGEUP và PAGEDOWN. - Phân biệt được phím số ở bên phải bàn phím và phím số ở bên trái bàn phím. - Đáp ứng khi thả phím. - Phím chức năng không trùng với menu. Các sự kiện bàn phím là không loại trừ nhau. Tức là một phím được ấn thì có thể là cả hai sự kiện KeyPress và KeyDown cùng được phát ra. Nhưng nếu là một phím mà KeyPress không phát hiện được thì chỉ có KeyDown và KeyUp xảy ra. Thuộc tính KeyPreview Đôi khi ta muốn tất cả các điều khiển trên Form nhận được sự kiện KeyPress chứ không phải chỉ có điều khiển đang nhận con trỏ (Focus), ta sẽ phải sử dụng thuộc tính KeyPreview. Khi chúng ta thiết kế một Form, giá trị mặc định của thuộc tính này sẽ là False, khi đó bất kỳ một sự kiện bàn phím nào cũng đều được gởi đến điều khiển đang giữ quyền điều khiển. Tuy nhiên nếu giá trị của thuộc tính là True thì Form sẽ là nơi nhận mọi sự kiện bàn phím. Sau đây là ví dụ về điều này: Private Sub Form_KeyPress (KeyAscii As Integer) ' Gởi điều khiển đến textbox đầu tiên txtForward.SetFocus txtBackward.Text = Chr(KeyAscii) & txtBackward.Text txtAscii.Text = txtAscii.Text & CStr(KeyAscii) & ",” End Sub Trang 76
  18. Visual Basic Hình VI.15 Các sự kiện bàn phím Trong ví dụ trên, nếu như giá trị của thuộc tính KeyPreview là False thì các TextBox Backward và Ascii không thể nhận được giá trị. IV. Xử lý đồ họa và giao diện IV.1 Hiển thị hình ảnh Bởi vì hệ điều hành Windows là hệ điều hành sử dụng giao diện đồ họa, do đó một phần quan trọng trong ứng dụng của ta là cách thức để hiển thị hình ảnh trong ứng dụng của mình. VB cung cấp cho chúng ta 4 loại điều khiển để hiển thị và quản lý hình ảnh: Picture Box, Image, Shape và Line. IV.1.1 Sử dụng Picture Box Cách dùng chính của điều khiển Picture Box là hiển thị hình ảnh. Hình ảnh mặc định mà Picture Box hiển thị có tên được xác định bởi thuộc tính Picture (có thể bao gồm cả đường dẫn). Ta cũng cần chú ý một điều đó là đối tượng Form cũng có thể hiển thị một hình ảnh xem như là ảnh nền thông qua thuộc tính Picture. Thuộc tính AutoSize của điều khiển Picture Box quy định kích thước của điều khiển có thể thay đổi một cách tự động hay không? Nếu giá trị của thuộc tính này là True, thì kích thước của điều khiển sẽ thay đổi theo kích thước của hình ảnh mà nó chứa. Tuy nhiên sự thay đổi này có thể làm ứng dụng của chúng ta trở nên xấu đi do sự thay đổi kích thước của điều khiển Picture Box sẽ không quan tâm đến các vị trí của các điều khiển khác cùng có trên biểu mẫu. Tốt hơn hết là chúng ta nên thử qua tất cả các hình ảnh có thể hiển thị tại thời điểm thiết kế để quy định kích thước của điều khiển cho hợp lý. Trang 77
  19. Visual Basic Hơn thế nữa, có thể thay đổi hình ảnh hiển thị bên trong Picture Box bằng cách sử dụng phương thức LoadPicture để thay đổi giá trị của thuộc tính Picture. Ngoài ra ta có thể dùng Picture Box như một vật chứa các điều khiển khác. Cũng như điều khiển Frame, ta có thể đặt các điều khiển khác bên trong Picture Box. Ta thường sử dụng Picture box chứa các điều khiển Label để hiển thị các thông tin và trạng thái của ứng dụng. Một cách dùng khác của Picture box đó là xem như một khung vẽ trắng và ta dùng các phương thức Circle, Line, PSet hay Point để vẽ lên trên điều khiển này. IV.1.2 Sử dụng Image Control Image control cũng như điều khiển Picture Box nhưng chỉ dùng để hiển thị hình ảnh. Nó không thể dùng làm vật chứa và cũng không có một số thuộc tính như điều khiển Picture Box. Các phương thức dùng để hiển thị, thay đổi hình ảnh cũng như điều khiển Picture Box, tuy nhiên thuộc tính quy định việc kích thước thay đổi một cách tự động là thuộc tính Stretch. Một trong những ứng dụng chủ yếu của điều khiển Image Control đó là sử dụng như một nút lệnh, đây là một cách thức tiện lợi để thiết kế nút lệnh chứa hình ảnh thay vì là các câu văn bản. Khi sử dụng Image Control như một nút lệnh, ta nên nhớ rằng điều khiển này sẽ không thể có trạng thái ấn xuống khi được Click, vì thế ta nên thay đổi hình ảnh hiển thị bởi Image Control để cho biết rằng nút lệnh đã được ấn. IV.2 Xử lý đồ họa IV.2.1 Tọa độ màn hình Góc trái trên của màn hình có tọa độ là (0,0) có nghĩa là X = 0 và Y = 0. Như vậy tức là khi di chuyển sang phải màn hình thì X tăng lên cũng như di chuyển xuống dưới thì Y tăng lên. Tuy nhiên VB chỉ cho phép ta vẽ trên biểu mẫu hay hộp hình (picture box). Khi đó hệ tọa độ sẽ được gắn với từng điều khiển. Ta thường sử dụng 2 hệ tọa độ chủ yếu sau: Twips và Pixel. Twips: Đây là hệ tọa độ mặc định dùng cho biểu mẫu. Mỗi điểm sẽ bằng 1/567 cm. Đây là hệ tọa độ không bị ảnh hưởng bởi thiết bị, kết quả vẽ sẽ như nhau trên màn hình VGA chuẩn, trên máy in hay trên màn hình có độ phân giải cao khác. Pixel: Đây là hệ tọa độ phổ biến nhất, mỗi một điểm trên màn hình sẽ bằng chính xác với một Pixel, như vậy khi sử dụng hệ tọa độ này sẽ giúp cho các ứng dụng đồ họa thực hiện được nhanh hơn vì không phải thông qua quá trình đổi hệ tọa độ. IV.2.2 Các phương thức đồ họa Các điều khiển được vẽ lên biểu mẫu lúc thiết kế nhưng các phương thức đồ họa cho phép vẽ trực tiếp khi ứng dụng thi hành. Phương thức PaintPicture Phương thức PaintPicture cho phép sao chép nhanh các hình ảnh từ biểu mẫu, hộp hình và máy in. Cú pháp: Trang 78
  20. Visual Basic object.PaintPicture picture, x1, y1, width1, height1, x2, y2, width2, height2, opcode Object Object là đối tượng mà phương thức sẽ làm việc, nó có thể là biểu mẫu, hộp hình hay đối tượng máy in. Picture Hình ảnh nguồn sẽ được vẽ lên đối tượng phải được chỉ rõ bởi thuộc tính Picture của biểu mẫu hoặc hộp hình. x1, y1 Giá trị chỉ định vị trí của hình ảnh trên đối tượng. Thuộc tính ScaleMode xác định hệ tọa độ nào được sử dụng. Width1 Giá trị xác định độ rộng của hình ảnh, nếu bỏ qua thì mặc định là độ rộng của ảnh nguồn. Height1 Giá trị xác định độ cao của hình ảnh, nếu bỏ qua thì mặc định là độ cao của ảnh nguồn. x2, y2 Các giá trị xác định hình ảnh sẽ được vẽ lại từ vị trí nào. Nếu bỏ qua thì giá trị mặc định là 0, tức toàn bộ hình ảnh được vẽ lại. Width2 Tương tự như Width1, nhưng ở đây là tác động đến ảnh nguồn. Height2 Tương tự như Height1, nhưng ở đây là tác động đến ảnh nguồn. Opcode Đây là tùy chọn và chỉ có tác dụng với ảnh Bitmap. Ví dụ: Thiết kế chương trình sao cho khi người sử dụng vừa di chuyển vừa nắm giữ phím chuột thì một hình ảnh sẽ được vẽ lại ở tọa độ mới. Dim re Private Sub Form_Load() re = False End Sub Private Sub Form_MouseDown(Button As Integer, & _ Shift As Integer, X As Single, Y As Single) re = True End Sub Private Sub Form_MouseMove(Button As Integer, & _ Shift As Integer, X As Single, Y As Single) If re Then Form1.PaintPicture Image1.Picture, X, Y, & _ Image1.Width, Image1.Height End If End Sub Private Sub Form_MouseUp(Button As Integer, & _ Shift As Integer, X As Single, Y As Single) re = False End Sub Trang 79
  21. Visual Basic Qua ví dụ trên ta thấy phương thức PaintPicture cho phép sao chép nhanh một ảnh nguồn trên các đối tượng khác . Hình VI.16 Phương thức PaintPicture Phương thức PSet Phương thức này thao tác trên từng điểm và có công dụng gán một màu nào đó cho một điểm trên đối tượng. Cú pháp : Object.PSet [Step] (x, y), [color] Object Đối tượng mà phương thức làm việc. Step Tùy chọn. Xác định mối quan hệ với tọa độ X và Y hiện tại. (x, y) Tọa độ của điểm. Color Màu của điểm đó. Điều khiển hình dáng Đây là điều khiển cho phép vẽ các hình đơn giản lên một biểu mẫu trong khi thiết kế. Đây là một điều khiển rất đơn giản, ta chỉ quan tâm đến các thuộc tính sau: - Shape: Quy định hình vẽ là hình oval, chữ nhật - BorderStyle: Quy định kiểu đường vẽ. - BackStyle: Cho biết dạng tô màu đặc hay không. - BorderWidth: Đây là độ rộng của đường vẽ. Vẽ đường tròn, cung tròn và Ellipse VB cung cấp phương thức Circle cho phép ta vẽ đường tròn, đường cong, cung tròn, ellipse Để vẽ một đường tròn ta dùng phương thức Circle do VB cung cấp. Cú pháp: Object.Circle (X, Y), Radius, [color] Trang 80
  22. Visual Basic Object Đối tượng mà phương thức làm việc. (x, y) Tọa độ tâm đường tròn. Radius Bán kính của đường tròn Color Màu đặt cho đường tròn. . Để vẽ một cung tròn, ta cũng sử dụng phương thức Circle, tuy nhiên ta cần cung cấp thêm 2 thông số đó là điểm bắt đầu và điểm kết thúc của cung tròn. Thông thường chúng ta quen sử dụng đơn vị đo góc là độ, tuy nhiên đối với VB ta cần phải đưa vào đơn vị là Radians. Ví dụ vẽ một cung tròn tâm (1000, 1500), bán kính 500 bắt đầu từ góc 60o đến góc 90o ta dùng đoạn lệnh như sau: Const pi = 3.1415 Circle (1000, 15000), 500, , pi/3, pi/2 Để vẽ một Ellipse, ta cung cấp thêm thông số cuối cùng (thông số Aspect) đó là sự co giãn của đường tròn theo chiều ngang. Cú pháp tổng quát của phương thức Circle: object.Circle [Step] (x, y), radius, [color, start, end, aspect] Chương 7 : TẬP TIN Mục tiêu: Chương này giới thiệu về cách thức truy cập hệ thống tập tin của Windows trong VB, thao tác thường gặp trong các ứng dụng chạy trên Windows. Học xong chương này, sinh viên phải nắm bắt được các vấn đề sau: - Sử dụng mô hình đối tượng hệ thống tập tin để thao tác với ổ đĩa, thư mục, tập tin trong Windows. - Sử dụng các hàm xuất/nhập tập tin để truy xuất tập tin văn bản, tập tin nhị phân, tập tin truy xuất ngẫu nhiên. Kiến thức có liên quan: - Các cấu trúc lập trình trong VB. - Cách thức tổ chức hệ thống tập tin của hệ điều hành Windows (9X, 2000, XP ) Tài liệu tham khảo: - Microsoft Visual Basic 6.0 và Lập trình Cơ sở dữ liệu - Chương 6, trang 88 - Nguyễn Thị Ngọc Mai (chủ biên), Nhà xuất bản Giáo dục - 2000. Trang 81
  23. Visual Basic I. Mô hình File System Object (FSO) Cung cấp cho ứng dụng của ta các khả năng như tạo mới, thay đổi, xóa, di chuyển các thư mục, hoặc kiểm tra xem một thư mục nào đó có tồn tại hay không Ngoài ra chúng ta cũng có thể lấy được các thông tin liên quan đến thư mục như tên, ngày tạo, ngày sửa đổi gần nhất Mô hình FSO chỉ hỗ trợ truy xuất trực tiếp tập tin dạng văn bản thông qua đối tượng TextStream, nó chưa hỗ trợ cho tập tin nhị phân, do đó với tập tin nhị phân ta phải dùng lệnh Open với cờ Binary. Đối tượng Giải thích Drive Cho phép thu thập thông tin về ổ đĩa, bao gồm cả các ổ đĩa chia sẻ qua mạng LAN, CD-ROM Folder Cho phép tạo, xóa, di chuyển và thu nhận các thông tin hệ thống trên thư mục. File Đối tượng cho phép thao tác trên tập tin. FileSystemObject Các thuộc tính và phương thức cho phép thao tác trên tập tin, thư mục và ổ đĩa. TextStream Cho phép đọc và ghi tập tin dạng văn bản (dạng Text). Nếu chưa có tham chiếu đến đối tượng FSO, ta cần chọn "Microsoft Scripting Runtime" từ menu Project/References Các phương thức của FSO ta có thể xem trong cửa sổ Object Browser. I.1 Tạo đối tượng FileSystemObject Có hai cách, khai báo một biến kiểu FileSystemObject hoặc dùng phương thức CreateObject của lập trình hướng đối tượng. Cách 1: Dim fso As New FileSystemObject Cách 2: Set fso = CreateObject("Scripting. FileSystemObject") Trong đó Scripting là tên thư viện và FileSystemObject là tên đối tượng. I.2 Truy cập ổ đĩa, thư mục, tập tin Dùng các phương thức GetDrive, GetFolder, GetFile. Ví dụ để tạo một handle trỏ đến tập tin "d:\tqdinh\text.txt" ta dùng các dòng lệnh sau: Dim fso As New FileSystemObject, f As File Set f = fso.GetFile("d:\tqdinh\text.txt") Hoặc ta có thể tạo mới thư mục, tập tin thông qua các phương thức CreateFolder, CreateTextFile. Ngoài ra ta có thể xóa một thư mục hoặc một tập tin thông qua DeleteFolder, DeleteFile. Đối tượng FileSystemObject còn có rất nhiều phương thức, ta có thể xem qua cửa sổ ObjectBrowser. Trang 82
  24. Visual Basic Hình VII.1 Cửa sổ ObjectBrowser với đối tượng FileSystemObject I.3 Thông tin về ổ đĩa Các thông tin này được truy xuất thông qua các thuộc tính của đối tượng File. - TotalSize: tổng dung lượng của ổ đĩa tính bằng Byte. - AvailableSpace, FreeSpace: dung lượng còn trống của đĩa. - DriveLetter: ký tự ổ đĩa. - DriveType: loại ổ đĩa (ổ tháo lắp hay cố định, ổ mạng, CD-ROM, ổ RAM). - FileSystem: ổ đĩa được quản lý bởi bản FAT nào: FAT16, FAT32, NTFS I.4 Làm việc với thư mục Đây là các phương thức có cách sử dụng rất đơn giản, vì thế ta chỉ xét qua phương thức nào ứng với tác vụ gì (công việc gì) chứ không đi sâu phân tích từng phương thức. Tác vụ Phương thức Tạo thư mục FileSystemObject.CreateFolder Xóa thư mục FileSystemObject.DeleteFolder hay Folder.Delete Di chuyển thư mục FileSystemObject.MoveFolder hay Folder.Move Sao chép thư mục FileSystemObject.CopyFolder hay Folder.Copy Lấy tên thư mục Folder.Name Kiểm tra thư mục có tồn tại trên ổ FileSystemObject.FolderExists Trang 83
  25. Visual Basic đĩa hay không Trả về đối tượng Folder FileSystemObject.GetFolder Lấy tên của thư mục cha FileSystemObject.GetParentFolderName Lấy tên của thư mục hệ thống FileSystemObject.GetSpecialFolder I.5 Làm việc với tập tin Mở tập tin để ghi dữ liệu o Tạo tập tin mới: sử dụng phương thức CreateTextFile. Dim fso As New FileSystemObject fso.CreateTextFile("d:\home\lhbao\test.txt") o Mở tập tin để ghi với cờ ForWriting, lúc này ta sử dụng phương thức OpenAsTextStream của đối tượng File cùng với đối tượng TextStream để thao tác. Ví dụ: Dim fso As New FileSystemObject, f As File Dim ts As TextStream fso.CreateTextfile("d:\home\lhbao\test.txt") Set f = fso.GetFile("d:\home\lhbao\test.txt") Set ts = f.OpenAsTextStream(ForWriting) o Ghi dữ liệu lên tập tin: ta có thể ghi dữ liệu vào tập tin đang mở bằng phương thức Write hay WriteLine của đối tượng TextStream. Sự khác biệt giữa hai phương thức này là sẽ có thêm ký tự xuống dòng nếu như sử dụng WriteLine. Nếu muốn ghi một dòng trắng vào tập tin đang mở, ta sử dụng phương thức WriteBlankLines. Cú pháp: ts là đối tượng TextStream ts.Write(s) ‘ Ghi chuỗi s lên tập tin ts.WriteLine(s) ‘ Ghi chuỗi s lên tập tin ts.WriteBlankLines(N) ‘ Ghi N dòng trắng lên tập tin Mở tập tin để đọc dữ liệu o Mở tập tin để đọc với cờ ForReading, lúc này ta sử dụng phương thức OpenAsTextStream của đối tượng File cùng với đối tượng TextStream để thao tác. Ví dụ: Dim fso As New FileSystemObject, f As File Dim ts As TextStream Set f = fso.GetFile(“D:\Home\lhbao\Test.txt”) Set ts = f.OpenAsTextStream(ForReading) o Đọc dữ liệu từ tập tin: Ta có ba phương thức để đọc dữ liệu từ một tập tin văn bản, đó là Read, ReadLine và ReadAll. Ba phương thức này cho phép đọc một số ký tự, một dòng của văn bản và toàn bộ văn bản. Trong khi đọc nội dung của tập tin, ta có thể sử dụng phương thức Skip, SkipLine để nhảy đến phần tử dữ liệu mới. Cú pháp: ts là đối tượng TextStream ts.Read(N) As String: Đọc N ký tự từ tập tin ts.ReadLine As String ts.ReadAll As String Trang 84
  26. Visual Basic Đóng tập tin: Sử dụng phương thức Close của đối tượng TextStream. Di chuyển, sao chép và xóa tập tin Sự khác biệt giữa di chuyển và sao chép một tập tin đó là tập tin nguồn có còn tồn tại ở thư mục nguồn hay không. Ứng với một thao tác, ta cũng có hai phương thức để thực hiện, đó là các phương thức thuộc đối tượng FileSystemObject và đối tượng File. Tác vụ Phương thức Di chuyển một tập tin FileSystemObject.MoveFile hoặc File.Move Sao chép một tập tin FileSystemObject.CopyFile hoặc File.Copy Xóa một tập tin FileSystemObject.DeleteFile hoặc File.Delete Các phương thức ứng với thao tác di chuyển và sao chép tập tin cần có đối số là đường dẫn đến nơi chứa tập tin đích. I.6 Ví dụ Thiết kế một ứng dụng như Notepad của Windows, sử dụng FSO để truy xuất tập tin. Trang 85
  27. Visual Basic TextBox: txtNoidung o Thêm vào điều khiển CommonDialog vào ứng dụng với Name: dlgFile. o Sự kiện mnuNew_Click được xử lý: Private Sub mnuNew_Click() txtNoiDung.Text = "" End Sub o Đoạn mã cho thủ tục xử lý sự kiện mnuOpen_Click: Private Sub mnuOpen_Click() On Error GoTo Xuly dlgFile.Filter = "All Files (*.*)|*.*|” & _ “Text Files (*.txt)|*.txt" dlgFile.FilterIndex = 2 dlgFile.ShowOpen Dim fso As New FileSystemObject, f As File Dim ts As TextStream Set f = fso.GetFile(dlgFile.FileName) Set ts = f.OpenAsTextStream(ForReading) txtNoiDung.Text = ts.ReadAll() ts.Close Xuly: End Sub o Đối với mnuSave_Click: Private Sub mnuSave_Click() On Error GoTo Xuly dlgFile.Filter = "All Files (*.*)|*.*|” & _ “Text Files (*.txt)|*.txt" dlgFile.FilterIndex = 2 dlgFile.ShowSave Dim fso As New FileSystemObject, f As File Dim ts As TextStream fso.CreateTextFile (dlgFile.FileName) Trang 86
  28. Visual Basic Set f = fso.GetFile(dlgFile.FileName) Set ts = f.OpenAsTextStream(ForWriting) ts.Write (txtNoiDung.Text) ts.Close Xuly: End Sub o Sự kiện mnuSaveAs_Click cũng được xử lý tương tự. o Sự kiện mnuFont: Private Sub mnuFont_Click() On Error GoTo Xuly With dlgFile .Flags = cdlCFBoth + 256 .ShowFont txtNoiDung.Font.Bold = .FontBold txtNoiDung.Font.Italic = .FontItalic txtNoiDung.Font.Name = .FontName txtNoiDung.Font.Size = .FontSize End With Xuly: End Sub o Sự kiện mnuExit_Click: Private Sub mnuExit_Click() End End Sub o Lưu dự án và chạy chương trình. II. Hàm I/O và lệnh xử lý tập tin Có ba kiểu tập tin: Tuần tự, ngẫu nhiên và nhị phân - Tuần tự (Sequential): Đây là cách thức truy cập đến tập tin cho kiểu đọc và ghi thành theo các khối liên tục nhau. - Ngẫu nhiên (Random): đọc và ghi các tập tin văn bản hoặc nhị phân có cấu trúc theo các mẩu tin có độ dài cố định. - Nhị phân (Binary): đọc và ghi các tập tin có cấu trúc thay đổi. Các hàm và dòng lệnh thao tác trên các kiểu truy cập tập tin, công dụng của từng hàm sẽ được xét đến trong phần sau: Statements & Sequential Random Binary Functions Close X X X Get X X Input( ) X X Input # X Line Input # X Trang 87
  29. Visual Basic Open X X X Print # X Put X X Write # X II.1. Tập tin tuần tự II.1.1 Mở tập tin Cú pháp: Open pathname For [Input|Output|Append] _ As filenumber [Len = buffersize] Nếu ta dùng tham số Input thì tập tin (có đường dẫn là pathname) đó phải tồn tại rồi, nếu không sẽ gây ra lỗi và tham số này được dùng trong trường hợp mở tập tin để đọc. Còn các tham số Output hoặc Append sẽ tạo mới tập tin và sau đó mở nó. Tham số Len sẽ chỉ ra số ký tự trong vùng đệm khi sao chép dữ liệu giữa tập tin và chương trình xử lý. Filenumber là số hiệu của tập tin được mở, nó mang giá trị kiểu nguyên và nằm trong khoảng từ 1 đến 511. Để lấy số hiệu tập tin mới hợp lệ, ta sử dùng hàm FreeFile. II.1.2 Đọc nội dung tập tin o Hàm Input Cú pháp: Input (number, filenumber) As String: hàm này trả về number ký tự của tập tin có số hiệu được chỉ định bởi filenumber. o Lệnh Input # Cú pháp: Input # filenumber, varlist: lệnh này sẽ đọc nội dung của tập tin vào các biến được chỉ bởi varlist. Lưu ý rằng lệnh này chỉ sử dụng với các tập tin được ghi bởi lệnh Write #. o Lệnh Line Input # Cú pháp: Line Input # filenumber, varname: lệnh này sẽ đọc nội dung của một dòng trong tập tin tuần tự vào biến chuỗi. II.1.3 Ghi dữ liệu lên tập tin Ta có 2 câu lệnh để ghi dữ liệu lên tập tin là Write # và Print #. o Câu lệnh Write #: Cú pháp: Write # filenumber, [outputlist]: lệnh này ghi dữ liệu vào tập tin tuần tự, nội dung ghi mới chứa trong danh sách biến outputlist, các phần tử của danh sách cách nhau bởi dấu phẩy. Nếu ta không đặc tả outputlist thì một dòng trắng sẽ được ghi vào tập tin. o Câu lệnh Print#: Cú pháp: Print # filenumber, [outputlist]: tương tự như Write# nhưng dữ liệu có thể định dạng khi ghi lên tập tin. Trang 88
  30. Visual Basic Đối số outputlist có thể là: [{Spc(n) | Tab[(n)]}] [expression] [charpos] Trong đó: - Spc(n): dùng để xen khoảng trắng vào tập tin với n là số khoảng trắng. - Tab(n): dùng để xác định cột bắt đầu ghi dữ liệu trong vùng ghi với n là số thứ tự cột. Dùng Tab không đối số để chỉ vị trí bắt đầu của vùng ghi tiếp theo. - Expression: biểu thức chuỗi hoặc biểu thức số. - Charpos: chỉ định vị trí của ký tự kế tiếp. Trong đó: dấu ; xác định dữ liệu mới sẽ ghi kế tiếp ký tự cuối cùng trước đó. Tab(n) xác định chính xác cột để ghi dữ liệu hay Tab chỉ ra vị trí của dữ liệu cần ghi vào là vùng ghi kế tiếp. Nếu tham số này bị bỏ qua, dữ liệu sẽ được ghi bắt đầu từ dòng kế tiếp. II.1.4 Đóng tập tin Cú pháp: Close filenumberlist: đóng lại các tập tin được mở với các số hiệu được mô tả trong filenumberlist, filenumberlist có dạng sau: [[#]filenumber] [, [#]filenumber] . . . II.1.5 Ví dụ Open "TESTFILE" For Output As #1 ' Mở tập tin để ghi. Print #1, "This is a test" ' Ghi chuỗi vào tập tin. Print #1, ' Ghi một dòng trắng vào tập tin. Print #1, "Zone 1"; Tab ; "Zone 2" ' Tạo hai vùng ghi. ' Phân cách hai chuỗi bởi khoảng trống. Print #1, "Hello" ; " " ; "World" Print #1, Spc(5) ; "5 leading spaces " ' Tạo 5 khoảng trống Print #1, Tab(10) ; "Hello" ' ghi chuỗi tại cột thứ 10. ' Gán giá trị thuộc kiểu Boolean, Date, Null và Error. Dim MyBool, MyDate, MyNull, MyError MyBool = False : MyDate = #February 12, 1969# : MyNull = Null MyError = CVErr(32767) Print #1, MyBool ; " is a Boolean value" Print #1, MyDate ; " is a date" Print #1, MyNull ; " is a null value" Print #1, MyError ; " is an error value" Close #1 ' Đóng tập tin Và sau đây là nội dung của tập tin TESTFILE sau khi thực thi chương trình: Trang 89
  31. Visual Basic This is a test Zone 1 Zone 2 Hello World 5 leading spaces Hello False is a Boolean value 2/12/1969 is a date Null is a null value Error 32767 is an error value Ứng dụng sau đây cho phép đọc nội dung 1 tập tin được lựa chọn. o Thiết kế chương trình có giao diện: Ở đây ta có sử dụng điều khiển danh sách ổ đĩa, thư mục, tập tin để lựa chọn tập tin cùng với 1 TextBox để hiển thị nội dung. o Các sự kiện được xử lý như sau: Private Sub Drive1_Change() Dir1.Path = Drive1.Drive End Sub Private Sub Dir1_Change() File1.Path = Dir1.Path End Sub Private Sub Command1_Click() Dim fname As String, str As String fname = Dir1.Path + "\" + File1.filename Open fname For Input As #1 Do While Not EOF(1) Line Input #1, str Text1.Text = Text1.Text + str + vbCrLf Loop Close #1 End Sub o Lưu dự án và chạy chương trình, ta được kết quả: Trang 90
  32. Visual Basic II.2. Tập tin truy xuất ngẫu nhiên II.2.1 Mở tập tin Cú pháp Open pathname [For Random] As filenumber _ [Len = RecLength] Bởi vì tham số Random là mặc định, do đó từ khóa For Random là không cần thiết. Tham số Len cần một kích thước đúng của mẩu tin, nếu nhỏ hơn thì sẽ gây ra lỗi, lớn hơn sẽ gây lãng phí không gian đĩa. Filenumber: số hiệu tập tin khi mở (có đường dẫn là pathname) II.2.2 Đọc nội dung tập tin o Câu lệnh Get: Cú pháp: Get [#] filenumber, [recnumber], varname: lệnh này sẽ đọc nội dung của mẩu tin thứ recnumber trong tập tin vào biến mẩu tin varname, trong đó mẩu tin đầu tiên có số thứ tự là 1. II.2.3 Ghi dữ liệu lên tập tin o Câu lệnh Put: Cú pháp: Put [#] filenumber, [recnumber], varname: Lệnh này sẽ thay thế hoặc thêm mới mẩu tin vào tập tin. Nếu như số thứ tự mẩu tin (recnumber) chỉ đến mẩu tin đã tồn tại, thì nội dung của mẩu tin đó được thay thế. Để thêm mới mẩu tin, số thứ tự mẩu tin cần có giá trị là số mẩu tin hiện có của tập tin cộng thêm 1. II.2.4 Đóng tập tin Cú pháp: Close filenumberlist: đóng lại các tập tin được mở với các số hiệu được mô tả trong filenumberlist, filenumberlist có dạng sau: [[#]filenumber] [, [#]filenumber] II.2.5 Ví dụ Giá sử ta có khai báo 1 mẩu tin như sau: Type Hanghoa Trang 91
  33. Visual Basic MaHang As String * 10 TenHang As String * 40 DVTinh As String * 15 Gia As Double End Type o Ghi dữ liệu lên tập tin có cấu trúc là các mẩu tin như trên Dim h As Hanghoa h.MaHang = "AM01" h.TenHang = "Dau goi Clear" h.DVTinh = "Chai" h.Gia = 14000# Open "E:\Test.dat" For Random As #1 Len = LenB(h) Put #1, 1, h Close #1 o Đọc dữ liệu từ tập tin có cấu trúc như trên: Dim h As Hanghoa Open "E:\Test.dat" For Random As #1 Len = LenB(h) Get #1, 1, h Close #1 MsgBox h.MaHang & ": " & h.TenHang & ": " & _ h.DVTinh & ": " & Str(h.Gia), , _ “Thong tin Hang Hoa” Kết quả khi đọc dữ liệu như sau: Trang 92
  34. Visual Basic Chương 8: CÁC KHÁI NIỆM CƠ BẢN VỀ CƠ SỞ DỮ LIỆU Mục tiêu: Chương này giới thiệu về một số khái niệm trong lập trình cơ sở dữ liệu với VB, những vấn đề cần thiết khi thiết kế các ứng dụng truy cập cơ sở dữ liệu. Học xong chương này, sinh viên phải nắm bắt được các vấn đề sau: - Một số khái niệm khi lập trình cơ sở dữ liệu trong VB. - Phân biệt DAO, RDO, ADO. - Sử dụng môi trường phát triển VB để tương tác với cơ sở dữ liệu. Kiến thức có liên quan: - Câu lệnh SQL để truy vấn dữ liệu. Tài liệu tham khảo: - Microsoft Visual Basic 6.0 và Lập trình Cơ sở dữ liệu - Chương 18, trang 447 - Nguyễn Thị Ngọc Mai (chủ biên), Nhà xuất bản Giáo dục – 2000. Trang 93
  35. Visual Basic I. Cơ sở dữ liệu I.1. Khái niệm Cơ sở dữ liệu là một kho chứa thông tin. Có nhiều loại cơ sở dữ liệu, nhưng trong khuôn khổ bài giảng này ta chỉ quan tâm đến các ứng dụng lập trình liên quan đến cơ sở dữ liệu quan hệ. Một cơ sở dữ liệu quan hệ: o Chứa dữ liệu trong các bảng, được cấu tạo bởi các dòng còn gọi là các mẩu tin, và cột còn gọi là các trường. o Cho phép lấy về (hay truy vấn) các tập hợp dữ liệu con từ các bảng. o Cho phép nối các bảng với nhau cho mục đích truy cập các mẩu tin liên quan với nhau chứa trong các bảng khác nhau. I.2. Bộ máy (Engine) cơ sở dữ liệu Chức năng cơ bản của một cơ sở dữ liệu được cung cấp bởi một bộ máy cơ sở dữ liệu, là hệ thống chương trình quản lý cách thức chứa và trả về dữ liệu. Chẳng hạn Microsoft Jet là bộ máy cơ sở dữ liệu được sử dụng khi truy cập dữ liệu Access. I.3. Bảng (Table) và trường (Field) Các cơ sở dữ liệu được cấu thành từ các bảng dùng thể hiện các phân nhóm dữ liệu. Chẳng hạn, nếu ta tạo một cơ sở dữ liệu để quản lý các tài khoản trong công việc kinh doanh, ta phải tạo một bảng cho Khách hàng, một bảng cho Hóa đơn và một bảng cho Nhân viên. Bảng có cấu trúc định nghĩa sẵn và chứa dữ liệu phù hợp với cấu trúc này. o Bảng: chứa các mẩu tin là các mẩu dữ liệu riêng rẽ bên trong phân nhóm dữ liệu. o Mẩu tin: chứa các trường. Mỗi trường thể hiện một bộ phận dữ liệu trong một mẩu tin. Ví dụ như mỗi mẩu tin thể hiện một mục trong danh bạ địa chỉ chứa các trường tên và họ, địa chỉ, thành phố, số điện thoại Ta có thể dùng chương trình Visual Basic để tham chiếu và thao tác với cơ sở dữ liệu, bảng, mẩu tin và các trường. I.4. Tập mẩu tin (Recordset) Recordset là một cấu trúc dữ liệu thể hiện một tập hợp con các mẩu tin lấy về từ cơ sở dữ liệu. Về khái niệm, nó tương tự như một bảng nhưng có thêm một vài thuộc tính riêng biệt quan trọng. Các Recordset được thể hiện như các đối tượng. Cũng như các đối tượng khác trong Visual Basic, các đối tượng recordset có các thuộc tính và phương thức riêng. II. Truy xuất cơ sở dữ liệu trong Visual Basic 6.0 Visual Basic cung cấp kèm theo nó một bộ máy cơ sở dữ liệu có thể hiểu được dữ liệu của Microsoft Access gọi là Joint Engine Technology (JET). JET là một bộ Trang 94
  36. Visual Basic máy truy cập cơ sở dữ liệu hướng đối tượng và nó là một phần không thể thiếu được của Visual Basic. Phiên bản của JET đi kèm với VB 6.0 là miễn phí nghĩa là VB có thể truy xuất trực tiếp cơ sở dữ liệu của Microsoft Access. Giao diện để VB truy xuất JET có tên là Data Access Objects (DAO). JET là một bộ máy cơ sở dữ liệu tuyệt vời cho các ứng dụng văn phòng chạy trên máy đơn, nhưng hiệu suất của nó giảm đáng kể khi số lượng người dùng tăng lên và cơ sở dữ liệu được mở rộng. Vì điều này JET không phải là một giải pháp tối ưu cho các ứng dụng cơ sở dữ liệu nhiều người dùng. Cho đến nay người ta chưa có một thống kê chính xác được kích thước dữ liệu tối đa hay số lượng người dùng tối đa của JET nhưng nhìn chung JET bị giới hạn nhiều hơn so với các giải pháp khác trong môi trường đa người dùng. Tuy vậy, JET là điểm khởi đầu tốt nhất cho người lập trình VB bởi vì sự đơn giản của nó. Khi kích thước dữ liệu tăng lên, người lập trình bao giờ cũng muốn xây dựng một ứng dụng Khách/Chủ (Client/Server) có khả năng bảo mật cao và linh hoạt. Vì lẽ đó, Microsoft hỗ trợ trong VB để truy cập các cơ sở dữ liệu quan hệ được thông dịch bởi chuẩn Open Database Connectivity (ODBC). ODBC là một kỹ thuật cho phép truy cập các cơ sở dữ liệu quan hệ cao cấp như SQL SERVER hay ORACLE. Tuy nhiên, ODBC cũng có thể được sử dụng để truy cập các cơ sở dữ liệu nhỏ tổ chức bằng Microsoft Access hay Foxpro, thậm chí các cơ sở dữ liệu máy chủ như IBM DB2. Visual Basic sử dụng giao diện đối tượng Remote Data Objects (RDO) để truy cập ODBC. DAO và RDO là những kỹ thuật hỗ trợ việc truy xuất đến các cơ sở dữ liệu quan hệ. Tuy nhiên, Microsoft lại cung cấp một công cụ hữu ích hơn để truy cập dữ liệu goi là OLEDB. OLEDB là kỹ thuật cho phép dữ liệu được truy xuất từ cả 2 nguồn cơ sở dữ liệu: quan hệ và không quan hệ. Điều đó có nghĩa là gồm các cơ sở dữ liệu của Microsoft Access, Oracle, SQL SERVER và cả các nguồn dữ liệu không quan hệ như Excel, Microsoft Index Server, Microsoft Exchange, Active Directory Visual Basic sử dụng giao diện đối tượng ActiveX Data Objects (ADO) để truy cập OLEDB. Visual Basic cung cấp cho ta nhiều công cụ để truy cập dữ liệu như DAO, RDO, ADO. Câu hỏi thường đặt ra là: Kỹ thuật nào được sử dụng lúc nào ở đâu? Nhiều người cho rằng DAO & RDO đã lỗi thời và người ta hiếm sử dụng chúng. Thật ra DAO & RDO là các điển hình cho một vài khả năng tiêu biểu của ADO. Hiện nay, vẫn còn khá nhiều ứng dụng sử dụng DAO & RDO và thật sự chúng bị giới hạn trong chừng mực nào đó. OLEDB thực sự cung cấp một khả năng rộng lớn để truy cập các cơ sở dữ liệu từ nhiều nguồn khác nhau. Tuy vậy, trong một số trường hợp một giải pháp dùng RDO lại hữu dụng hơn ADO. III. Dùng Visual Basic để tạo một cơ sở dữ liệu Thông thường chúng ta sẽ sử dụng các hệ quản trị cơ sở dữ liệu để tạo nên một cơ sở dữ liệu, nhưng trong phần này ta sẽ xét qua tính năng tạo cơ sở dữ liệu bằng Visual Basic 6.0. Ta có thể áp dụng phương pháp này cho những cơ sở dữ liệu nhỏ và tương thích với Microsoft Access. Trang 95
  37. Visual Basic III.1 Sử dụng cửa sổ cơ sở dữ liệu o Từ Menu của VB6, chọn mục Add-Ins, Visual Data Manager. Cửa sổ Visual Data Manager sẽ xuất hiện. o Chọn mục File -> New -> MicroSoft Access -> Version 7.0 MDB. o Chọn thư mục ta muốn lưu cơ sở dữ liệu và tên của cơ sở dữ liệu. Hình VIII.1 Cửa sổ Visual Data Manager Tạo bảng ‰ Để tạo mới một bảng, ta chọn Properties trong cửa sổ Databases, nhấp chuột phải, chọn New Table, đặt tên cho Table tại ô Table Name, ấn Add Field để tạo mới các trường cho bảng. Hình VIII.2 Cửa sổ tạo Table Trang 96
  38. Visual Basic ‰ Ta sẽ nhập tên trường tại ô Name, chọn kiểu của trường tại Combo Type, tùy chọn FixedField và VariableField xác định độ dài của trường là cố định hay thay đổi. ‰ Sau khi xác định đầy đủ các thuộc tính của trường, ấn OK và tiếp tục thêm vào các trường khác cho bảng. Nếu đã thêm mới đầy đủ các trường của bảng, ấn Close để quay về cửa sổ Table Structure. ‰ Sau khi quay về cửa sổ Table Structure, ta sẽ xác lập các chỉ mục cũng như khóa chính của bảng. Hình VIII.3 Cửa sổ tạo khóa chính và chỉ mục ‰ Tại ô Name, ta sẽ nhập vào tên của chỉ mục, rồi chọn các trường tham gia vào chỉ mục đó. Nếu ta chọn Primary thì đó chính là các trường cấu thành khóa chính của bảng. Chọn Unique tức là giá trị của chỉ mục đó sẽ không có sự trùng lặp. ‰ Ấn Close xác nhận rằng ta đã xây dựng xong tập các chỉ mục của bảng. ‰ Sau khi đã hoàn thành tất cả các thao tác trên, để tạo bảng ta ấn Build the Table. Tuy rằng đây là một tính năng mới của VB6, tuy nhiên chúng ta cũng sẽ gặp phải rất nhiều bất tiện khi phải thiết kế một cơ sở dữ liệu hoàn chỉnh cũng như trong quá trình bảo trì và sử dụng (khó khăn trong việc thay đổi các thuộc tính đã xác lập, không tạo liên kết giữa các bảng được ). Một phương cách tốt nhất đó là nên dùng các hệ quản trị cơ sở dữ liệu chuyên dùng để thực hiện công việc nêu trên. Trang 97
  39. Visual Basic Hình VIII.4 Tạo bảng cho cơ sở dữ liệu III.2 Dùng Visual Data Manager để tạo giao diện Ta có thể thiết kế một Form nhập liệu đơn giản cho một Table từ Visual Data Manager. Các bước tiến hành như sau: ‰ Từ Visual Data Manager chọn Cơ sở dữ liệu cần thao tác. ‰ Chọn Data Form Design từ mục Utility. ‰ Chọn Table cần cho việc tạo Form và các trường hiển thị trên Form (thông thường chúng ta sẽ cho hiển thị tất cả các trường). ‰ Chọn Build the Form, biểu mẫu mới đã được tạo trong đề án của chúng ta. Hình VIII.5 Thiết lập các thuộc tính cho Form Kết quả sau khi chúng ta xây dựng Form bằng Visual Data Manager: Trang 98
  40. Visual Basic IV. Sử dụng cửa sổ xem dữ liệu (Data View) VB6 còn hỗ trợ cho người lập trình khả năng làm việc với cơ sở dữ liệu mà không phải thông qua công cụ quản trị cơ sở dữ liệu hoặc các công cụ trong Add-In. Công cụ này chính là cửa sổ Data View. ‰ Từ Menu của VB chọn Data View hoặc nhấn nút Data View trên thanh công cụ. ‰ Cửa sổ Data View xuất hiện cho ta hai lựa chọn: Data Links và Data Environment Connections. Hình VIII.6 Cửa sổ Data View Liên kết dữ liệu (Data Link) là một cách kết nối môi trường phát triển của VB6 với một cơ sở dữ liệu nào đó. Một kết nối môi trường dữ liệu (Data Environment Connection) là cách thức sử dụng cơ sở dữ liệu trong một đề án cụ thể. Điểm khác biệt giữa hai thành phần này là sự liên quan giữa cơ sở dữ liệu với đề án cụ thể. Để sử dụng cơ sở dữ liệu theo kiểu Data Link, ta tiến hành như sau: ‰ Chọn Data Links, ấn chuột phải -> Add a Data Link hoặc ấn nút Data Link trên thanh công cụ của cửa sổ. ‰ Cửa sổ Data Link Properties xuất hiện. Trang 99
  41. Visual Basic Hình VIII.7 Hộp thoại Data Link Properties ‰ Chọn trình cung cấp Microsoft Jet, chọn Next. ‰ Chọn cơ sở dữ liệu muốn nối kết đến, nhấn OK. Liên kết dữ liệu cung cấp một cách nhìn tóm lược về nguồn dữ liệu. Mỗi lần ta tạo một liên kết dữ liệu, ta có thể duyệt bằng cách mở rộng phần tử trong danh sách tóm lược. Thực hiện điều này bằng cách nhấn vào dấu cộng bên trái mỗi phần tử (hình VIII.8). Hình VIII.8 Cửa số Data V. Sử dụng điều khiển dữ liệu để tạo giao diện người sử dụng Điều khiển dữ liệu giúp cho người sử dụng liên kết biểu mẫu của mình đến nguồn cơ sở dữ liệu. Điều khiển dữ liệu cung cấp cho người sử dụng những tính năng xử lý dữ liệu cơ bản như duyệt qua các mẩu tin, thêm mới, cập nhật. Đối với phiên bản VB6 cung cấp cho chúng ta 3 trình điều khiển dữ liệu: DAO (Data Access Object), RDO (Remote Data Object) và ADO (ActiveX Data Object). Trang 100
  42. Visual Basic V.1 Kết nối với cơ sở dữ liệu và làm việc với các mẩu tin thông qua điều khiển ADO Data V.1.1 Hiển thị dữ liệu Nếu như chúng ta xây dựng một biểu mẫu chỉ để hiển thị các mẩu tin của một bảng, điều này rất đơn giản và ta không cần phải lập trình gì cả. Để sử dụng điều khiển ADO Data, ta cần đánh dấu Microsoft ADO Data Control 6.0 (OLEDB) trong hộp thoại Components. Hình VIII.9 Hộp thoại Components Chọn điều khiển ADO Data từ hộp công cụ đưa vào biểu mẫu, liên kết đến nguồn dữ liệu thông qua hai thuộc tính ConnectionString và RecordSource. ‰ ConnectionString: Xác định nguồn dữ liệu cần nối kết, đó chính là chuỗi nối kết chỉ đến cơ sở dữ liệu mà ta thao tác. ‰ RecordSource: Xác định xem nối kết của ta đang thao tác trên bảng nào. Ví dụ: Tạo một nối kết đến cơ sở dữ liệu "C:\Program Files\Microsoft Visual Studio\VB98 \Biblio.mdb". ‰ Chọn Use Connection String, ấn Build. ‰ Chọn Microsoft Jet 4.0 OLE DB Provider. ‰ Chọn cơ sở dữ liệu như ví dụ. ‰ Ấn OK. ‰ Quay về cửa sổ Property Pages, chọn Tab RecordSource, xác định các tùy chọn như hình vẽ. ‰ Ấn Close. Trang 101
  43. Visual Basic Sau khi đã xác định được nối kết, ta vẫn không thấy được sự hoạt động của điều khiển dữ liệu, nguyên nhân do chúng ta không có điều khiển để hiển thị nội dung, cách giải quyết vấn đề là dùng điều khiển TextBox hiển thị dữ liệu. Để dùng điều khiển Textbox hiển thị dữ liệu, ta xác định hai thuộc tính sau đây của điều khiển: DataSource, DataField. Các thuộc tính này xác định nguồn dữ liệu và tên trường, đối với ví dụ này đó là Adodc1 (tên của ADO Data) và Au_Id. ‰ Thực thi đề án, ta được kết quả sau: Hình VIII.11 Ví dụ dùng ADO Data V.1.2 Cập nhật dữ liệu Thao tác cập nhật dữ liệu cũng khá đơn giản, điều khiển ADO Data sẽ tự động cập nhật lại giá trị của mẩu tin hiện hành mỗi khi ta duyệt qua mẩu tin khác, vì vậy ta cũng không phải làm gì cả. V.1.3 Thêm mới mẩu tin Để có thể thêm mới mẩu tin, ta có hai phương cách như sau: ‰ Thiết lập thuộc tính EOFAction của điều khiển ADO Data là 2-AddNew. Cách này không cần phải lập trình gì cả. Trang 102
  44. Visual Basic Để thêm mới vào một mẩu tin, ta sẽ đi đến cuối mẩu tin, sau đó ấn nút tiếp, ta nhận thấy giá trị của các trường sẽ rỗng để chờ chúng ta nhập mới thông tin vào. Hình VIII.12 Thêm mới mẩu tin dùng ADO Data ‰ Thêm mới mẩu tin bằng 2 phương thức AddNew và Update, các bước tiến hành sẽ như sau: - Thiết kế hai nút lệnh là ADD NEW và UPDATE. - Trong sự kiện Click của hai nút trên lần lượt nhập vào câu lệnh sau: Adodc1.Recordset.AddNew, Adodc1.Recordset.Update với Adodc1 là thuộc tính Name của điều khiển dữ liệu. Hình VIII.13 Sử dụng phương thức AddNew và Update V.1.4 Dùng sự kiện MoveComplete để cập nhật giao diện người sử dụng Ta có thể dùng sự kiện MoveComplete của điều khiển ADO Data để khởi động sửa đổi trong ứng dụng khi người sử dụng di chuyển từ mẩu tin này sang mẩu tin khác. Sự kiện MoveComplete được kích hoạt khi một mẩu tin mới thành mẩu tin hiện hành. Đây là một trong vài sự kiện được kích hoạt khi điều khiển di chuyển từ mẩu tin này sang mẩu tin khác. Các sự kiện khác bao gồm WillChange, được kích hoạt khi điều khiển di chuyển từ mẩu tin này sang mẩu tin khác hay thay đổi một mẩu tin và sự kiện RecordChangeComplete, xảy ra khi một mẩu tin được sửa đổi thành công trong cơ sở dữ liệu như một kết quả của hoạt động trong điều khiển dữ liệu. Trang 103
  45. Visual Basic V.1.5 Xóa mẩu tin Để xóa mẩu tin trong một ứng dụng sử dụng điều khiển dữ liệu, ta dùng phương thức Delete của đối tượng Recordset của điều khiển dữ liệu. Ví dụ: Adodc1.Recordset.Delete V.1.6 Dùng sự kiện WillChangeRecord để đảm bảo dữ liệu hợp lệ Trong lập trình cơ sở dữ liệu, việc đảm bảo rằng dữ liệu nhập vào phù hợp với các quy tắc của một cơ sở dữ liệu người dùng cụ thể là yếu tố quan trọng bậc nhất và mang tính bắt buộc. Đối với điều khiển ADO Data, việc xác định xem dữ liệu có hợp lệ hay không sẽ được viết trong sự kiện WillChangeRecord của điều khiển. Sự kiện này sẽ được kích hoạt khi người dùng thay đổi thông tin của một mẩu tin và di chuyển sang mẩu tin khác hoặc thêm mới mẩu tin. V.2 Kết nối với cơ sở dữ liệu và làm việc với các mẩu tin thông qua điều khiển Data (DAO Data Control) Điều khiển Data hạn chế hơn điều khiển ADO Data vì nó chỉ cho phép chúng ta nối kết đến một số nguồn dữ liệu cụ thể, chẳng hạn như Access, Excel, Foxpro, nhưng Version của các hệ quản trị này cũng là những Version đã lâu đời. Để sử dụng điều khiển này, ta cần xác định các giá trị của các thuộc tính sau: Connect, DatabaseName, RecordSource. - Connect xác định cơ sở dữ liệu của ta là loại gì. - DatabaseName chỉ đến một cơ sở dữ liệu cụ thể. - RecordSource là một bảng dữ liệu trong cơ sở dữ liệu (đối với cơ sở dữ liệu Access). Sau khi đã xác định giá trị của các thuộc tính trên thì việc duyệt qua các mẩu tin cũng tương tự như của điều khiển ADO Data. Thuộc tính EOFAction của điều khiển Data quy định việc chúng ta có thể thêm mới một mẩu tin hay là không (tương tự điều khiển ADO Data). Trang 104
  46. Visual Basic Chương 9: CÁC ĐỐI TƯỢNG TRUY CẬP DỮ LIỆU (DATA ACCESS OBJECTS) Mục tiêu: Chương này giới thiệu về thư viện đối tượng Data Access Objects, cách thức được sử dụng để truy cập cơ sở dữ liệu của các hệ quản trị cơ sở dữ liệu nhỏ như Microsoft Access, Foxpro Học xong chương này, sinh viên phải nắm bắt được các vấn đề sau: - Mô hình cây phân cấp của đối tượng DAO. - Sử dụng thư viện đối tượng DAO để tương tác với cơ sở dữ liệu trong VB. Kiến thức có liên quan: - Các cấu trúc lập trình trong VB. - Câu lệnh truy vấn dữ liệu trong cơ sở dữ liệu. Tài liệu tham khảo: - Microsoft Visual Basic 6.0 & Lập trình cơ sở dữ liệu - Chương 20, trang 571 - Nguyễn Thị Ngọc Mai (chủ biên), Nhà xuất bản Giáo dục - 2000. - Tự học Lập trình cơ sở dữ liệu với Visual Basic 6 trong 21 ngày (T1) – Chương 8, trang 305 - Nguyễn Đình Tê (chủ biên), Nhà xuất bản Giáo dục - 2001. Trang 105
  47. Visual Basic Các ứng dụng Visual Basic có thể thao tác trên cơ sở dữ liệu thông qua DAO (Data Access Objects). Dùng DAO ta có thể thi hành các câu truy vấn để xem, cập nhật, cũng như tạo mới các giá trị cho các mẩu tin của bảng DAO có thể được sử dụng cho các ứng dụng truy cập dữ liệu từ máy cá nhân hoặc các ứng dụng theo kiểu Khách/Chủ (Client/Server). Tuy nhiên, vào thời điểm hiện tại, chúng ta chỉ dùng DAO để thao tác với cơ sở dữ liệu Jet vì dạng ứng dụng Client/Server là thế mạnh của ADO (ActiveX Data Objects). I. Mô hình đối tượng Data Access Objects (DAO) Mô hình đối tượng DAO khá phức tạp với hàng trăm yếu tố với rất nhiều tập hợp chứa khá nhiều đối tượng, mỗi đối tượng lại có các thuộc tính, phương thức và các đối tượng con của riêng nó. Sau đây là mô hình cây phân cấp của đối tượng DAO: Trong lập trình DAO, có một tập hợp cốt lõi các kỹ thuật thông dụng được sử dụng gần như mọi chương trình. Chúng bao gồm: o Thi hành câu truy vấn SELECT để lấy về dữ liệu từ cơ sở dữ liệu. o Duyệt qua từng mẩu tin trong một Recordset. o Thi hành câu truy vấn hành động (Update, Delete, Insert). o Sửa đổi cấu trúc cơ sở dữ liệu. Trang 106
  48. Visual Basic o Xử lý lỗi phát sinh bởi truy cập cơ sở dữ liệu. II. Sử dụng DAO để làm việc với cơ sở dữ liệu Để sử dụng đối tượng DAO, ta cần tham chiếu đến đối tượng này bằng cách chọn Project -> References, sau đó đánh dấu chọn Microsoft DAO 3.51 Object Library. Nhấn OK và ta đã có thể sử dụng các đối tượng do DAO cung cấp. II.1 Đối tượng Database Đối tượng Database là nơi bắt đầu việc truy cập đến cơ sở dữ liệu, hay nói cách khác để có thể kết nối và thao tác với cơ sở dữ liệu thông qua DAO thì cần thông qua đối tượng đầu tiên đó là đối tượng Database. Trước tiên ta khai báo một đối tượng Database như sau: Dim db As Database Đối tượng Database có rất nhiều phương thức, ta sẽ chỉ xét qua những phương thức cơ bản và quan trọng nhất cho phép ta thao tác với cơ sở dữ liệu. II.1.1 Sử dụng phương thức OpenDatabase để tạo một đối tượng Database Ta dùng phương thức OpenDatabase để cho phép một đối tượng Database tham khảo đến một cơ sở dữ liệu cụ thể, đối số bắt buộc của phương thức là một chuỗi, kết quả trả về là một đối tượng Database, vì vậy trước khi sử dụng phương thức này, ta cần khai báo một đối tượng Database. Chẳng hạn như: Dim db As Database Set db = OpenDatabase(" \ \baigiang.mdb") Cú pháp đầy đủ của phương thức OpenDatabase: Set database = OpenDatabase (dbname, options, read-only, connect) Ý nghĩa các tham số của phương thức OpenDatabase như sau: Thành phần Ý nghĩa database Biến kiểu đối tượng Database mà ta muốn sử dụng. dbname Chuỗi xác định sự tồn tại của cơ sở dữ liệu Jet hoặc là tên nguồn dữ liệu (DSN) dạng ODBC data source. options Biến mang giá trị xác định tùy chọn loại cơ sở dữ liệu. read-only Mang giá trị kiểu Boolean, TRUE nếu như mở cơ sở dữ liệu dạng chỉ đọc, ngược lại cho kiểu truy xuất đọc và ghi. connect Kiểu chuỗi, xác định kiểu nối kết bao gồm cả mật khẩu. Các giá trị của tùy chọn Options Giá trị Ý nghĩa dbDriverNoPrompt Trình quản lý ODBC dùng chuỗi nối kết cung cấp tên cơ sở dữ liệu và nối kết. Nếu Trang 107
  49. Visual Basic ta không cung cấp thông tin cụ thể, sẽ xảy ra lỗi tại thời điểm thực thi. dbDriverPrompt Trình quản lý ODBC hiển thị hộp thoại các nguồn dữ liệu ODBC. Chuỗi kết nối sẽ được tạo từ nguồn dữ liệu do người dùng chọn thông qua hộp thoại, nếu không nguồn dữ liệu mặc định sẽ được sử dụng. dbDriverComplete Nếu nối kết và tên nguồn dữ liệu xác định đầy đủ các thông tin cần thiết cho một nối kết thì trình quản lý ODBC sẽ dùng chuỗi trong nối kết nếu không sẽ như trường hợp sử dụng dbDriverPrompt. II.1.2 Sử dụng phương thức Execute để thi hành câu truy vấn hành động Ta sử dụng phương thức Excute của đối tượng Database để thi hành một câu lệnh SQL trên cơ sở dữ liệu. tuy vậy phương thức này không nên dùng cho mọi trường hợp. ta chỉ nên dùng phương thức Excute để thi hành các lệnh SQL cho các mục đích sau: o Cập nhật, xóa hay sao chép mẩu tin (trong Access/Jet, ta gọi là các truy vấn hành động). o Sửa cấu trúc cơ sở dữ liệu (được biết như là các lệnh DDL – Ngôn ngữ định nghĩa dữ liệu, Data Definition Language). Các câu truy vấn SELECT theo quy ước (lấy về các mẩu tin) được thi hành nhờ phương thức OpenRecordset của đối tượng Database. Cú pháp: Object.Execute Source - Object: đối tượng Database. - Source: câu SQL kiểu biến chuỗi. Ví dụ: Tăng giá bán mỗi sản phẩm của bảng Products của CSDL Northwind.MDB lên 10%. Dim db As Database Private Sub Form_Load() Set db = OpenDatabase(“Northwind.mdb”) End Sub Private Sub cmdExcute_Click() db.Excute “UPDATE Products ” & _ “SET [Unit Price] = [Unit Price] * 1.1” End Sub II.2 Đối tượng Recordset Đối tượng Recordset xác định một tập hợp các mẩu tin từ một bảng cơ sở hoặc kết quả của một câu lệnh truy vấn nào đó. Tại một thời điểm bất kỳ, đối tượng Trang 108
  50. Visual Basic Recordset chỉ tham khảo đến một mẩu tin đơn, đó là mẩu tin hiện hành. Để sử dụng đối tượng Recordset, ta dùng phương thức Open Recordset. Cú pháp thông dụng của OpenRecordset như sau: Set recordset = object.OpenRecordset source [, Type][, Options][, LockEdits] Trong đó phương thức OpenRecordset trả về đối tượng Recordset và object là biến đối tượng kiểu Database, tham số Source ở đây sẽ là một câu lệnh truy vấn (SELECT). Đối tượng Recordset có nhiều loại (Type) khác nhau, sau đây là bảng phân tích công dụng cũng như ưu, nhược điểm của từng kiểu Recordset. Kiểu Ưu điểm Nhược điểm Dynamic Cập nhật được, kết quả trả về Kém hiệu quả hơn so với kiểu (dbOpenDynamic) có thể thuộc nhiều bảng khác Dynaset nhau thông qua nối kết bảng. Một ưu điểm nổi trội đó là đối với cơ sở dữ liệu nhiều người sử dụng, nó có được khả năng tự cập nhật khi các người dùng khác cập nhật mẩu tin chứa trong đó. Dynaset Các chức năng tương tự như Tìm kiếm không thật sự hiệu (dbOpenDynaset) Dynamic, nhưng đạt được quả do không có các chỉ mục. hiệu quả hơn do không thao tác trên dữ liệu thực sự mà là sự tham chiếu đến dữ liệu. Forward-Only Có thể lấy về mẩu tin từ Ta chỉ có thể di chuyển đến (dbOpenForwardOnly) nhiều bảng thông qua nối kết phía trước. bảng. Đặc biệt hiệu quả đối với các Recordset nhỏ. Snapshot Tương tự như Forward-Only Không cập nhật được với dữ (dbOpenSnapshot) liệu Jet. Trả về một bảng sao đến dữ liệu, nên thao tác chậm hơn rất nhiều so với Dynaset. Table Có thể định vị và lấy về các Không thể thực hiện một câu (dbOpenTable) mẩu tin một cách nhanh truy vấn liên quan đến nhiều chóng vì các bảng được lập bảng. chỉ mục. Lưu ý: 9 Nếu ta mở một Recordset với bộ máy CSDL Microsoft Jet và ta không xác định tham số type của OpenRecordset thì dbOpenTable là mặc định (nếu có thể). 9 Với một Recordset xác định một câu truy vấn, dbOpenDynaset là mặc định. 9 Với cách truy cập CSDL theo ODBC, dbOpenForwardOnly là mặc định. Một số giá trị của tham số Option, một hằng số có thể được kết hợp bởi nhiều giá trị khác nhau, xác định đặc tính của Recordset. Trang 109
  51. Visual Basic Hằng số Ý nghĩa dbAppendOnly Cho phép người dùng thêm mẩu tin mới vào Recordset, nhưng không được sửa đổi hay xóa các mẩu tin có sẵn (chỉ với dynaset-Recordset của JET). dbSQLPassThrough Cho phép tham khảo đến các câu SQL của bộ máy CSDL JET khi khi nó được nối với một nguồn dữ liệu ODBC (chỉ với snapshot-Recordset của JET). dbSeeChanges Một lỗi thực thi sẽ xuất hiện khi một người dùng thay đổi dữ liệu mà người khác đang thao tác (chỉ với dynaset-Recordset của JET). Điều này thật sự có ích cho ứng dụng đa người dùng cần đồng bộ hóa dữ liệu. dbDenyWrite Ngăn cản người dùng khác sửa đổi hay thêm mẩu tin. dbDenyRead Ngăn cản người dùng khác đọc dữ liệu từ một bảng (chi với Table-Recordset của JET). dbForwardOnly Một Recordset chỉ cho phép di chuyển tới (snapshot-Recordset của JET). dbReadOnly Không cho người dùng thay đổi dữ liệu. dbRunAsync Thực thi một câu truy vấn không đồng bộ (truy cập dữ liệu theo ODBC). dbExecDirect Thực thi câu truy vấn bỏ qua phương thức SQLPrepare và trực tiếp gọi phương thức SQLExecDirect (truy cập dữ liệu ODBC trong môi trường đa người dùng). Lưu ý: Ta không thể sử dụng tham số lockedits khi options là dbReadOnly. Một số các giá trị của tham số lockedits: Trang 110
  52. Visual Basic Hằng số Ý nghĩa dbReadOnly Ngăn cản người dùng sửa đổi dữ liệu (mặc nhiên đối với cách truy cập dữ liệu theo ODBC). Ta có thể sử dụng hằng số này ở tham số Options hay LockEdits đều được, nhưng không thể cùng một lúc (lỗi thực thi xảy ra). dbPessimistic Khóa trang bi quan trong môi trường đa người dùng. Trang chứa mẩu tin đang sửa đổi sẽ bị khóa lại khi phương thức Edit được thực thi (mặc định đối với JET). dbOptimistic Khóa trang lạc quan trong môi trường đa người dùng. Trang chứa mẩu tin đang sửa đổi sẽ không bị khóa cho tới khi phương thức Update được gọi thực thi. dbOptimisticValue Khóa trang lạc quan đồng thời dựa vào giá trị của một dòng cụ thể (chỉ đối với cách truy cập dữ liệu theo ODBC). dbOptimisticBatch Cho phép cập nhật theo lô (chỉ đối với cách truy cập dữ liệu theo ODBC). Lưu ý: Xét ví dụ sau: Dim db As Database Dim rs As Recordset Set db = OpenDataBase (" \ \baigiang.mdb") Set rs = db.OpenRecordset ("Select * From Canbo " & _ "Order by hotencb = "Truong"") - Như vậy câu lệnh cuối cùng trong ví dụ trên sẽ sai ở chỗ là VB không xác định được đâu là dấu trích dẫn của chuỗi và đâu là dấu trích dẫn hết câu lệnh truy vấn. Cách khắc phục là đổi dấu trích dẫn chuỗi thành dấu nháy đơn. - Một điểm cần chú ý khác là khi viết một câu truy vấn trên nhiều dòng thì cần có ký tự nối dòng _ cuối mỗi dòng. - Nếu giá trị của tham số trong câu truy vấn không phải là cứng nhắc, tức ta lấy giá trị từ một biến thì ta theo nguyên tắc sau: Set rs = db.OpenRecordset ("Select * From Canbo " & _ "Order by hotencb = ‘"& name & "’") II.3 Đối tượng Field Đối tượng Field giúp chúng ta truy xuất giá trị của một trường trong Recordset. Giá trị của trường sẽ truy xuất qua thuộc tính Value của đối tượng Field, tuy nhiên thuộc tính Value là thuộc tính mặc định của Field, nên ta không cần tham khảo tường minh đến thuộc tính này. Trang 111
  53. Visual Basic Như vậy để truy xuất giá trị của một trường trong 1 Recordset cụ thể, ta có thể dùng một trong các cách sau: - Fields(Num): Num là số thứ tự của trường trong Recordset (bắt đầu tính từ 0) - Fields("name"): Với name là tên trường - Fields![name]: Với name là tên trường. II.4 Các phương thức duyệt qua đối tượng Recordset Sau khi nhận về một đối tượng Recordset, ta cần có những cách thức để duyệt qua các mẩu tin phục vụ cho một công việc cụ thể nào đó. Ta có một số phương thức duyệt Recordset như sau: Phương thức Ý nghĩa MoveFirst Di chuyển đến mẩu tin đầu tiên trong Recordset MoveNext Di chuyển đến mẩu tin kế tiếp trong Recordset MovePrevious Di chuyển đến mẩu tin liền trước trong Recordset MoveLast Di chuyển đến mẩu tin cuối trong Recordset Move N Di chuyển đi N mẩu tin được chỉ định trong Recordset Cũng như đã nêu ở trên, có nhiều loại kiểu Recordset, tùy vào từng kiểu mà chúng ta chỉ có thể duyệt tới mà không thể đi lui, khi đó các phương thức như MoveFirst, MovePrevious sẽ gây ra lỗi. Để biết được rằng chúng ta đang di chuyển trong phạm vi các mẩu tin của Recordset, ta sử dụng hai thuộc tính sau đây để xác định điều đó: - BOF: Trả về TRUE nếu ta di chuyển đến trước mẩu tin đầu tiên của Recordset. - EOF: Trả về TRUE nếu ta di chuyển đến sau mẩu tin cuối cùng của Recordset. Hơn thế nữa, ta có thể dùng hai thuộc tính này để kiểm tra một Recordset có rỗng hay không, một Recordset rỗng khi tại một thời điểm bất kỳ cả hai thuộc tính EOF và BOF đều có giá trị là TRUE. Để xác định số mẩu tin có trong một Recordset, ta dùng thuộc tính RecordCount. Nhưng chú ý rằng ta cần di chuyển đến mẩu tin cuối cùng trước khi sử dụng thuộc tính RecordCount thì kết quả trả về mới chính xác. Tại sao lại như vậy? Bởi vì câu lệnh truy vấn được xử lý thông qua hai giai đoạn, trả về số lượng đủ mẩu tin cho xử lý và xử lý bên dưới câu lệnh truy vấn trên một số lượng đúng dữ liệu kết quả, và ta không thể điều khiển được hai quá trình này. Để cập nhật giá trị của 1 mẩu tin ta làm theo các bước như sau: - Dùng các phương thức duyệt mẩu tin để đi đến mẩu tin cần thay đổi giá trị. - Thi hành phương thức Edit. - Dùng thuộc tính Fields để gán trị cho trường trong mẩu tin, chẳng hạn: rs.Fields("hotencb") = “Truong Quoc Dinh” Trang 112
  54. Visual Basic - Lưu lại sự thay đổi bằng cách thi hành phương thức Update. Để thêm mới một mẩu tin ta làm theo các bước: - Thi hành phương thức AddNew, VB sẽ thêm mới một mẩu tin trắng. - Sử dụng các cách thức gán trị để cập nhật giá trị cho mẩu tin mới thêm vào. - Thi hành phương thức Update. Sau khi đã hoàn thành công việc chúng ta cần thi hành phương thức Close để đóng một đối tượng Recordset. Điều này thật sự có ý nghĩa khi Recordset hiện hành đang khóa dữ liệu, phương thức Close sẽ mở khóa và các người dùng khác có thể thao tác trên dữ liệu. II.5 Tìm kiếm dữ liệu trong Recordset và Table (bảng) Đôi khi đối với một số công việc nào đó, ta cần tìm kiếm một mẩu tin cụ thể trong một tập các mẩu tin của Recordset, có nhiều phương thức tìm kiếm mẩu tin, tùy vào nội dung công việc mà ta áp dụng phương thức nào cho hiệu quả. Ta có các phương thức tìm kiếm trên Recordset như sau: FindFirst|FindLast|FindNext|FindPrevious Cú pháp của phương thức Find: recordset.{FindFirst | FindLast | FindNext | FindPrevious} criteria Thành phần Ý nghĩa recordset Một biến đối tượng Recordset kiểu dynaset hoặc snapshot. criteria Chuỗi dùng để xác định mẩu tin, giống như mệnh đề WHERE trong câu lệnh SQL nhưng không có từ khóa WHERE. Phương thức Bắt đầu từ Hướng tìm kiếm FindFirst Mẩu tin đầu tiên Đến cuối Recordset FindLast Mẩu tin cuối cùng Đến đầu Recordset FindNext Mẩu tin hiện hành Đến cuối Recordset FindPrevious Mẩu tin hiện hành Đến đầu Recordset Các phương thức tìm kiếm này sẽ không làm nảy sinh một Recordset, nó chỉ di chuyển đến mẩu tin hợp điều kiện và mẩu tin đó trở thành mẩu tin hiện hành, nếu không tìm thấy, mẩu tin hiện hành không thay đổi, khi này thuộc tính NoMacth có giá trị là TRUE. Ngoài ra đối tượng Recordset còn cung cấp phương thức Seek giúp ta tìm kiếm trên một Recordset kiểu bảng có chỉ mục, cú pháp như sau: recordset.Seek comparison, key1, key2 key13 Trang 113
  55. Visual Basic Thành phần Ý nghĩa recordset Một biến đối tượng Recordset kiểu bảng đã định nghĩa chỉ mục thông qua thuộc tính Index. comparison Một trong các biểu thức so sánh sau =, or >. key1, key2 key13 Một hoặc nhiều giá trị tương ứng với trường chỉ mục hiện hành, ta có thể dùng tối đa đến 13 giá trị. III. Sử dụng điều khiển DAO Data Hiện tại mặc dù việc liên kết với cơ sở dữ liệu đều có thể thực hiện thông qua điều khiển ADO Data với nhiều tính năng mạnh hơn, tuy nhiên ta cũng có thể dùng điều khiển DAO Data để tham khảo đến cơ sở dữ liệu Jet cũng như một số loại cơ sở dữ liệu khác như DBASE, văn bản, bảng tính Excel mà chúng ta không cần dùng ODBC. Điều khiển này chính là điều khiển Data mà ta đã xét ở chương 8. Tuy nhiên khi sử dụng điều khiển này thì ta cần chú ý đến thuộc tính Connect, đây là thuộc tính quy định loại dữ liệu sẽ kết nối. Một số kiểu cơ sở dữ liệu được hỗ trợ bởi điều khiển DAO Data: - Microsoft Access. - DBASE III, IV và 5.0. - Phiên bản Excel 3.0, 4.0, 5.0 và 8.0. - Phiên bản FoxPro 2.0,2.5 2.6 và 3.0. - Lotus spreadsheet với định dạng WK1, WK3 và WK4. - Phiên bản Paradox 3.x, 4.x và 5.x. - Tập tin văn bản ASCII có phân cách. Trang 114
  56. Visual Basic Chương 10 : ODBC VÀ CÁC ĐỐI TƯỢNG DỮ LIỆU TỪ XA (REMOTE DATA OBJECTS) Mục tiêu: Chương này giới thiệu về thư viện đối tượng Remote Data Objects, cách thức được sử dụng để truy cập các đối tượng dữ liệu từ xa. Học xong chương này, sinh viên phải nắm bắt được các vấn đề sau: - Khái niệm Open Database Connectivity (ODBC). - Sử dụng điều khiển dữ liệu từ xa (Remote Data Control) để truy cập dữ liệu. - Cây phân cấp của mô hình đối tượng RDO. - Sử dụng thư viện đối tượng RDO để tương tác với cơ sở dữ liệu trong VB. Kiến thức có liên quan: - Các cấu trúc lập trình trong VB. - Câu lệnh truy vấn dữ liệu trong cơ sở dữ liệu. - Nắm bắt được các mô hình DAO là một lợi thế vì lúc đó việc tiếp thu mô hình ADO được nhanh hơn. Tài liệu tham khảo: - Microsoft Visual Basic 6.0 & Lập trình cơ sở dữ liệu – Chương 23, trang 735 - Nguyễn Thị Ngọc Mai (chủ biên), Nhà xuất bản Giáo dục - 2000. - Tự học Lập trình cơ sở dữ liệu với Visual Basic 6 trong 21 ngày (T2) – Chương 17, trang 227 - Nguyễn Đình Tê (chủ biên), Nhà xuất bản Giáo dục - 2001. Trang 115
  57. Visual Basic I. Open Database Connectivity (ODBC) 1. Khái niệm ODBC là công nghệ Windows cho phép ứng dụng Client nối với cơ sở dữ liệu từ xa. Nằm trên máy Client, ODBC làm cho nguồn dữ liệu quan hệ trở nên trong suốt đối với ứng dụng Client. Vì thế ứng dụng Client không cần quan tâm đến kiểu cơ sở dữ liệu là gì. ODBC gồm 3 phần: - Trình quản lý điều khiển (driver manager). - Một hay nhiều trình điều khiển (driver). - Một hay nhiều nguồn dữ liệu (data source). 2. Kiến trúc Kiến trúc ODBC chứa kết nối giữa ứng dụng Client và cơ sở dữ liệu Server thông qua trình quản lý điều khiển ODBC. Ứ ng dụng Nguồn dữ Trình quản lý điều Trình điều Client liệu ODBC khiển ODBC khiển ODBC DB Hình 10.1: Kiến trúc ODBC trình bày kết nối giữa ứng dụng Client và CSDL Server thông qua trình quản lý điều khiển ODBC 3. Tạo nguồn dữ liệu ODBC Để một ứng dụng Client nối với cơ sở dữ liệu Client/Server dùng ODBC; trước hết, ta phải cung cấp thông tin về nguồn dữ liệu ODBC trên Client. Mỗi Server yêu cầu những gói thông tin khác nhau để nối với Client. ODBC cung cấp cho thông tin này một tên đơn giản để ta có thể tham chiếu đến nó, thay vì phải thiết lập gói thông tin từ đầu mỗi lần ta cần đến nó. Ứng dụng Client có thể tham chiếu một cách dễ dàng đến tổ hợp của một điều khiển, một cơ sở dữ liệu và có thể thêm một người sử dụng và mật khẩu. Tên này chính là tên nguồn dữ liệu hay Data Source Name (DSN). Để tạo một tên nguồn dữ liệu ODBC trên máy Client, ta làm như sau: o Mở Control Panel. o Chọn Administrative Tools\Data Source (ODBC), hộp thoại quản trị nguồn dữ liệu xuất hiện: Trang 116
  58. Visual Basic Hình 10.2: Hộp thoại quản trị nguồn dữ liệu ODBC o Ta có thể tạo một trong ba kiểu nguồn dữ liệu ODBC: 9 User DSN: chỉ có người dùng tạo ra nó mới có thể sử dụng (trên máy đang dùng). 9 System DSN: bất kỳ ai sử dụng máy này đều có thể dùng được. Đây cũng là kiểu nguồn dữ liệu mà ta cần tạo khi cài đặt ứng dụng cơ sở dữ liệu Web. 9 File DSN: có thể được copy và sử dụng bởi máy khác. o Khi hộp thoại ODBC đã mở ra, chọn lớp UserDSN (hay System DSN), Tạo một kết nối mới, nhấn nút Add, màn hình sẽ hiện ra như sau: Hình 10.3: Lựa chọn loại cơ sở dữ liệu cần thiết để tạo kết nối Trang 117
  59. Visual Basic o Chọn loại CSDL mà ta muốn thao tác (Access, Foxpro, SQL Server, ), nhấn Finish. Sau khi nhấn Finish, một màn hình sẽ hiện ra cho phép ta nhập vào Data Source Name, đây là tên của kết nối CSDL. Tên của kết nối không cần phải giống với tên của cơ sở dữ liệu. Phần Description dùng để gõ các thông tin mô tả về kết nối. Ngoài ra ta còn phải chọn đường dẫn đến tập tin CSDL tương ứng. 4. Truy cập nguồn dữ liệu với điều khiển DAO Data và ODBC Direct DAO tự động nạp bộ máy cơ sở dữ liệu Jet mỗi khi nó truy cập dữ liệu Client/Server, thậm chí khi ta không thực sự sử dụng cơ sở dữ liêu Jet/Access. Ngoài ra ta còn có thêm tùy chọn sử dụng ODBCDIRECT để truy cập dữ liệu Client/Server. Đây là một chuyển đổi để truy cập cơ sở dữ liệu server trực tiếp thông qua DAO mà không cần nạp bộ máy cơ sở dữ liệu Jet. Tùy chọn này thích hợp khi ta phải dùng DAO để truy cập dữ liệu Client/Server mà không cần bận tâm về tính linh hoạt, khả năng sử dụng lại và tính dễ bảo trì của chương trình. Ví dụ: Tạo một Form có sử dụng ODBCDirect và DAO Data Control. o Tạo dự án mới. o Tham chiếu đến điều khiển lưới Microsoft Data Bound Grid Control trong mục Project\Components. o Tạo Form có dạng sau: 1 2 Hình 10.4: Ví dụ về ODBC Direct 1: DBGrid. Name: dbGrid1. 2: Data Control. Name: Data1. o Đổi thuộc tính DefaultType của DataControl là 1 – Use ODBC. Điều này làm cho chương trình thực hiên nhanh hơn. o Thuộc tính Connect của Data1 là: ODBC;DSN=DBHH o Đặt thuộc tính Record Source của Data Control: Select * From THANGHOA Đặt thuộc tính Data Source của DBGrid1 là: Data1. Lưu dự án và thực thi chương trình. Trang 118
  60. Visual Basic II. Truy cập dữ liệu dùng điều khiển dữ liệu từ xa Điều khiển dữ liệu từ xa (Remote Data Control - RDC) là một cách khác truy cập dữ liệu từ xa trong các ứng dụng Visual Basic. Điều khiển này dùng một giao diện lập trình tương tự như điều khiển ADO Data hay DAO Data. Ví dụ: Sử dụng RDC để hiển thị dữ liệu trên lưới: o Ở đây ta có sử dụng Remote Data Control và lưới hiển thị dữ liệu, do đó ta tham chiếu đến các thành phần này bằng cách chọn Project\Components , thiết lập tham chiếu đến Microsoft Remote Data Control và Microsoft Data Bound Grid Control. Nhấp OK. o Thiết kế Form có dạng sau: 1 1 Hình 10.5: Ví dụ về Remote Data Control 1: RemoteDataControl. Name: rdcHangHoa 2: DBGrid. Name: dbgHangHoa. o Đặt thuộc tính DataSourceName của điều khiển rdcHangHoa là DBHH (DSN đã tạo trước đây). o Định thuộc tính SQL của điều khiển rdcHangHoa là: Select * From THANGHOA o Chỉ định thuộc tính DataSource của điều khiển dbgHangHoa là rdcHangHoa. o Thực thi chương trình. III. Remote Data Object (RDO) Đối tượng dữ liệu từ xa (Remote Data Objects - RDO) được mô tả dạng hình cây tương tự như DAO. Tuy nhiên mô hình đối tượng RDO đơn giản hơn DAO. Trang 119
  61. Visual Basic Dù vậy ta không thể dùng RDO để tạo đối tượng cơ sở dữ liệu như bảng, view, thủ tục chứa sẵn Để tham chiếu đến RDO ta vào Project\References \Microsoft Remote Data Object 2.0. Mô hình đối tượng RDO: Hình 10.6: Kiến trúc của RDO III.1 Đối tượng RDOEngine Đây là đối tượng ở cấp cao nhất trong mô hình RDO, giới thiệu về các thành phần của mô hình. Ta không cần phải khởi tạo đối tượng này cách tường minh bởi vì nó được khởi tạo tự động. Đối tượng rdoEngine cho phép ta truy cập toàn bộ các đối tượng khác trong mô hình RDO. Ngoài ra, nó còn được sử dụng để tạo mới một Data Source Name (DSN) nhờ vào phương thức rdoRegisterDataSource. Đoạn mã lệnh dưới đây cho phép đăng ký một nguồn dữ liệu mới cho cơ sở dữ liệu Pubs (của SQL Server): Dim strTemp As String strTemp = “Description=Test DSN” & Chr(13) & _ “SERVER=(local)” & Chr(13) & “Database=Pubs” rdoEngine.rdoRegisterDataSource “MyTestPubs”, “SQL Server”, _ True, strTemp III.2 Đối tượng RDOError Đối tượng lỗi xác định thao tác nào trên một nguồn dữ liệu gây ra lỗi. Đây không phải là các lỗi của Visual Basic vì nó xảy ra đối với cơ sở dữ liệu. Vì thế, ta Trang 120
  62. Visual Basic không cần phải bẫy lỗi cho các lỗi này. Thay vào đó, tập hợp rdoErrors sẽ xác định thao tác của ta là thành công hay thất bại. Chẳng hạn như đoạn mã lệnh sau: Dim objError As RDO.rdoError Dim strError As String For Each objError In rdoEngine.rdoErrors strError = strError & objError.Description & vbCrLf Next ' Display Errors MsgBox "The following errors occurred: " & strError III.3 Đối tượng RDOEnvironment Đối tượng này chỉ ra cách thức bảo mật của cơ sở dữ liệu. Ta sử dụng đối tượng này để xác định định danh người dùng cùng mật khẩu hay thi hành một phiên giao dịch (Transation) trên cơ sở dữ liệu. Đối tượng này không được khởi tạo trực tiếp, chúng được tạo ra tự động. III.4 Đối tượng RDOConnection Phần lớn các chức năng của RDO bắt đầu với đối tượng rdoConnection; đối tượng này cho phép thiết lập một nối kết đến một nguồn dữ liệu ODBC. Khi nguồn dữ liệu đã được định nghĩa, các thuộc tính cùng các phương thức của đối tượng này được sử dụng để giao tiếp với nguồn dữ liệu ấy. Đoạn mã lệnh đơn giản dưới đây cho phép tạo một nối kết đến nguồn dữ liệu có tên là Biblio. Set m_Connection = New RDO.rdoConnection m_Connection.Connect = “DSN=Biblio” m_Connection.EstablishConnection III.4.1 Đối tượng RDOQuery Đối tượng này được sử dụng để thực thi các câu truy vấn trên nguồn dữ liệu ODBC. Các câu truy vấn này có thể là các câu SQL hay là lời gọi thực thi các thủ tục lưu trữ sẵn trong cơ sở dữ liệu. Nếu là lời gọi các thủ tục lưu trữ sẵn thì tham số của các thủ tục này được xác định nhờ đối tượng rdoParameter. Hai yếu tố then chốt để xác định một đối tượng rdoQuery là nối kết nào cần truy vấn và câu lệnh SQL để truy vấn dữ liệu. Ví dụ: Giả sử ta có đoạn mã lệnh bên trên để tạo nối kết đến nguồn dữ liệu Biblio. Đoạn mã lệnh dưới đây thực thi câu lệnh SQL lấy về thông tin về tất cả các nhà xuất bản: ‘ Tạo câu SQL Dim strSQL As String strSQL = “SELECT * FROM Publishers” ‘ Tạo đối tượng Query Dim m_Query As RDO.rdoQuery Set m_Query = New RDO.rdoQuery Set m_Query.ActiveConnection = m_Connection Trang 121
  63. Visual Basic m_Query.SQL = strSQL m_Query.Excute III.4.2 Đối tượng RDOResultset Đối tượng này quản lý các mẩu tin được trả về từ một nối kết qua ODBC. Tập các mẩu tin có thể được trả về thông qua đối tượng rdoQuery hay nhờ phương thức OpenResultset của một đối tượng rdoConnection. Trong một số trường hợp, tập các mẩu tin được truy xuất nhờ vào thuộc tính LastQueryResults của đối tượng rdoConnection: Set m_Resultset = m_Connection.LastQueryResults Khi đối tượng rdoResultset được tạo ra, ta có thể di chuyển đến mẩu tin xác định bằng các phương thức MoveFirst, MoveLast, MoveNext, MovePrevious. III.4.3 Đối tượng RDOTable Đối tượng này xác định một bảng trong một nguồn dữ liệu ODBC. Đối tượng này không được sử dụng cho các thao tác truy xuất dữ liệu mà nó chỉ được sử dụng khi ta cần xác định cấu trúc các bảng của cơ sở dữ liệu của ta. III.4.4 Đối tượng RDOParameter Đối tượng này xác định các tham số đầu vào hay các kết quả nhận được từ các thủ tục lưu trữ sẵn trong cơ sở dữ liệu. III.5 Sử dụng RDO trong chương trình III.5.1 Thiết lập kết nối đến nguồn dữ liệu o Trước tiên ta phải tham chiếu đến mô hình đối tượng RDO. o Nối kết đến nguồn dữ liệu nhờ đối tượng rdoConnection. - Khai báo một biến đối tượng rdoConnection. - Khởi tao đối tượng, sau đó thiết lập các thuộc tính và các phương thức thích hợp để hoàn tất kết nối; trong đó có hai thuộc tính cần quan tâm là chuỗi kết nối (ConnectionString) và loại con trỏ (Cursor Driver). o Thiết lập nối kết nhờ phương thức EstablishConnection của đối tượng rdoConnection. III.5.2 Chuỗi kết nối (ODBC Connect String) Chuỗi kết nối được sử dụng khi thiết lập nối kết đến nguồn dữ liệu. Đây là một chuỗi (String) xác định các thông tin quan trọng gởi đến trình điều khiển ODBC để truy cập dữ liệu. Các thông tin cần quan tâm: tên nguồn dữ liệu (DSN Name), User ID, Password. Các tham số của chuỗi kết nối ODBC: Tham số Ý nghĩa DSN Tên nguồn dữ liệu ODBC UID Tên người dùng cơ sở dữ liệu PWD Mật khẩu truy cập DRIVER Trình điều khiển DBC Trang 122
  64. Visual Basic DATABASE Tên của cơ sở dữ liệu được nối kết SERVER Tên máy chứa cơ sở dữ liệu phục vụ (database server) WSID Tên máy chứa cơ sở dữ liệu khách (database client) APP Tên của tập tin chương trình (*.exe) Chuỗi kết nối được xác lập nhờ thuộc tính Connect của đối tượng rdoConnection. Ví dụ: Chuỗi nối kết đến 1 DSN của cơ sở dữ liệu Access Biblio: Set m_Connection = New RDO.rdoConnection m_Connection.Connect = "DSN=Biblo" m_Connection.EstablishConnection Chuỗi nối kết đến DSN Publications của cơ sở dữ liệu SQL Server: Set m_Connection = New RDO.rdoConnection m_Connection.Connect = "DSN=Biblo;UID=sa;PWD=;" m_Connection.EstablishConnection Bên cạnh nối kết chuẩn thông qua ODBC, RDO cũng hỗ trợ loại nối kết DSN cấp thấp (DSN-less connection). Đối với loại này, ta không cần định nghĩa tên nguồn dữ liệu (DSN) trong bộ quản trị ODBC của Windows. Lúc này tất cả các thông tin về cơ sở dữ liệu được cung cấp đầy đủ trong chuỗi nối kết. Ví dụ: Chuỗi nối kết cấp thấp đến cơ sở dữ liệu SQL Server Pubs: Set m_Connection = New RDO.rdoConnection m_Connection.Connect ="DRIVER={SQL Server};” & _ “SERVER=(local);DATABASE=Pubs;UID=admin;PWD=;DSN=;" m_Connection.EstablishConnection III.5.3 Trình điều khiển con trỏ (Cursor Drivers) Trình điều khiển con trỏ xác định cách thức tập các mẩu tin trả về từ cơ sở dữ liệu được lưu trữ như thế nào, có thể chúng được lưu trữ tại máy chủ (server) hay máy trạm (client). Trình điều khiển con trỏ được thiết lập nhờ thuộc tính CursorDriver của đối tượng Connection (trước khi gọi thực thi phương thức EstablishConnection) và các giá trị sau có thể đề cử cho nó: Giá trị Ý nghĩa rdUseIfNeeded Trình điều khiển ODBC tự động xác định loại con trỏ (được lưu phía server hay client). Nếu có thể, con trỏ loại được lưu phía server được đề cử. rdUseODBC Xác định loại con trỏ của ODBC chuẩn, nghĩa là tập tất cả các mẩu tin được lưu ở máy client. rdUseServer Tập các mẩu tin được lưu phia server. Tuy nhiên loại con trỏ này không thích hợp lắm trong môi trường đa người dùng. Trang 123
  65. Visual Basic rdUseClientBatch Giống như rdUseODBC nhưng có thể được cập nhật đồng thời. rdUseNone Không sử dụng con trỏ, tập các mẩu tin được trả về một lần duy nhất lúc chúng được yêu cầu. Ta chỉ có thể di chuyển tới trong tập các mẩu tin kết quả. Trang 124
  66. Visual Basic Chương 11: ĐỐI TƯỢNG DỮ LIỆU ACTIVEX (ACTIVEX DATA OBJECTS) Mục tiêu: Chương này giới thiệu về thư viện ActiveX Data Object (ADO), thư viện đối tượng được sử dụng nhiều nhất trong các ứng dụng truy cập cơ sở dữ liệu dạng khách/chủ (Client/Server) hiện nay. Học xong chương này, sinh viên phải nắm bắt được các vấn đề sau: - Kiến trúc OLEDB/ADO. - Cây phân cấp của mô hình đối tượng ADO. - Sử dụng thư viện đối tượng ADO để tương tác với cơ sở dữ liệu trong VB. Kiến thức có liên quan: - Các cấu trúc lập trình trong VB. - Câu lệnh truy vấn dữ liệu trong cơ sở dữ liệu. - Nắm bắt được các mô hình DAO, RDO là một lợi thế vì lúc đó việc tiếp thu mô hình ADO được nhanh hơn. Tài liệu tham khảo: - Microsoft Visual Basic 6.0 & Lập trình cơ sở dữ liệu - Chương 27, trang 877 - Nguyễn Thị Ngọc Mai (chủ biên) – Nhà xuất bản Giáo dục - 2000. - Tự học Lập trình cơ sở dữ liệu với Visual Basic 6 trong 21 ngày (T2) – Chương 18, trang 277 - Nguyễn Đình Tê (chủ biên) - Nhà xuất bản Giáo dục - 2001. Trang 125
  67. Visual Basic ADO (ActiveX Data Objects) là công nghệ truy cập cơ sở dữ liệu hướng đối tượng tương tự như DAO. Hiện nay, ADO được Microsoft xem kỹ thuật chính để truy cập dữ liệu từ Web Server. I. Kiến trúc OLE DB/ADO ADO sử dụng OLEDB như là trình cung cấp dữ liệu cơ sở. Trình cung cấp OLE DB cho phép người lập trình có thể truy xuất dữ liệu từ cả hai nguồn: quan hệ và phi quan hệ. VB6.0 đã hỗ trợ các trình cung cấp cục bộ cho SQL Server, Oracle và Microsoft Jet/Access. Client Application Remote Data ActiveX Data Objects Objects ODBC Driver OLE DB Data Provider Document ODBC Driver OLE DB Server Manager Email Server Relational Database Hình 11.1: Mô hình lập trình CSDL Client - Server dùng RDO và ADO Ta chỉ cần lập trình với phần giao diện người sử dụng ở phía Client. Việc truy cập cơ sở dữ liệu trên trình duyệt Web hay ứng dụng VB được thực hiện nhờ ADO. Cấu trúc này cho phép ta lập trình một cách nhất quán trên Web cũng như trên ứng dụng. Trang 126
  68. Visual Basic Web Browser MS Internet HTTP Information Server with Active Server Pages Client Application DCOM ActiveX Server ADO OLE DB (DLL or EXE) Database Hình 11.2: Truy cập CSDL từ trình ứng dụng & trình duyệt WEB theo ADO II. Mô hình ADO Mô hình ADO được trình bày theo dạng phân cấp (tương tự DAO và RDO). Để có thể lập trình với thư viện ADO, ta phải tham chiếu đến thư viện này bằng cách chọn Project\References \Microsoft ActiveX Data Object 2.0. Hình 11.3: Mô hình ADO Mô hình ADO có 3 đối tượng cốt lõi: Trang 127
  69. Visual Basic o Connection: kết nối CSDL thật sự. o Command: thực thi các câu truy vấn dựa vào kết nối dữ liệu. o RecordSet: là tập các mẩu tin được chọn từ câu truy vấn thông qua đối tượng Command. III Các đối tượng trong mô hình ADO III.1 Đối tượng Connection Dùng phương thức Open của đối tượng Connection để thiết lập kết nối với nguồn dữ liệu. Để thực hiện điều này ta cần phải thông báo với ADO thông tin kết nối với dạng chuỗi theo kiểu chuỗi kết nối của ODBC. Thuộc tính ConnectionString thực hiện điều này. Ngoài ra ta còn có thể chọn trình cung cấp bằng cách quy định giá trị của thuộc tính Provider của đối tượng. Để nối kết với dữ liệu, ta cần xác định trình cung cấp OLE DB và chuỗi kết nối. Nếu không xác định được hai yếu tố này, ta sẽ sử dụng trình cung cấp mặc định là ODBC: MSDASQL. Một số trình cung cấp có sẵn: 9 Microsoft OLEDB cho các trình điều khiển ODBC. 9 Microsoft OLEDB cho Oracle. 9 Microsoft Jet 3.51 OLEDB (Access). 9 Microsoft Jet 4.0 OLEDB (Access) 9 Microsoft OLEDB cho SQL Server. 9 Microsoft OLEDB cho các dịch vụ thư mục. Ví dụ: Đối với trình cung cấp ODBC, thuộc tính ConnectionString có thể là một DSN hay là một kết nối không có DSN (DSN cấp thấp). Dim cn As ADODB.Connection Set cn = New ADODB.Connection cn.Provider = "MSDASQL" cn.ConnectionString = "DSN=Baigiang" cn.Open Kết nối DSN cấp thấp: Dim cn As ADODB.Connection Set cn = New ADODB.Connection cn.Provider = "MSDASQL" cn.ConnectionString = "DRIVER={SQL Server};” & _ “DATABASE=Baigiang;UID=myuser;PWD=mypassword;" cn.Open Trong trường hợp này việc kết nối với cơ sở dữ liệu Server được thực hiện nhanh hơn vì chương trình không cần đọc thông tin về các DSN trên máy Client, tuy nhiên thông tin về nguồn cơ sở dữ liệu lại kết chặt với chương trình đã biên dịch. Để kết nối với cơ sở dữ liệu Access, ta dùng trình cung cấp Jet với chuỗi kết nối là đường dẫn đến tập tin .mdb Dim cn As ADODB.Connection Set cn = New ADODB.Connection cn.Provider = "MicroSoft.Jet.OLEDB.4.0" cn.ConnectionString = "d:\data\baigiang.mdb" Trang 128
  70. Visual Basic cn.Open Đối với cơ sở dữ liệu SQL Server, ta có thể dùng trình cung cấp SQLOLEDB.1, trong trường hợp này, chuỗi kết nối tương tự như trường hợp kết nối dùng trình cung cấp ODBC không có DSN, tuy nhiên ta không cần xác định giá trị của DRIVER: Dim cn as ADODB.Connection Set cn = New ADODB.Connection cn.Provider = “SQLOLEDB.1” cn.ConnectionString = “DATABASE=DBHH;” & _ “SERVER=www;UID=user;PWD=user” cn.Open Mở và đóng nối kết nguồn dữ liệu Để phát các yêu cầu đến nguồn dữ liệu sử dụng ADO, ta cần mở kết nối đến nguồn dữ liệu đó bằng phương thức Open của đối tượng Connection. Cú pháp đầy đủ như sau: connection.Open [connect], [userid], [password] Tất cả các tham số của phương thức Open đều là tùy chọn, nếu như các thông số này đã được xác định thông qua các thuộc tính khác của đối tượng Connection thì ta không cần mô tả chúng ở đây. Khi đã hoàn thành tất cả các thao tác liên quan đến nối kết này, ta cần phải đóng nối kết một cách tường minh thông qua phương thức Close của đối tượng Connection. connection.Close Đóng nối kết một cách tường minh sẽ đảm bảo rằng tất cả các tài nguyên liên quan đến nối kết này trên Server cũng như Client đều được giải phóng một cách hợp lý. Xác định vị trí con trỏ Con trỏ (Cursor): một tập các mẩu tin được trả về cho chương trình. Vị trí con trỏ được xác định nhờ thuộc tính CursorLocation (có ở cả đối tượng Recordset). Có 2 giá trị có thể chỉ định: 9 adUseClient: con trỏ phía Client. 9 adUseServer: con trỏ phía Server (mặc định). Thực thi các câu truy vấn hành động Các câu truy vấn hành động (Insert, Update, Delete) được thực hiện nhờ phương thức Execute của đối tượng Connection; ngoài ra phương thức này cũng có thể được sử dụng để thực thi các thủ tục lưu trữ sẵn trong cơ sở dữ liệu hay các câu SELECT. Cú pháp phương thức này như sau: Nếu không có kết quả trả về: connection.Execute CommandText, RecordsAffected, Options Có kết quả trả về: Set recordset = connection.Execute (CommandText, RecordsAffected, Options) Trong đó: - connection: Đối tượng Connection. - recordset: Đối tượng Recordset là kết quả trả về của phương thức Execute, tuy nhiên, người ta thường ít khi sử dụng cách này. Thay vào đó, người ta thường sử dụng phương thức Open của đối tượng Recordset. Trang 129
  71. Visual Basic - CommandText: là một chuỗi xác định câu truy vấn hành động, SELECT, thủ tục lưu trữ sẵn hay tên một bảng trong cơ sở dữ liệu. - RecordEffected: Tùy chọn, là một số nguyên dài (Long) xác định trình cung cấp trả về bao nhiêu mẩu tin thỏa điều kiện. - Options: Tùy chọn, là một số nguyên dài (Long) xác định trình cung cấp sẽ đánh giá các đối số của CommandText như thế nào. Thuộc tính Mode: Xác định trình cung cấp có thể hạn chế truy cập đến cơ sở dữ liệu khi có một recordset đang mở. Các giá trị có thể là: Hằng số Giá trị Ý nghĩa Mặc định, chỉ định quyền hạn chưa thiết lập hay adModeUnknown 0 không thể xác định adModeRead 1 Mở Recordset với quyền chỉ đọc adModeWrite 2 Mở Recordset với quyền chỉ ghi adModeReadWrite 3 Mở Recordset với quyền đọc/ghi adModeShareDenyRead 4 Ngăn người khác mở kết nối với quyền chỉ đọc adModeShareDenyWrite 8 Ngăn người khác mở kết nối với quyền chỉ ghi adModeShareExclusive 12 Ngăn người khác mở kết nối Ngăn người khác mở kết nối với bất cứ quyền adModeShareDenyNone 16 nào III.2 Đối tượng Recordset Để có thể khởi tạo một đối tượng Recordset ta có thể thực hiện một trong hai cách: o Phương thức Execute của đối tượng Connection. Tuy nhiên cách này ta chỉ tạo được các Recordset chỉ đọc và chỉ có thể di chuyển tới. o Xác lập các thông số thích hợp cho đối tượng Recordset rồi thực thi phuơng thức Open của đối tượng Recordset. Điều này được thực hiện nhờ các bước: 9 Sau khi khởi tạo đối tượng Connection, chỉ định Recordset là của đối tượng Connection trên. 9 Thiết lập các thuộc tính thích hợp của Recordset (Source, LockType ). 9 Thực thi câu truy vấn nối kết nhờ phương thức Open. III.2.1 Thuộc tính CursorType (loại con trỏ) Xác định loại con trỏ được trả về từ cơ sở dữ liệu. Các giá trị có thể nhận: Hằng Giá trị Mô tả adOpenForwardOnly 0 Chỉ có thể di chuyển phía trước adOpenKeyset 1 Không thể thấy các mẩu tin do người dùng khác thêm vào nhưng khi họ xóa hay sửa đổi mẩu tin sẽ làm ảnh hưởng đến các mẩu tin ta đang làm việc. adOpenDynamic 2 Có thể thấy toàn bộ sự thay đổi do người Trang 130
  72. Visual Basic dùng khác tác động. adOpenStatic 3 Bản sao tĩnh của tập mẩu tin. Mọi sự thay đổi của người dùng khác ta không thấy được III.2.2 Thuộc tính LockType (khóa mẩu tin) Xác định cách thức khóa mẩu tin trong Recordset. Dùng tính năng này khi muốn kiểm soát cách thức cập nhật mẩu tin với nhiều người dùng trong cơ sở dữ liệu. Hằng Mô tả Giá trị adLockReadOnly 1 Mặc định - Chỉ đọc. adLockPessimistic 2 Khóa trang bi quan. Mẩu tin trong RecordSet bị khóa khi bắt đầu sửa đổi & tiếp tục khóa cho đến khi thi hành phương thức Update hay di chuyển sang mẩu tin khác. adLockOptimistic 3 Khóa trang lạc quan. Mẩu tin chỉ bị khóa ngay lúc thi hành phương thức Update hay di chuyển sang mẩu tin khác. adLockBatchOptimistic 4 Khóa trang lạc quan hàng loạt. Hỗ trợ cập nhật nhiều mẩu tin cùng một lúc. III.2.3 Thuộc tính Source Đây là một chuỗi xác định câu truy vấn để lấy dữ liệu, có thể là tên của bảng hay tên của thủ tục lưu trữ sẵn. III.2.4 Thuộc tính ActiveConnection Đây là một thuộc tính đối tượng xác định Recordset là của nối kết nào trong chương trình. III.2.5 Ví dụ sử dụng đối tượng Recordset trong chương trình Đối tượng Recordset có thể được sử dụng là đối tượng nguồn dữ liệu (DataSource) của điều khiển lưới: Microsoft DataGrid Control 6.0 (OLEDB). Nhờ điều khiển lưới này ta có thể hiển thị dữ liệu từ một Recordset theo dạng hàng và cột. Chẳng hạn ta có thể hiển thị trên lưới thông tin về các mặt hàng cùng với mã loại hàng của nó: Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Private Sub Form_Load() Set cn = New ADODB.Connection cn.Provider = "Microsoft.Jet.OLEDB.3.51" cn.ConnectionString = "F:\Data\DBHH.mdb" cn.Open Set rs = New ADODB.Recordset rs.Source = "SELECT MaHang, TenHang, DVTinh” & _ “TenLoai FROM THangHoa, TLoaiHang WHERE “ & _ “THangHoa.MaLoai = TLoaiHang.MaLoai" Set rs.ActiveConnection = cn rs.CursorLocation = adUseClient Trang 131
  73. Visual Basic rs.Open Set grdHH.DataSource = rs End Sub Kết quả thực thi của chương trình này như sau: * Hình 11.4: Sử dụng Datagrid để hiển thị dữ liêu từ Recordset *: Microsoft DataGrid Control 6.0 (OLEDB): Name: grdHH. III.2.6 Cập nhật và thêm mới mẩu tin Thêm mới mẩu tin - Mở Recordset - Thi hành phương thức AddNew - Gán giá trị cho các trường trong mẩu tin của Recordset - Lưu lại mẩu tin bằng cách thi hành phương thức Update (hay UpdateBatch). Cập nhật mẩu tin - Mở Recordset - Thực hiện câu lệnh truy vấn để nhận về các mẩu tin thích hợp. - Di chuyển đến mẩu tin cần cập nhật lại giá trị. - Gán lại giá trị cho các trường. - Thi hành phương thức Update (hay UpdateBatch tùy thuộc vào LockType). Lưu ý:Chế độ khóa mẩu tin mặc định trong ADO là chỉ đọc, vì vậy ta phải đổi thuộc tính LockType của đối tượng Recordset sang chế độ soạn thảo trước khi thi hành cập nhật hay thêm mới mẩu tin. III.2.7 Thuộc tính CursorLocation Xác định tập mẩu tin trả về từ cơ sở dữ liệu được lưu ở đâu (Server hay Client, Server là mặc định). Thuộc tính cũng giống thuộc tính CursorLocation của đối tượng Connection. III.2.8 Recordset ngắt kết nối Khi chúng ta dùng con trỏ phía Client, ta có khả năng ngắt kết nối với Server cơ sở dữ liệu mà vẫn tiếp tục làm việc với dữ liệu. Cách này cho phép ứng dụng trở nên Trang 132
  74. Visual Basic linh hoạt hơn bởi vì nhiều người dùng có thể làm việc với cùng một dữ liệu tại một thời điểm nếu như họ không có nối kết với server. Để ngắt nối kết với Server, ta quy định thuộc tính ActiveConnection của đối tượng Recordset là Nothing. Ví dụ: Dim cn As ADODB.Connection Private Sub Form_Load() Set cn = New ADODB.Connection cn.Provider = "Microsoft.Jet.OLEDB.3.51" cn.ConnectionString = "F:\Data\GiangDay.mdb" cn.Open End Sub Public Function GetList (strState As String) _ As ADODB.Recordset Dim rs As ADODB.Recordset Set rs = New ADODB.Recordset Set rs.ActiveConnection = cn rs.CursorLocation = adUseClient rs.LockType = adLockBatchOptimistic rs.CursorType = adOpenKeyset rs.Open strState Set rs.ActiveConnection = Nothing Set GetList = rs Set rs = Nothing End Function Để thi hành cùng một hành động trên một mẩu tin, ta sửa đổi lại các thuộc tính của đối tượng Recordset. rs.LockType = adLockBatchOptimistic rs.CursorType = adOpenKeyset Chúng ta thiết lập giá trị các thuộc tính lại như trên để xác nhận rằng Recordset có thể nối kết lại để cập nhật về sau. Sau đó, ta sẽ thiết lập một hàm nhận Recordset ngắt kết nối làm tham biến để tạo một đối tượng Recordset khác cập nhật dữ liệu. Public Sub WriteData(rsDis As ADODB.Recordset) Dim rs As ADODB.Recordset Set rs = New ADODB.Recordset Set rs.ActiveConnection = cn rs.Open rsDis, cn rs.UpdateBatch End Sub Gọi thực thi thủ tục WriteData: Private Sub cmdWrite_Click() WriteData GetList("Select * From THanghoa") End Sub Trang 133