Khóa Hàm Thụ Visual Basic 6.0 Chương Mười Ba - Cơ sở liệu (Database) Table, Record Field Nói đến sở liệu, ta nghĩ đến SQLServer, Access hay Oracle v.v., nơi chứa nhiều liệu để ta lưu trữ hay lấy chúng cách tiện lợi nhanh chóng Hầu hết chương trình ta viết có truy cập sở liệu, ta dùng công cụ để làm việc với nhiều liệu tập trung vào việc lập trình phần giao diện với người dùng (users) Do ta cần có kiến thức kiến trúc sở liệu để hiểu lý tạo ta thiết kế hay truy cập theo cách định Ta dùng Access Database biblio.mdb, nằm C:\Program Files\Microsoft Visual Studio\VB98\biblio.mdb để minh họa ý niệm cần biết sở liệu Trong database nầy có tables: Authors (tác giả), Publishers (nhà xuất bản), Titles (đề mục) Title Author Table Authors chứa nhiều records Mỗi record table Authors chứa fields: Au_ID, Author Year Born (năm sanh) Ta trình bày Table Authors dạng spreadsheet sau: Vì field records hiển thị cột spreadsheet, nên ta nói đến field column (cột) Và data record chiếm row (hàng) spreadsheet, nên có ta nói đến record row Thật tình mà nói, ta khơng cần phải có computer để lưu trữ hay làm việc với table Authors nầy Ta dùng hộp cạt, cạt ta ghi chi tiết Au_ID, Author Year Born Author Như cạt tương đương với record nguyên hộp tương đương với Table Authors Ta cạt hộp theo thứ tự số Au_ID để truy cập record nhanh chóng biết Au_ID Chỉ khổ nỗi, muốn biết có tác giả, số 300 cạt hộp, già 50 tuổi phải vài phút trả lời Database computer nhanh hệ thống tay (Manual) chỗ Primary Key Index Để tránh trùng hợp, thường thường có field record, thí dụ Au_ID Table Authors, dành để chứa trị số độc đáo (unique) Tức Table Authors có record với field Au_ID có trị số mà thơi Ta gọi Primary Key Khơng phải lúc ta muốn truy cập record Author dựa vào Au_ID Nhiều ta muốn dùng tên Author để truy cập, ta cần phải sort sẵn records theo thứ tự alphabet Ta hợp nhiều fields lại để sort records Thật ra, records không cần phải dời để nằm vị trí thứ tự Ta cần nhớ vị trí đâu table đủ Cái field hay tập hợp nhiều fields (thí dụ surname firstname ) để dùng vào việc sorting nầy gọi Index (ngón tay chỉ) Một Table có hay nhiều Index Mỗi Index table nhỏ pointers, chứa vị trí records Table Authors Nó giống mục lục index cuối sách chứa trang số để ta đến phần ta muốn tìm sách Khi thiết kế Table ta định Datatype field để kiểm tra data cho vào có hợp lệ hay khơng Các Datatypes thơng dụng Number, String (để chứa Text), Boolean (Yes/No), Currency (để chứa trị số tiền) Date (để chứa date/time) Datatype Number lại gồm có nhiều loại datatypes số Integer, Long (integer chiếm 32 bits), Single, Double, v.v Dưới Datatypes fields record Author: Có loại Datatype đặc biệt tên AutoNumber Thật Long trị số phát sinh tự động ta thêm record vào Table Ta khơng làm phải chấp nhận số Relationship Foreign Key Bây giờ, bạn chạy Microsoft Access để quan sát database biblio.mdb, bạn dùng Menu Command Tools | Relationships sau để xem liên hệ (relationships) tables Access hiển thị giao thoại Relationships, table có chứa tên fields Mỗi table lại có hay hai sợi dây nối qua tables klhác Mỗi sợi dây mối liên hệ (relationship), nối field table với field có tên table Thí dụ hai tables Publishers Titles có mối liên hệ dựa field PubID (Publisher IDentification - số lý lịch nhà xuất bản) Hơn nữa, để ý bạn thấy đầu dây phía table Publishers có số 1, cịn đầu dây bên phía table Titles có dấu vơ cực (∞) Ta gọi mối liên hệ (1-∞ ) one-to-many, ý nói nhà xuất phát hành nhiều đề mục sách/CD Tương tự vậy, mối liên hệ one-to-many table Authors Title Author, ta thấy tác giả (bên đầu có số 1) sáng tác nhiều tác phẩm đại diện record Title Author Trong hai tables Titles Title Author, ta có mối liên one-toone, tức tương ứng với record Title có record Title Author Câu hỏi đặt mối liên hệ one-to-many có quan trọng Tưởng tượng ta làm việc với table Titles (tạm gọi Tác phẩm), nhiều ta muốn biết chi tiết nhà xuất tác phẩm Thật ta chứa chi tiết nhà xuất tác phẩm table Titles Tuy nhiên, làm có điểm bất lợi records tác phẩm có nhà xuất chứa liệu giống Mỗi lần muốn sửa đổi chi tiết nhà xuất ta phải sửa chúng record Title thuộc nhà xuất Vì muốn chứa chi tiết nhà xuất chỗ nhất, tránh lập lại, nên ta chứa chúng table riêng, tức table Publishers Nếu giả sử ta bắt đầu thiết kế database với Table Titles, định tách chi tiết nhà xuất để vào table mới, tên Publishers, kỹ thuật gọi normalization Nói cách khác, normalization thiết kế tables database để loại mảnh kiện (không phải Key) xuất chỗ Trong mối liên hệ one-to-many tables Publishers Titles, field PubID Primary Key table Publishers Trong table Titles, field PubID gọi Foreign Key, có nghĩa Primary Key table lạ (foreign) Hay nói cách khác, làm việc với table Titles, lúc cần chi tiết nhà xuất bản, ta lấy chìa khóa lạ (Foreign Key) dùng làm Primary Key Table Publishers để truy cập record ta muốn Để ý Table Titles có Primary Key ISBN Relational Database Một database có nhiều tables hổ trợ liên hệ, one-to-many, gọi Relational Database Khi thiết kế database, ta tìm cách đặt liệu từ giới thật bên vào tables Ta định chọn cột (columns/fields) nào, chọn Primary Key, Index thiết lập mối liên hệ, tức đặt Foreign Key đâu Các lợi ích Trong số lợi ích thiết kế Relational Database có: • • • • • Sửa đổi kiện, cho vào records hay delete (gạch bỏ) records có sẵn hiệu (nhanh) Truy cập kiện, làm báo cáo (Reports) hiệu Vì kiện đặt thứ tự có quy củ nên ta tin cậy tính tình database (khơng có ba trợn, nầy, khác - giựt giựt) Vì hầu hết kiện nằm database, thay chương trình ứng dụng, nên database tự có documentation (tài liệu cắt nghĩa) Dễ sửa đổi cấu trúc tables Integrity Rules (các quy luật liêm chính) Integrity Rules dùng để nói qui luật cần phải tuân theo làm việc với database để đảm bảo database cịn tốt Có hai loại quy luật: luật tổng quát (General Integrity Rules) luật riêng cho database (DatabaseSpecific Integrity Rules) Các luật riêng nầy thường tùy thuộc vào quy luật mậu dịch (Business Rules) General Integrity Rules Có hai quy luật liêm liên hệ hoàn toàn vào database: Entity (bản thể) Integrity Rule Referential (chỉ đến) Integrity Rule Entity Integrity Rule nói Primary Key khơng thể thiếu được, tức khơng thể có trị số NULL Quy luật nầy xác nhận Primary Key đưa đến row độc đáo table, nên dĩ nhiên phải có trị số đàng hoàng Lưu ý Primary Key Composite Key, tức tập hợp số keys (columns/fields), nên định khơng có key số columns NULL Referential Integrity Rule nói database khơng thể chứa Foreign Key mà khơng có Primary Key tương ứng table khác Điều hàm ý rằng: • • Ta thêm Row vào Table với trị số Foreign Key Row không tìm thấy danh sách Primary Key table bên phía one (1) mà liên hệ Nếu có thay đổi trị số Primary Key Row hay delete Row table bên phía one (1) ta khơng thể để records table bên phía many (∞) chứa rows trở thành mồ côi (orphans) Nói chung, có ba nhiệm ý (options) ta chọn thay đổi trị số Primary Key Row hay delete Row table bên phía one (1): Disallow (khơng cho làm): Hồn tồn khơng cho phép chuyện nầy xãy Cascade (ảnh hưởng dây chuyền): Nếu trị số Primary Key bị thay đổi trị số Foreign Key tương ứng records table bên phía many (∞) thay đổi theo Nếu Row chứa Primary Key bị deleted records tương ứng table bên phía many (∞) bị deleted theo Nullify (cho thành NULL): Nếu Row chứa Primary Key bị deleted trị số Foreign Key tương ứng records table bên phía many (∞) đổi thành NULL, để hàm ý đừng có tìm thêm chi tiết đâu Database-Specific Integrity Rules Những quy luật liêm khác khơng phải Entity Integrity Rule hay Referential Integrity Rule gọi Database-Specific Integrity Rules Những quy luật nầy dựa vào loại database tùy thuộc vào quy luật mậu dịch (Business Rules) ta dùng cho database, thí dụ record tiền lương cơng nhân phải có field Số Thuế (Tax Number) sở Thuế Vụ phát hành cho công dân Lưu ý quy luật nầy quan trọng không quy luật tổng quát liêm Nếu ta khơng áp dụng Database-Specific Integrity Rules nghiêm chỉnh database bị hư khơng cịn dùng Microsoft Access Database Management System (MSAccess DBMS) Microsoft Access Database Management System gồm có Database Engine cơng cụ chung để cung cấp cho users môi trường làm việc thân thiện với database, Database Design (thiết kế tables mối liên hệ), Data entry báo cáo (reports) Kèm theo với Visual Basic 6.0 ta mua copy Database Engine MSAccess Tên Jet Database Engine, lõi MSAccess DBMS Các chương trình VB6 truy cập database qua Jet Database Engine Nếu computer bạn có cài sẵn MSAccess, bạn dùng để thiết kế tables database hay cho data vào tables Properties Required Allow Zero Length Khi thiết kế table field, lưu ý property Required property Allow Zero Length Text Nếu property Required field Yes ta khơng thể update (viết) record với field có trị số NULL Nếu Text field có property Allow Zero Length No thì ta khơng thể update record field chứa empty string Khi ta tạo record lần đầu, không cho trị số field, field có trị số NULL Thường thường, Visual Basic 6.0 khơng thích NULL value nên ta phải thử field với Function IsNULL() để đảm bảo khơng có trị số NULL trước làm việc với Nếu IsNULL trả trị số False ta làm việc với field Nhớ trị số NULL dùng expression, chương trình khơng cho Error, kết NULL Làm việc với versions khác Nếu máy bạn chạy MSAccess2002 bạn làm việc với Access database file version 97, 2000 2002 Nếu cần phải convert từ version nầy qua version khác, bạn dùng Access DBMS Menu Command Tools | Database Utilities | Convert Database | To Access 2002 File Format Nếu muốn giữ nguyên version, bạn convert database qua File Format 2002 để sửa đổi, sau convert trở lại File Format cũ Access database file lớn lên nhanh, records bị deleted nằm nguyên, nên tuần bạn nên nhớ nén lại để bỏ hết records bị deleted cách dùng Access DBMS Menu Command Tools | Database Utilities | Compact and Repair Database hay dùng function DBEngine.CompactDatabase VB6 Dùng Query để viết SQL Một cách để truy cập database dùng ngôn ngữ Structured Query Language (SQL) theo chuẩn ISO/IEC phát hành năm 1992, gọi tắt SQL92 Tất database thông dụng hỗ trợ SQL, nhiều chúng cịn cho thêm nhiều chức hay khơng nằm chuẩn Các lệnh SQL thông dụng SELECT, UPDATE, INSERT DELETE Ta dùng phương tiện thiết kế Query MSAccess để viết SQL Sau thiết kế Query cách drag drop fields, bạn dùng Menu Command View | View SQL sau: Tiếp theo SQL statement Query bên mà bạn copy để paste vào code VB6: Dùng Link Table để làm việc trực tiếp với database loại khác Ta dùng database loại khác, DBase, trực tiếp VB6 dùng Access database bình thường Muốn thiết lập móc nối ấy, bạn dùng Menu Command File | Get External Data | Link Tables chọn loại DBase file table mà bạn muốn dùng để nhét vào Access database mở: Database Server số ý niệm Dù Jet Database Engine relational database tốt hiệu năng, thuộc loại File Based database, tức thụ động, khơng chạy phải tùy thuộc vào chương trình dùng File Based database khơng thích hợp với ứng dụng có nhiều người dùng lúc Trong đó, Database Server SQLServer chạy riêng để phục vụ chương trình khách (client) cần Database Server thich hợp cho ứng dụng có nhiều users có chịu trách nhiệm truy cập liệu cho clients Nó chứa nhiều routines địa phương, gọi Stored Procedures, để thực công tác client yêu cầu hiệu Database Server thường có cách đối phó hữu hiệu có cố phần cứng đĩa hư hay cúp điện Ngồi ra, Database Server có sẵn phương tiện an ninh backup Nó có thêm chức để dùng cho mạng Ngày ta thâu thập liệu nhiều hình thức Email, Word documents, Speadsheet Không thiết liệu luôn chứa dạng table records không thiết liệu luôn lưu trữ database đàng hoàng Dù vậy, chúng xem database mắt chương trình ứng dụng Do đó, ta dùng từ Data Store (Kho liệu) thay cho database để nói đến nơi chứa liệu Và chương trình tiêu thụ liệu, ta nói đến Data Source (Nguồn liệu) thay database Khi lập trình VB6 để truy cập database, ta nhìn databse cách trừu tượng, tức dầu Access, DBase, SQLServer hay Oracle ta xem Nếu có thay đổi loại database bên dưới, cách lập trình ta không thay đổi Trong tương lai, XML file xem database nho nhỏ Nó đứng một table trích từ database huy XML chuẩn mà ta dùng để import/export liệu với tất loại database hỗ trợ XML Ta trao đổi liệu mạng Intenet dạng XML Ngồi ra, thay làm việc trực tiếp với database lớn, ta trích vài tables từ database thành XML file Kế ta lập trình với XML file kết thúc hòa (merge/reconcile) XML file với database lớn Nếu phần lớn chương trình áp dụng thiết kế để làm việc cách nầy, tương lai ta khơng cần Database Server thật mạnh Học Microsoft Visual Basic 6.0 Vovisoft © 2000 All rights reserved Last Updated: 28 April 2002 Webmaster ... record với field có trị số NULL Nếu Text field có property Allow Zero Length No thì ta khơng thể update record field chứa empty string Khi ta tạo record lần đầu, không cho trị số field, field có... muốn truy cập record Author dựa vào Au_ID Nhiều ta muốn dùng tên Author để truy cập, ta cần phải sort sẵn records theo thứ tự alphabet Ta hợp nhiều fields lại để sort records Thật ra, records khơng... quy luật nầy dựa vào loại database tùy thuộc vào quy luật mậu dịch (Business Rules) ta dùng cho database, thí dụ record tiền lương cơng nhân phải có field Số Thuế (Tax Number) sở Thuế Vụ phát