Lý thuyết về cơ sở dữ liệu - CSDL

MỤC LỤC LỜI NÓI ĐẦU Ngày nay công nghệ thông tin (CNTT) là ngành khoa học đã nhanh chóng khẳng định vị trí của mình với những tính ưu việt mà không ai có thể phủ nhận được. Từ những năm cuối thế kỷ 20, CNTT ở Việt Nam đã phát triển mạnh mẽ và ứng dụng hầu hết các lĩnh vực khoa học kỹ thuật, kinh tế, văn hóa, xã hội. Trong công cuộc đổi mới đất nước, cùng với các lĩnh vực khác, ngành Giáo dục và đào tạo đã và đang từng bước áp dụng những tiến bộ khoa học kỹ thuật của CNTT và ngành. Những phần

doc118 trang | Chia sẻ: huyen82 | Lượt xem: 2666 | Lượt tải: 4download
Tóm tắt tài liệu Lý thuyết về cơ sở dữ liệu - CSDL, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
mền quản lý, những phần mền hỗ trợ sự dạy và học với sự trợ giúp của máy tính đã và đang phát huy hết tác dụng góp phần không nhỏ vào sự nghiệp giáo dục nước nhà. Đặc biệt là trong công tác quản lý tin học lam giảm nhẹ sức lực của người quản lý tin học và thuận tiện hơn rất nhiều so với thực hiện công việc quản lý đặc biệt là thu hẹp không gian lưu trữ, tránh được thất lạc dữ liệu từng bước tự động hóa và cụ thể hóa lượng thông tin theo yêu cầu của người quản lý, có thể tìm kiếm, tra cứu thông tin nhanh một cách đầy đủ và chính xác hơn. Hiện nay việc quản lý nhân khẩu ở địa phương là một trong những vấn đề gây ra nhiều khó khăn, cản trở đối với cả cơ quan chức năng và cuộc sống của người dân, thậm chí đến cả sự phát triển của nền kinh tế đất nước. Mô hình quản lý hộ khẩu, nhân khẩu hiện tại không còn phù hợp với sự phát triển của nền kinh tế và xã hội hiện nay. Một trong những vấn đề gặp phải đó là vấn đề quản lý theo số hộ khẩu và kèm theo quá nhiều giấy tờ gây rắc rối, khó quản lý. Điều này cấp thiết phải được thay thế bằng một hình thức quản lý khác hợp lý và hiệu quả hơn. Với đề tài này em mong muốn xây dựng được một hệ thống quản lý hộ khẩu cấp phường một cách thật hiệu quả. Chương trình Quản lý hộ khẩu cấp phường này được viết dưới dạng một phần mềm tin học dùng để ứng dụng trong một phường, xã. Chương trình Quản lý hộ khẩu cấp phường có các chức năng được phân cấp rõ ràng theo từng cấp để bất cứ ai làm công tác quản lý cũng có thể sử dụng được, có phần Help để giúp cho người sử dụng có thể tra cứu bất cứ lúc nào. Mặt khác, chương trình còn cho phép người sử dụng quản trị hệ thống mạnh, tìm kiếm thông tin nhanh chóng, chính xác. Song bên cạnh đó vì thời gian có hạn nên chương trình này của em còn chứa đựng rất nhiều hạn chế mà em chưa có thời gian khắc phục. Nhờ sự tận tâm theo sát hướng dẫn của thầy Trần Văn Lộc, trong bước đầu em đã nghiên cứu và vận dụng kiến thức đã học để xây dựng được chương trình quản lý đáp ứng tương đối một số các yêu cầu đặt ra như trên. Tuy nhiên, do kiến thức còn hạn chế nên chương trình chắc chắn không tránh khỏi các thiếu sót. Vì vậy, em rất mong nhận được sự đóng góp ý kiến của tất cả các thầy cô và các bạn để có thể từng bước xây dựng chương trình ngày càng hoàn thiện và hiệu quả hơn. Em xin chân thành cảm ơn thầy giáo hướng dẫn Trần Văn Lộc và các thầy cô giáo Khoa Công Nghệ Thông Tin đã giúp em hoàn thành đồ án này. Hà nội, ngày 22 tháng 4 năm 2009 Sinh viên thực hiện Nguyễn Thị Hoài Thu Phần 1: CƠ SỞ LÝ THUYẾT Chương 1: LÝ THUYẾT CƠ SỞ DỮ LIỆU I. TỔNG QUAN VỀ CƠ SỞ DỮ LIỆU 1.Khái niệm về cơ sở dữ liệu Cơ sở dữ liệu(CSDL) là một tập hợp sắp xếp các thông tin, dữ liệu về một vấn đề nào đó, nhằm giúp cho người sử dụng dễ dàng tra cứu, sử dụng và cập nhật. Đặc điểm chủ yếu của CSDL là cách tổ chức, sắp xếp thông tin, các dữ liệu có liên quan với nhau sẽ được lưu trong các tệp tin hay trong các bảng. Nói cách khác nhau nó là tập hợp các dữ liệu có quan hệ với nhau. 2.Sự cần thiết của cơ sở dữ liệu Ngày nay, nhu cầu tích lũy, lưu trữ và xử lý dữ liệu đã có mặt trên mọi lĩnh vực, trong mọi hoạt động của con người. Nhưng thông tin ngày càng lớn và phức tạp, buộc con người phải sắp xếp các thông tin ssao cho nó khoa học, vì vậy đòi hỏi họ phải sử dụng CSDL. 3.Hệ quản trị cơ sở dữ liệu Là một công cụ cho phép quản lý và tương tác với cơ sở dữ liệu như cho phép xử lý, thay đổi, truy xuất CSDL. Theo nghĩa này, hệ quản trị CSDL có nhiệm vụ rất quan trọng như là một bộ phận diễn dịch với ngôn ngữ bậc cao nhằm giúp người sử dụng có thể dùng được hệ thống mà ít nhiều không cần quan tâm đến thuật toán chi tiết hoặc biểu diễn dữ liệu trong máy tính. Hầu hết các hệ quản trị CSDL đều thực hiện các chức năng sau: Lưu trữ dữ liệu Tạo và duy trì cấu trúc dữ liệu Hỗ trợ bảo mật và riêng tư Cho xem và xử lý các dữ liệu lưu trữ Cung cấp một cơ chế chỉ mục(index) hiệu quả để truy cập nhanh các dữ liệu lựa chọn. Cung cấp tính nhất quán giữa các bản ghi khác nhau. Bảo vệ dữ liệu khỏi mất mát bằng các quá trình sao lưu (backup) và phục hồi dữ liệu(recovery). Trong hệ quản trị CSDL quan hệ giữa các bảng được tổ chức thành các bảng, các bảng bao gồm các trường và các trường chứa các bản ghi. Mỗi trường tương ứng với một mục dữ liệu, hai hay nhiều bảng có thể liên kết nếu chúng có một hay nhiều trường chung. II.LÝ THUYẾT VỀ CƠ SỞ DỮ LIỆU QUAN HỆ Khái niệm cơ bản về cơ sở dữ liệu quan hệ Khái niệm CSDL quan hệ: là loại CSDL cho phép ta truy cập đến dữ liệu thông qua mối quan hẹ đến các dữ liệu khác giống như các bảng tính. Để truy cập thông tin ta có thể dùng một ngôn ngữ đặc biệt để truy vấn, đó là SQL(Structure Query Language) nó là ngôn ngữ truy vấn có cấu trúc. Thành phần của CSDL Các trường dữ liệu (Data fields) Trường dữ liệu chứa dữ liệu nhỏ nhất(dữ liệu nguyên tố), ví dụ bảng HSSV chứa thông tin về sinh viên: trường MSSV chứa mã sinh viên, trường ngaysinh chứa thông tin về ngày tháng năm sinh của sinh viên trong trường… Tất cả các trường tạo ra sẽ chứa một CSDL đơn. Tuy rằng ta có thể chứa hơn một thành phần dữ liệu trong một trường(Field) đơn,nhưng gặp trở ngại khi cập nhật hay sắp xếp thứ tự. Các bản ghi dữ liệu Các bản ghi dữ liệu (Record) là tập hợp các trường dữ liệu có liên quan. Một số bản ghi sinh viên bao gồm các thông tin về sinh viên như: họ tên, ngày sinh, quê quán, hộ khẩu thường trú, giới tính. Bảng dữ liệu(DataTable) Bằng cách kết hợp field dữ liệu và record dữ liệu đã tạo ra nguyên tố chung nhất của CSDL quan hệ là bảng dữ liệu. Nguyên tố này chứa nhiều bản ghi dữ liệu, mỗi bản ghi chứa nhiều trường dữ liệu. Cũng như mỗi bản ghi chứa các trường có quan hệ,mỗi bảng dữ liệu chứa các bản ghi có quan hệ. Các bảng dữ liệu nên đặt tên theo đúng ý nghĩa để giúp người dùng dễ nhớ nội dung bản ghi và trường. Mô hình CSDL quan hệ yêu cầu mỗi hang trong một bảng phải là duy nhất. Để đảm bảo tính duy nhất cho một hang bằng cách tạo ra một khóa chính(primary key) một cột hay kết hợp nhiều cột để xác định duy nhất một hang. Một bảng ghi chỉ có thể có một khóa chính, mặc dù có thể có một số cột hay tổ hợp các cột khác có thể tạo ra các giá trị duy nhất. Những cột hay tổ hợp các cột giá trị duy nhất trong bảng được xem như là khóa dự tuyển của khóa chính. Cho đến nay, không có một nguyên tắc tuyệt đối nào để xác định khóa dự tuyển nào là tốt nhất. Các tính chất đề nghị cả khóa dự tuyển tốt nhất là: nhỏ nhất.(minimality – chọn một số cột cần thiết ít nhất) ổn định(stability – chọn khóa ít thay đổi nhất) và đơn giản/ thân thiện(simplicity/familiaty – chọn một khóa vừa đơn giản vừa quyen thuộc). Khóa ngoại lai(Foreign key): Mặc dù các khóa chính là thành phần của các bảng riêng biệt, nếu ta chỉ dùng các bảng độc lập mà không có quan hệ, ta rất ít sử dụng khóa chính để trở nên thiết yếu khi ta tạo ra các quan hệ để liên kết các bảng trong CSDL quan hệ. Một trường được gọi là khóa ngoại lai của một bảng A nếu nó không phải là khóa chính của bảng A và liên kết với một bảng B qua khóa chính của bảng B để xác định duy nhất một bản ghi của bảng B. Các mỗi quan hệ trong (Relationship) Trong CSDL quan hệ, quan hệ được xác lập rên từng cặp bảng,những cặp bảng này quan hệ với nhau theo từng một trong 3 loại sau 1-1,1-∞, ∞-∞. Quan hệ 1-1(one - to - one) Hai bảng được gọi là quan hệ 1-1 nếu với mọi hang trong bảng thứ nhất chỉ có nhiều nhất một hàng trong bảng thứ hai. Trên thực tế quan hệ này ít xảy ra. Loại quan hệ này thường được tạo ra để khắc phục một số giới hạn của các phần mền quản lý CSDL hơn là mô hình hóa một trạng thái của thế giới thực. Trong Microsoft Access, các quan hệ 1-1 có lẽ cần thiết trong một CSDL quan hệ khi tách một bảng thành hai hay nhiều bảng do tính bảo mật hay hiệu quả. Quan hệ 1-∞(one – to – many ) Hai bảng có quan hệ một nhiều (one – to – many ) nếu đối với bảng thứ nhất có thể không có, hay có một hay nhiều trong bảng thứ hai. Quan hệ một nhiều còn được gọi là quan hệ cha con hay là quan hệ chính phục. Loại quan hệ này được dùng rất nhiều trong CSDL quan hệ. Quan hệ ∞-∞.(many – to – many ) Hai bảng có quan hệ many – to – many khi đối với mọi hàng trong bảng thứ nhất có thể có nhiều hàng trong bảng thứ hai và đối với mọi bảng trong bảng thứ hai có thể có nhiều hàng trong bảng thứ nhất. Các quan hệ ∞-∞ không thể mô hình hóa trong nhiều phần mềm CSDL trong đó có cả Microsoft Assecc. Những quan hệ này cần được tách ra thành nhiều quan hệ 1- ∞. Lý thuyết thiết kế cơ sở dữ liệu quan hệ Trong phần lớn các ứng dụng chúng ta đều phải tạo ra CSDL. Do các nguyên nhân đặc biệt có một số ứng dụng không thể xây dựng được CSDL từ đầu hoặc phải sử dụng một số cơ sở có sẵn không ở dạng thích hợp cho cơ sở dữ liệu quan hệ. Một trong những dạng thường gặp nhất của ta là chuyển dữ liệu chứa ở dạng dữ liệu bảng tính thành các bảng của CSDL quan hệ. Có 3 bước thiết kế CSDL: Tạo ra các lớp thực thể Chuẩn hóa các CSDL Thực hiện phi chuẩn Mô hình cơ sở dữ liệu quan hệ * Quan hệ Quan hệ là một tập hợp con của tích Đề - Các của một hay nhiều miền Di. Như vậy miền quan hệ là vô hạn. Luôn luôn giả thiết rằng, quan hệ là một tập hữu hạn. Một hàng của quan hệ gọi là một bộ. Quan hệ là tập con của tích Đề - Các D1*D2…..D3 gọi là quan hệ n. Khi đó mối quan hệ có n thành phần (n cột). Các tiêu đề cột của quan hệ là thuộc tính. Ta có thể định nghĩa quan hệ như sau: Cho R = { a1,a2,….an } là một tập hợp hữu hạn, không rỗng các thuộc tính. Mỗi thuộc tính ai có một miền giá trị là Dai. Khi đó r – một tập hợp các bộ { h1,h2,….hm } được gọi là một quan hệ trên R với hj (j = 1,2…., m) là một hàm: Hj : R -> È Dai Ai Î R Sao cho : hj (ai) Î Dai * Phụ thuộc hàm Khái niệm về phụ thuộc hàm trong một quan hệ là một quan niệm có tầm quan trọng rất lớn đối với việc thiết kế mô hình dữ liệu. Định nghĩa: Cho R(U) là một lược đồ quan hệ với U = { A1,….,An } là tập hợp thuộc tính.X và Y là tập con của U. Nói rằng X->Y (đọc là X xác định Y hoặc Y phụ thuộc vào hàm X),nếu r là một quan hệ xác định trên R(U) sao cho bất kỳ hai bộ t1, t2 thuộc r mà t1 [X] = t2 [ X] th× t1[Y] = t2 [ Y ]. *Hệ tiêu đề Armstrong trong phụ thuộc hàm : Gọi F là tất cả các phụ thuộc hàm với lược đồ quan hệ R (U) và X->Y là một phụ thuộc hàm,trong đó X,Y Í U. Khi đó ta có F+ là tập hợp tất cả các phụ thuộc hàm được sinh ra từ F khi sử dụng tiêu đề Armstrong được gọi là bao đóng của F. Hệ tiêu đề Armstrong : Gọi R(U) là lược đồ quan hệ với U = { A1,….,An } là tập tất cả các thuộc tính X,Y, X,T Í U .Khi đó ta có : Tính phản xạ : nếu Y Í X thì X->Y Tính tẳng trưởng : nếu Z Í U và X->Y thì XZ -> YZ,trong đó XZ là tập của hai tập X và Y,YZ là tập hợp của hai tập Y và Z. Tính bắc cầu : nếu X->Y và Y->Z thì X->Z. *Khóa a) Định nghĩa Khóa của quan hệ r trên tập thuộc tính U = { A1, A2….,An } là tập con của K Í U sao cho bất kỳ hai bộ khác nhau, 1, t2 Î r luôn thỏa mãn t1 (K) ≠ t2 (K). Tập K là siêu khóa (khóa tối thiểu) của quan hệ r nếu K là một khóa của quan hệ r và mọi tập con thực sự K’ của K đều không phải là tập khóa. b)Các thuật toán tìm khóa tối tiểu * Thuật toán tìm khhoas tối thiểu của một sơ đồ quan hệ: Vào: Sơ đò quan hệ s = trong đó: R = { A1, A2….,An } là tập hợp các thuôc tính. F là tập các phụ thuộc hàm. Ra là một khóa tối tiểu. Thuật toán thực hiện như sau: +Bước 1: K0 = R = { A1, …..….,An } +Bươc i: Thay đổi thứ tự các thuộc tính R bằng thuật toán trên chúng ta có thể tìm được một khóa tối tiểu khác. Thuật toán tìm khóa tối tiểu của quan hệ: Cho trước R = { h1, …..….,hm } là một quan hệ trên tập thuộc tính. R = { a1, …..….,an }. Thuật toán thực hiện như sau: + Bước 1: Tìm Er = { Eij, 1 ≤ i ≤ j ≤ m } +Bước 2: B0 = R = { a1, …..….,nn } +Bước 3: +Bước 4: K = Bn là khóa tối tiểu Cũng như thuật toán trên , nếu ta thay đổi thứ tự các thuật toán của R bằng thuật toán này chúng ta có thể tìm được một khó tối tiểu khác. *Các dạng chuẩn * Dạng chuẩn 1(1 – NF): Giả sử r = { h1, …..….,hm } là File dữ liệu trên tập cột R = { a1, …..….,an }. Khi đó r là 1 – NF nếu các giá trị hi (ai) là sơ cấp với mọi i,j. Khái niệm sơ cấp hiểu ở đây là giá trị hi (aj) (i = - 1,….., m ; j = 1,…, n) Không phân loại chi được nữa. * Dạng chuẩn 2 (2 – NF): Quan hệ r được gọi là dạng chuẩn 2 nếu : Quan hệ r là dạng chuẩn 1. Với mọi khóa tối tiểu K: A - > { a } Ï Fr với A Ì K và a là thuộc tính thứ cấp. * Dạng chuẩn 3 (3-NF) Quan hệ r là dạng chuẩn 3 nếu: > { a} Ï Fr , đối với A+ Ï R, a Ï A, a Ï È K. Có nghĩa là: K là một khóa tối tiểu. a thuộc tính thứ cấp. A không là khóa . A-> {a } không đúng trong r. * Các phép tính toán trên cơ sở dữ liệu - Phép chèn: là phép them một bộ t {d1, ..., d n} vào quan hệ r { A1,….An}. Ký hiệu r È t. Trong đó Ai với i=1,…,n là tên các thuộc tính và d1 Î dom (Ai) là các giá trị thuộc miền giá trị tương ứng của thuộc tính Ai. - Phép loại bỏ: là phép xóa một bộ ra khỏi một quan hệ cho trước ký hiệu r- t, tuy nhiên không phải lúc nào phép loại bỏ cũng cần đầy đủ thông tin về cả bộ cần loại bỏ. * Giới thiệu về SQL(Structure Query Language) ngôn ngữ hỏi có cấu trúc, là một công cụ sử dụng để tổ chức, quản lý và truy xuất dữ liệu được lưu trữ trong các cơ sở dữ liệu. SQL là môt hệ thống ngôn ngữ bao gồm tập các câu lệnh sử dụng để tương tác với CSDL quan hệ. Tên gọi ngôn ngữ hỏi có cấu trúc phần nào làm chúng ta liên tưởng đến một công cụ (ngôn ngữ) dùng để truy xuất dữ liệu trong các cơ sở dữ liệu. Thực sự mà nói, khả năng của SQL vượt xa so với một công cụ truy xuất dữ liệu, mặc dù đây là mục đích ban đầu khi SQL được xây dựng nên và truy xuất dữ liệu vẫn còn là một trong những chức năng quan trọng của nó. SQL được sử dụng để điều khiển tất cả các chức năng mà một hệ quản trị cơ sở dữ liệu cung cấp cho người dùng bao gồm: • Định nghĩa dữ liệu: SQL cung cấp khả năng định nghĩa các cơ sở dữ liệu,các cấu trúc lưu trữ và tổ chức dữ liệu cũng như mối quan hệ giữa các thành phần dữ liệu. • Truy xuất và thao tác dữ liệu: Với SQL, người dùng có thể dễ dàng thực hiện các thao tác truy xuất, bổ sung, cập nhật và loại bỏ dữ liệu trong các cơ sở dữ liệu. • Điều khiển truy cập: SQL có thể được sử dụng để cấp phát và kiểm soát các thao tác của người sử dụng trên dữ liệu, đảm bảo sự an toàn cho cơ sở dữ liệu • Đảm bảo toàn vẹn dữ liệu: SQL định nghĩa các ràng buộc toàn vẹn trong cơ sở dữ liệu nhờ đó đảm bảo tính hợp lệ và chính xác của dữ liệu trước các thao tác cập nhật cũng như các lỗi của hệ thống. Như vậy, có thể nói rằng SQL là một ngôn ngữ hoàn thiện được sử dụng trong các hệ thống cơ sở dữ liệu và là một thành phần không thể thiếu trong các hệ quản trị cơ sở dữ liệu. Mặc dù SQL không phải là một ngôn ngữ lập trình như C, C++, Java,...song các câu lệnh mà SQL cung cấp có thể được nhúng vào trong các ngôn ngữ lập trình nhằm xây dựng các ứng dụng tương tác với cơ sở dữ liệu. Khác với các ngôn ngữ lập trình quen thuộc như C, C++, Java,... SQL là ngôn ngữ có tính khai báo. Với SQL, người dùng chỉ cần mô tả các yêu cầu cần phải thực hiện trên cơ sở dữ liệu mà không cần phải chỉ ra cách thức thực hiện các yêu cầu như thế nào. Chính vì vậy, SQL là ngôn ngữ dễ tiếp cận và dễ sử dụng. * Vai trò của SQL Bản thân SQL không phải là một hệ quản trị cơ sở dữ liệu, nó không thể tồn tại độc lập. SQL thực sự là một phần của hệ quản trị cơ sở dữ liệu, nó xuất hiện trong các hệ quản trị cơ sở dữ liệu với vai trò ngôn ngữ và là công cụ giao tiếp giữa người sử dụng và hệ quản trị cơ sở dữ liệu. Trong hầu hết các hệ quản trị cơ sở dữ liệu quan hệ, SQL có những vai trò như sau: • SQL là ngôn ngữ hỏi có tính tương tác: Người sử dụng có thể dễ dàng thông qua các trình tiện ích để gởi các yêu cầu dưới dạng các câu lệnh SQL đến cơ sở dữ liệu và nhận kết quả trả về từ cơ sở dữ liệu • SQL là ngôn ngữ lập trình cơ sở dữ liệu: Các lập trình viên có thể nhúng các câu lệnh SQL vào trong các ngôn ngữ lập trình để xây dựng nên các chương trình ứng dụng giao tiếp với cơ sở dữ liệu • SQL là ngôn ngữ quản trị cơ sở dữ liệu: Thông qua SQL, người quản trị cơ sở dữ liệu có thể quản lý được cơ sở dữ liệu, định nghĩa các cấu trúc lưu trữ dữ liệu, điều khiển truy cập cơ sở dữ liệu,... • SQL là ngôn ngữ cho các hệ thống khách/chủ (client/server): Trong các hệ thống cơ sở dữ liệu khách/chủ, SQL được sử dụng như là công cụ để giao tiếp giữa các trình ứng dụng phía máy khách với máy chủ cơ sở dữ liệu. • SQL là ngôn ngữ truy cập dữ liệu trên Internet: Cho đến nay, hầu hết các máy chủ Web cũng như các máy chủ trên Internet sử dụng SQL với vai trò là ngôn ngữ để tương tác với dữ liệu trong các cơ sở dữ liệu. • SQL là ngôn ngữ cơ sở dữ liệu phân tán: Đối với các hệ quản trị cơ sở dữ liệu phân tán, mỗi một hệ thống sử dụng SQL để giao tiếp với các hệ thống khác trên mạng, gởi và nhận các yêu cầu truy xuất dữ liệu với nhau. • SQL là ngôn ngữ sử dụng cho các cổng giao tiếp cơ sở dữ liệu: Trong một hệ thống mạng máy tính với nhiều hệ quản trị cơ sở dữ liệu khác nhau, SQL thường được sử dụng như là một chuẩn ngôn ngữ để giao tiếp giữa các hệ quản trị cơ sở dữ liệu. * Tổng quan về cơ sở dữ liệu quan hệ a. Mô hình dữ liệu quan hệ Mô hình dữ liệu quan hệ được Codd đề xuất năm 1970 và đến nay trở thành mô hình được sử dụng phổ biến trong các hệ quản trị cơ sở dữ liệu thương mại. Nói một cách đơn giản, một cơ sở dữ liệu quan hệ là một cơ sở dữ liệu trong đó tất cả dữ liệu được tổ chức trong các bảng có mối quan hệ với nhau. Mỗi một bảng bao gồm các dòng và các cột: mỗi một dòng được gọi là một bản ghi (bộ) và mỗi một cột là một trường (thuộc tính). b.Bảng (Table) Như đã nói ở trên, trong cơ sở dữ liệu quan hệ, bảng là đối tượng được sử dụng để tổ chức và lưu trữ dữ liệu. Một cơ sở dữ liệu bao gồm nhiều bảng và mỗi bảng được xác định duy nhất bởi tên bảng. Một bảng bao gồm một tập các dòng và các cột: mỗi một dòng trong bảng biểu diễn cho một thực thể (trong hình 1.1, mỗi một dòng trong bảng SINHVIEN tương ứng với một sinh viên); và mỗi một cột biểu diễn cho một tính chất của thực thể (chẳng hạn cột NGAYSINH trong bảng SINHVIEN biểu diễn cho ngày sinh của các sinh viên được lưu trữ trong bảng).Như vậy, liên quan đến mỗi một bảng bao gồm các yếu tố sau: • Tên của bảng: được sử dụng để xác định duy nhất mỗi bảng trong cơ sở dữ liệu. • Cấu trúc của bảng: Tập các cột trong bảng. Mỗi một cột trong bảng được xác định bởi một tên cột và phải có một kiểu dữ liệu nào đó (chẳng hạn cột NGAYSINH trong bảng SINHVIEN ở hình trên có kiểu là DATETIME).Kiểu dữ liệu của mỗi cột qui định giá trị dữ liệu có thể được chấp nhận trên cột đó. • Dữ liệu của bảng: Tập các dòng (bản ghi) hiện có trong bảng. c. Khóa của bảng Trong một cơ sở dữ liệu được thiết kế tốt, mỗi một bảng phải có một hoặc một tập các cột mà giá trị dữ liệu của nó xác định duy nhất một dòng trong một tập các dòng của bảng. Tập một hoặc nhiều cột có tính chất này được gọi là khoá của bảng. Việc chọn khoá của bảng có vai trò quan trọng trong việc thiết kế và cài đặt các cơ sở dữ liệu quan hệ. Các dòng dữ liệu trong một bảng phải có giá trị khác nhau trên khoá. Bảng MONHOC trong hình dưới đây có khoá là cột MAMONHOC Một bảng có thể có nhiều tập các cột khác nhau có tính chất của khoá (tức là giá trị của nó xác định duy nhất một dòng dữ liệu trong bảng). Trong trường hợp này, khoá được chọn cho bảng được gọi là khoá chính (primary key) và những khoá còn lại được gọi là khoá phụ hay là khoá dự tuyển (candidate key/unique key). Mối quan hệ và khóa ngoài Các bảng trong một cơ sở dữ liệu không tồn tại độc lập mà có mối quan hệ mật thiết với nhau về mặt dữ liệu. Mối quan hệ này được thể hiện thông qua ràng buộc giá trị dữ liệu xuất hiện ở bảng này phải có xuất hiện trước trong một bảng khác. Mối quan hệ giữa các bảng trong cơ sở dữ liệu nhằm đàm bảo được tính đúng đắn và hợp lệ của dữ liệu trong cơ sở dữ liệu.Này đòi hỏi giá trị cột MAKHOA của một dòng (tức là một lớp) trong bảng LOP phải được xác định từ cột MAKHOA của bảng KHOA. Mối quan hệ giữa các bảng trong một cơ sở dữ liệu thể hiện đúng mối quan hệ giữa các thực thể trong thế giới thực. Trong hình 1.3, mối quan hệ giữa hai bảng LOP và KHOA không cho phép một lớp nào đó tồn tại mà lại thuộc vào một khoa không có thật.Khái niệm khoá ngoài (Foreign Key) trong cơ sở dữ liệu quan hệ được sử dụng để biểu diễn mối quan hệ giữa các bảng dữ liệu. Một hay một tập các cột trong một bảng mà giá trị của nó được xác định từ khóa chính của một bảng khác được gọi là khoá ngoài. Trong hình trên, cột MAKHOA của bảng LOP được gọi là khoá ngoài của bảng này, khoá ngoài này tham chiếu đến khoá chính của bảng KHOA là cột MAKHOA. e. Sơ lược về SQL SQL chuẩn bao gồm khoảng 40 câu lệnh. Bảng 1.1 liệt kê danh sách các câu lệnh thường được sử dụng nhất trong số các câu lệnh của SQL. Trong các hệ quản trị cơ sở dữ liệu khác nhau, mặc dù các câu lệnh đều có cùng dạng và cùng mục đích sử dụng song mỗi một hệ quản trị cơ sở dữ liệu có thể có một số thay đổi nào đó. Điều này đôi khi dẫn đến cú pháp chi tiết của các câu lệnh có thể sẽ khác nhau trong các hệ quản trị cơ cơ sở dữ liệu khác nhau. Câu lệnh Thao tác dữ liệu SELECT INSERT UPDATE DELETE TRUNCATE Định nghĩa dữ liệu CREATE TABLE DROP TABLE ALTER TABLE CREATE VIEW ALTER VIEW DROP VIEW CREATE INDEX DROP INDEX CREATE SCHEMA DROP SCHEMA CREATE PROCEDURE ALTER PROCEDURE DROP PROCEDURE CREATE FUNCTION ALTER FUNCTION DROP FUNCTION CREATE TRIGGER ALTER TRIGGER DROP TRIGGER Điều khiển truy cập GRANT REVOKE Quản lý giao tác COMMIT ROLLBACK SAVE TRANSACTION Lập trình DECLARE OPEN FETCH CLOSE EXECUTE Chức năng Truy xuất dữ liệu Bổ sung dữ liệu Cập nhật dữ liệu Xoá dữ liệu Xoá toàn bộ dữ liệu trong bảng Tạo bảng Xoa bảng Sửa đổi bảng Tạo khung nhìn Sửa đổi khung nhìn Xoá khung nhìn Tạo chỉ mục Xoá chỉ mục Tạo lược đồ cơ sở dữ liệu Xoá lược đồ cơ sở dữ liệu Tạo thủ tục lưu trữ Sửa đổi thủ tục lưư trữ Xoá thủ tục lưu trữ Tạo hàm (do người sử dụng định nghĩa) Sửa đổi hàm Xoá hàm Tạo trigger Sửa đổi trigger Xoá trigger Cấp phát quyền cho người sử dụng Thu hồi quyền từ người sử dụng Uỷ thác (kết thúc thành công) giao tác Quay lui giao tác Đánh dấu một điểm trong giao tác Khai báo biến hoặc định nghĩa con trỏ Mở một con trỏ để truy xuất kết quả truy vấn Đọc một dòng trong kết quả truy vấn (sử dụng con trỏ) Đóng một con trỏ Thực thi một câu lệnh SQL Các câu lệnh của SQL đều được bắt đầu bởi các từ lệnh, là một từ khoá cho biết chức năng của câu lệnh (chẳng hạn SELECT, DELETE, COMMIT). Sau từ lệnh là các mệnh đề của câu lệnh. Mỗi một mệnh đề trong câu lệnh cũng được bắt đầu bởi một từ khoá (chẳng hạn FROM, WHERE,...). Ví dụ 1.1: Câu lệnh: SELECTmasv,hodem,ten FROM sinhvien WHERE malop=’C24102’ dùng để truy xuất dữ liệu trong bảng SINHVIEN được bắt đầu bởi từ lệnh SELECT, trong câu lệnh bao gồm hai mệnh đề: mệnh đề FROM chỉ định tên của bảng cần truy xuất dữ liệu và mệnh đề WHERE chỉ định điều kiện truy vấn dữ liệu. f. Kiểu dữ liệu Chuẩn ANSI/ISO SQL cung cấp các kiểu dữ liệu khác nhau để sử dụng trong các cơ sở dữ liệu dựa trên SQL và trong ngôn ngữ SQL. Dựa trên cơ sở các kiểu dữ liệu do chuẩn ANSI/ISO SQL cung cấp, các hệ quản trị cơ sở dữ liệu thương mại hiện nay có thể sử dụng các dạng dữ liệu khác nhau trong sản phẩm của mình. Bảng dưới đây liệt kê một số kiểu dữ liệu thông dụng được sử dụng trong SQL. CHAR (n) Kiểu chuỗi với độ dài cố định NCHAR (n) Kiếu chuỗi với độ dài cố định hỗ trợ UNICODE VARCHAR (n) Kiểu chuỗi với độ dài chính xác NVARCHAR (n) Kiểu chuỗi với độ dài chính xác hỗ trợ UNICODE INTEGER Số nguyên có giá trị từ -231đến 231 - 1 INT Như kiểu Integer TINYTINT Số nguyên có giá trị từ 0 đến 255. SMALLINT Số nguyên có giá trị từ -215đến 215 – 1 BIGINT Số nguyên có giá trị từ -263đến 263-1 NUMERIC (p,s) Kiểu số với độ chính xác cố định. DECIMAL (p,s) Tương tự kiểu Numeric FLOAT Số thực có giá trị từ -1.79E+308 đến 1.79E+308 REAL Số thực có giá trị từ -3.40E + 38 đến 3.40E + 38 MONEY Kiểu tiền tệ BIT Kiểu bit (có giá trị 0 hoặc 1) DATETIME Kiểu ngày giờ (chính xác đến phần trăm của giây) SMALLDATETIME Kiểu ngày giờ (chính xác đến phút) TIMESTAMP BINARY Dữ liệu nhị phân với độ dài cố định (tối đa 8000 bytes) VARBINARY Dữ liệu nhị phân với độ dài chính xác (tối đa 8000 bytes) f. Giá trị NULL Một cơ sở dữ liệu là sự phản ánh của một hệ thống trong thế giới thực, do đó các giá trị dữ liệu tồn tại trong cơ sở dữ liệu có thể không xác định được. Một giá trị không xác định được xuất hiện trong cơ sở dữ liệu có thể do một số nguyên nhân sau: • Giá trị đó có tồn tại nhưng không biết. • Không xác định được giá trị đó có tồn tại hay không. • Tại một thời điểm nào đó giá trị chưa có nhưng rồi có thể sẽ có. • Giá trị bị lỗi do tính toán (tràn số, chia cho không,...) Những giá trị không xác định được biểu diễn trong cơ sở dữ liệu quan hệ bởi các giá trị NULL. Đây là giá trị đặc biệt và không nên nhầm lẫn với chuỗi rỗng (đối với dữ liệu kiểu chuỗi) hay giá trị không (đối với giá trị kiểu số). Giá trị NULL đóng một vai trò quan trọng trong các cơ sở dữ liệu và hầu hết các hệ quản trị cơ sở dữ liệu quan hệ hiện nay đều hỗ trợ việc sử dụng giá trị này. Chương 2. GIỚI THIỆU VB.NET 2.1 Nguồn gốc của.NET Đầu năm 1998, sau khi hoàn tất version 4 của Internet Information Server (IIS), một đội lập trình ở Microsoft nhận thấy họ còn rất nhiều sáng kiến để kiện toàn IIS. Họ bắt đầu thiết kế một architecture mới dựa trên những ý đó và project đuợc đặt tên là Next Generation Windows Services (NGWS). Sau khi Visual Basic 6 đuợc trình làng vào cuối năm 1998, dự án kế tiếp mang tên Visual Studio 7 đuợc xáp nhập vào NGWS. Đội ngũ COM+/MTS góp vào một universal runtime cho tất cả các ngôn ngữ lập trình trong Visual Studio, mà họ có ý định cho ngay cả các ngôn ngữ lập trình của công ty khác dùng luôn. Công việc được giữ bí mật mãi đến hội nghị Professional Developers' Conference ở Orlando vào tháng 7/2000. Đến tháng 11/2000 thì Microsoft cho phát hành Beta 1 của.NET gồm ba CD. Tính đến lúc ấy thì Microsoft đã làm việc trên dự án ấy gần ba năm rồi. Điều ấy cắt nghĩa tại sao Beta 1 version tương đối rất vững chải. .NET mang dấu tích những sáng kiến đã được áp dụng trước đây như p-code trong UCSD Pascal cho đến Java Virtual Marchine. Có điều Microsoft góp nhặt những sáng kiến của người khác, kết hợp với những sáng kiến của chính mình để làm nên một sản phẩm ăn rơ từ trong ra ngoài. Có lẽ cuối năm 2001 hay đầu năm 2002 Microsoft mới phát hành.NET. Có người hỏi Microsoft xem.NET quan trọng như thế nào. Các "xếp" của Microsoft cho biết 80% tài khóa Research & Development (Nghiên cứu và Triển khai) của Microsoft trong năm 2001 được dành cho.NET, và tối hậu, tất cả sản phẩm của Microsoft đều sẽ được dọn nhà qua.NET platform. .NET gồm có hai phần: Framework và Integrated Development Environment (IDE). Framework cung cấp tất cả những gì cần thiết căn bản. Chữ Framework có nghĩa là cái Khung hay khung cảnh trong đó ta dùng những hạ tầng cơ sở theo một qui ước nhất định để công việc trôi chảy. Còn IDE cung cấp một môi trường giúp ta triển khai dễ dàng, nhanh chóng hơn. Nếu không có IDE ta cũng có thể dùng Notepad và line commands để triển khai nhưng nó chậm hơn. Do đó, nếu có chỗ nào IDE genareted code có vẽ quá rắc rối, bạn nên trở về Framework để xem mình thật sự tối thiểu cần những thứ gì. Vì nói cho cùng, Framework là quan trọng nhất, còn IDE bất quá chỉ là một công cụ gắn lên phía trên Framework thôi. Trong.NET, C# và VB.NET đều dùng cùng một IDE. 2.2 VB.NET VB.NET (còn được gọi là VB7)chẳng qua là C# viết theo lối Visual Basic. Nay VB7 đã hoàn toàn là Object Oriented, tức là cho ta dùng lại classes/forms theo cách thừa kế thật thoải mái, nên nó khác VB6 nhiều lắm. Tất cả đều là Object như trong Java. Dùng Namespace để Import classes từ các component vào chương trình Các Visual components của Winform đều được chứa dưới dạng Designer Generated Code giống như Delphi, chớ không phải chứa trong phần đầu của.frm file như trong VB6. Integer types bây giờ gồm có Byte, Short, Integer và Long Có thể dùng các Arithmetic Operators mới như: X += 4 tương đương với X = X + 4 Mess &= " text" tương đương với Mess = Mess & " text" VB.NET có cả Byte và Char data type. Byte với trị số 0-255 có thể được dùng cho ASCII character. Char với trị số 0-65535 của 2 bytes được dùng cho Unicode. String trong VB.NET khác với String trong VB6 rất nhiều vì nó đến từ System.String class. Ý niệm fixed-length string của VB6 như khai báo Dim MyString as string * 30 đã bị dẹp bỏ. Option Strict bắt buộc ta phải tự mình convert data type chớ VB.NET không làm dùm như trong VB6. Những control tàn hình như Timer, Menu (không còn dùng Menu Editor như trong VB6 nữa) được chứa riêng trong Component tray (mâm). VB.NET không có variant data type nhưng thay vào đó là Object data type. Tất cả array đều zero-based. VB.NET dùng block-level scope, do đó một variable declared trong một IF... THEN.. END IF block sẽ biến mất khi qua khỏi END IF. Short Circuit trong IF.. THEN Statement Trong VB6, nếu ta viết: Dim myInt as Integer myInt = 0 If (myInt 0) and (17 \ myInt < 5 ) then Thì sẽ bị Division by Zero error, vì mặc dầu phần (myInt 0) là False, nhưng VB6 vẫn tiếp tục tính phần (17\myInt<5). Trong VB.NET, khi (myInt 0) là False thì nó không tính thêm nữa. Ðặc tính nầy gọi là Short Circuit (đi tắt). Thêm vào Collection và Dictionary class sẽ có ArrayList, BitArray, Hashtable, ObjectList, Queue, SortedList, Stack và StringCollection Không còn Set statement cho Object. Trong VB6 ta có thể viết: Set x = New Product Set w = x Trong VB.NET sẽ được viết lại như sau: x = New Product() w = x Thay đổi trong cách viết Property rourines Nếu trong VB6 ta viết: Private _description as String Public Property Let Description (Value As String) _description = Value End Property Public Property Get Description() As String Description = _description End Property Trong VB.NET Let và Get đuợc hợp lại và ta lại dùng chữ Set thay cho chữ Get (mặc dầu chữ Set không còn dùng cho Object như mới nói ở ._.trên) như sau: Private _description As String Public Property Description() As String Set _description = Value End Set Get Description = _description End Get End Property Bây giờ nếu Property là ReadOnly hay WriteOnly ta sẽ viết: Public ReadOnly Property Age() As Integer Get Age = 3 End Get End Property Private _data As Integer Public WriteOnly Property Data() As Integer Set _data = Value End Set End Property Có thể dùng Reserved Word làm Procedure Name bằng cách để nó giữa ngoặc vuông, thí dụ như: Public Function [Compare] (ByVal v1 as Integer, ByVal v2 as Integer) as Boolean Dùng Structure TRY... CATCH... FINALLY... END TRY để xử lý error. Thí dụ như trong bài toán chia dưới đây, nếu bị Division by 0 error thì ta sẽ cho kết quả bằng 0: Try result = a / b ' if this section has error jump to Catch section Catch ' only get here if an error occurs between Try and Catch result = 0 Finally ' This section is optional System.Diagnostic.Debug.WriteLine( result) End Try Gosub đã bị dẹp bỏ. 2.3 Những khác biệt giữa VB.NET với VB6 VB.NET, còn gọi là VB7, chẳng qua là C# viết theo lối Visual Basic. Nay VB7 đã hoàn toàn là Object Oriented, tức là cho ta dùng lại (reuse) classes/forms theo cách thừa kế thật thoải mái, nên nó khác VB6 nhiều lắm. Dầu vậy, đối với VB6 programmers học VB.NET không khó. Lý do là VB.NET không cho thêm nhiều từ mới (reserved words). Nói chung các ý niệm mới trong VB.NET đều dễ lĩnh hội, nhất là khi đem ra áp dụng cách thực tế. Đó là nhờ Microsoft vẫn giữ nguyên tắc dấu và làm sẵn (của VB6) những gì rắc rối phía sau sân khấu, để ta có thể tập trung vào việc tìm kiếm một giải pháp, thay vì quá bận tâm vào cách thức làm một việc gì. Chính nguyên tắc ấy đã giúp Microsoft chiêu mộ được 3 triệu VB6 programmers trên khắp thế giới. VB.NET cống hiến cho VB programmers một công cụ rất hữu hiệu để dùng cho mọi hoàn cảnh, từ database, desktop, distributed, internet cho đến real-time hay mobile (pocket PC). Những ưu điểm (features) của VB.NET đến từ chức năng của.NET Framework. Nó mang đến phương tiện lập trình cho mạng cách Object Oriented như XML, Remoting, Streaming, Serialisation, Threading. v. v... Những thứ nầy tuy lạ nhưng không khó học, ngược lại sẽ tiết kiệm rất nhiều thì giờ. Mặc dầu VB6 là một ngôn ngữ lập trình trưởng thành và hiệu năng, chắc chắn hãy còn tồn tại trong nhiều năm nữa, nhưng học thêm VB.NET là một đầu tư tương đối ít tốn kém và đảm bảo huê lợi gấp bao nhiêu lần trong hàng thập niên tới. Trong bài nầy ta sẽ bàn về những điểm khác nhau giữa VB6 và VB.NET từ quan điểm ngôn ngữ lập trình. Trong một bài khác ta sẽ bàn về những chức năng Đối tượng (Object Oriented) của VB.NET. 2.4 Namespaces Namespaces là một cách đặt tên để giúp sắp đặt các Classes ta dùng trong program một cách thứ tự hầu dễ tìm kiếm chúng. Tất cả code trong.NET, viết bằng VB.NET, C# hay ngôn ngữ nào khác, đều được chứa trong một namespace. Điểm nầy cũng áp dụng cho code trong.NET system class libraries. Chẳng hạn, các classes của WinForms đều nằm trong System.Windows.Forms namespace. Và các classes dùng cho collections như Queue, Stack, Hashtable. v. v.. đều nằm trong System. Collections namespace. Tất cả code ta viết trong program của mình cũng đều nằm trong các namespaces. Trước đây trong VB6, mỗi khi nhắc đến một Class trong một COM tên CompName ta viết CompName.classname (còn gọi là PROGID), tức là cũng dùng một dạng namespace. Tuy nhiên phương pháp nầy có một vài giới hạn: Địa chỉ của class bị buộc cứng vào component đang chứa nó. Những classes không nằm trong một COM component thì không có "namespace". Cách gọi tên PROGID chỉ có một bậc thôi, không có bậc con, bậc cháu. Tên của Component luôn luôn có hiệu lực trên khắp cả computer. Namespaces trong.NET khắc phục được mọi giới hạn nói trên trong VB6. Nhiều assemblies có thể nằm trong cùng một namespace, nghĩa là classes khai báo trong các components khác nhau có thể có chung một namespace. Điều nầy cũng áp dụng xuyên qua các ngôn ngữ, giúp cho một class viết trong VB.NET có thể nằm trong cùng một namespace với một class viết trong C#, hơn nữa, trong một assembly có thể có nhiều namespaces, dù rằng thông thường ta chỉ dùng một namespace duy nhất cho tất cả các classes trong ấy. Theo mặc định, tên của project được dùng làm namespace. Nếu bạn right click lên project name NETListbox trong Solution Explorer của program Demo, rồi chọn Properties trong popup menu, IDE sẽ hiển thị Property Pages dialog. Namespaces có thể được phân chia thứ bậc giống như Folders trong một File Directory. Nó sẽ giúp user sắp đặt các classes theo đúng nhóm cho trong sáng và dễ đọc. Thí dụ bạn đang viết một program cho một hảng sản xuất, bạn sẽ dùng namespace NhàSảnXuất ở root level. Bên trong namespace ấy bạn sẽ tạo thêm các nhánh của chương trình như: NhàSảnXuất.TồnKho NhàSảnXuất.SảnPhẩm NhàSảnXuất.KếToán.ChiPhí NhàSảnXuất.KếToán.ThuNhập Mỗi namespace chứa những phần của code thích hợp cho nó trong program nói chung. Trong File Directory, ta có thể có hai files dù mang cùng tên nhưng nằm trong hai folders khác nhau. Giống như vậy, trong.NET ta có thể có hai classes có cùng một tên nhưng nằm trong hai namespaces khác nhau. Đó là vì khi ta viết tên của một class với cả namespace của nó thì có thể phân biệt với một class khác với cùng tên. 2.5 Local và Global Namespaces Khác với COM components với "namespace" của chúng áp dụng cho khắp cả computer, namespaces của.NET thông thường là Local, chỉ có application program của nó thấy mà thôi..NET cũng hổ trợ Global namespace, nhưng phải được ký tên (digitally signed) và đăng ký với.NET runtime để chứa nó trong global assembly cache. Dùng Namespaces Ta có thể dùng namespaces bằng cách nói thẳng ra (explicitly) với nguyên tên (Direct Addressing) hay hàm ý (implicitly) với Import keyword. Nhưng điều tiên quyết là ta phải reference cái assembly chứa namespace mà ta muốn dùng. Ta thực hiện việc ấy với Menu command Project | Add References. Khi Add References dialog hiện ra, chọn Tab.NET cho standard.NET components hay Tab Projects cho DLL của một.NET project khác, highlight DLL bạn muốn rồi click Select button, đoạn click OK. Chẳng hạn ta muốn read và write từ stdio (cái console input/output stream). Cái namespace ta cần sẽ là System.Console. Trong cách Direct Addressing ta sẽ code như sau để viết hàng chữ "Chào thế giới": System.Console.WriteLine ("Hello world!") Nếu ta dùng Import keyword bằng cách nhét vào câu Imports System.Console ở đầu code module, ta có thể code gọn hơn: WriteLine ("Hello world!") Dưới đây là một số namespaces thông dụng: Namespace Chức năng Classes điển hình System.IO Đọc/Viết files và các data streams khác FileStream, Path, StreamReader, StreamWriter System.Drawing Đồ họa Bitmap, Brush, Pen Color, Font, Graphics System.Data Quản lý data DataSet, DataTable, DataRow, SQLConnection, ADOConnection System.Collection Tạo và quản lý các loại collections ArrayList, BitArray, Queue, Stack, HashTable System.Math Tính toán Sqrt, Cos, Log, Min System.Diagnostics Debug Debug, Trace System.XML Làm việc với XML, Document Object Model XMLDocument, XMLElement, XMLReader, XMLWriter System.Security Cho phép kiểm soát an ninh Cryptography, Permission, Policy Aliasing Namespaces (dùng bí danh) Khi hai namespaces trùng tên, ta phải dùng nguyên tên (kể cả gốc tích) để phân biệt chúng. Điển hình là khi ta dùng những namespaces liên hệ đến VB6 như Microsoft.Visualbasic. Thay vì code: Microsoft.Visualbasic.Left ( InputString, 6) ta viết: Imports VB6= Microsoft.Visualbasic Sau đó ta có thể code: VB6.Left ( InputString, 6) Dùng Namespaces keyword Trong thí dụ về program có Root Namespace là NhàSảnXuất như nói trên, nếu ta muốn đặt ra một namespace con là TồnKho, ta phải dùng NameSpace keyword trong code như sau: ' Root Namespace là NhàSảnXuất Namespace TồnKho Class PhòngLạnh ' Code cho Phòng Lạnh End Class End Namespace Một thay đổi lớn cho Data Type của VB.NET, là những variables dùng Data Type địa phương như Integer, Single, Boolean,.v.v.. đều là những Objects. Chúng đều được derived (xuất phát) từ Class căn bản nhất tên Object trong VB.NET. Trong.NET, Integer có bốn loại: Byte (8 bits, không có dấu, tức là từ 0 đến 255), Short (16 bits, có dấu cộng trừ, tức là từ -32768 đến 32767), Integer (32 bits, có dấu) và Long (64 bits, có dấu). Như vậy Integer bây giờ tương đương với Long trong VB6, và Long bây giờ lớn gấp đôi trong VB6. Floating-Point Division (Chia số dấu phảy động) Việc chia số dấu phảy động (Single, Double) trong VB.NET được làm theo đúng tiêu chuẩn của IEEE. Do đó nếu ta viết code như sau: Dim dValueA As Double Dim dValueB As Double dValueA = 1 dValueB = 0 Console.WriteLine(dValueA / dValueB) Trong VB6 ta biết mình sẽ gặp Division by Zero error, nhưng ở đây program sẽ viết trong Output Window chữ Infinity (vô cực). Tương tự như vậy, nếu ta viết code: Dim dValueA As Double Dim dValueB As Double dValueA = 0 dValueB = 0 Console.WriteLine(dValueA / dValueB) Kết quả sẽ là chữ NaN (Not a Number) hiển thị trong Output Window. Thay thế Currency bằng Decimal VB.NET dùng Decimal data type với 128 bits để thay thế Currency data type trong VB6. Nó có thể biểu diễn một số tới 28 digits nằm bên phải dấu chấm để cho thật chính xác. Hể càng nhiều digits nằm bên phải dấu chấm thì tầm trị số của Decimal càng nhỏ hơn. Char Type VB.NET có cả Byte lẫn Char data type. Byte được dùng cho một số nhỏ 0-255, có thể chứa một ASCII character trong dạng con số. Char được dùng để chứa một Unicode (16 bit) character. Char là một character của String. String Type Nhìn lướt qua, String trong VB.NET không có vẻ khác VB6 bao nhiêu. Nhưng trừ khi ta muốn tiếp tục dùng các Functions như InStr, Left, Mid and Right trong VB6, ta nên xem String là một object và dùng những Properties/Functions của nó trong VB.NET cho tiện hơn. Sau nầy ta sẽ học thêm về String của VB.NET trong một bài riêng. Ý niệm fixed-length (có chiều dài nhất định) String trong VB6 không còn dùng nữa. Do đó ta không thể declare: Dim myString as String * 25 Object thay thế Variant Một trong những data types linh động, hiệu năng và nguy hiểm trong VB6 là Variant. Một variable thuộc data type Variant có thể chứa gần như thứ gì cũng được (trừ fixed-length string), nó tự động thích nghi bên trong để chứa trị số mới. Cái giá phải trả cho sự linh động ấy là program chạy chậm và dễ có bugs tạo ra bởi sự biến đổi từ data loại nầy qua loại khác không theo dự tính của ta. VB.NET thay thế Variant bằng Object. Vì trên phương diện kỹ thuật tất cả data types trong.NET đều là Object nên, giống như Variant, Object có thể chứa đủ thứ. Nói chung, dầu Object giống như Variant, nhưng trong.NET ta phải nói rõ ra (explicitly) mình muốn làm gì. Ta thử xem một thí dụ code trong VB6 như sau: Private Sub Button1_Click() Dim X1 As Variant Dim X2 As Variant X1 = "24.7" X2 = 5 Debug.Print X1 + X2 ' Cộng hai số với operator + Debug.Print X1 & X2 ' Ghép hai strings lại với operator & End Sub Kết quả hiển thị trong Immediate Window là: 29.7 24.75 Trong VB.NET, ta phải code cho rõ ràng hơn như sau để có cùng kết quả như trên hiển thị trong Output Window: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim X1 As Object Dim X2 As Object X1 = "24.7" X2 = 5 Console.WriteLine(CSng(X1) + CInt(X2)) Console.WriteLine(CStr(X1) & CStr(X2)) End Sub CType Statement Trong VB.NET có Option Strict by default. Nó bắt ta phải thận trọng trong cách dùng data types. Vì Object có thể chứa bất cứ thứ gì, khi ta muốn dùng nó như một loại data type hay class nào, ta phải đổi Object ra thứ ấy bằng CType, thí dụ: Class Product Public Description As String End Class Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim X As Object X = New Product() ' Treat X like an actual product CType(X, Product).Description = "Soft Drink" Console.WriteLine(CType(X, Product).Description) End Sub Mặc dù X được instantiated như một Product, nó vẫn được xem như một Object variable. Do đó mỗi khi muốn dùng nó như một Product ta phải nhờ đến CType. Từ chuyên môn trong programming gọi đó là Type Casting. Thay đổi trong cách khai báo Variables Khai báo nhiều Variables Trong VB6 ta có thể Declare nhiều variables trên cùng một hàng như: Dim i, j, k as Integer Kết quả là chỉ có k là Integer, còn i và j là Variant (có thể đó là điều bạn không ngờ). Trong VB.NET thì cả ba i, j và k đều là Integer, và như thế hợp lý hơn. Khai báo trị số khởi đầu Trong VB6, sau khi declare variable ta thường cho nó một trị số khởi đầu như: Dim X as Integer X = 12 Bây giờ trong VB.NET ta có thể gọp chung hai statements trên lại như sau: Dim X as Integer = 12 Khai báo Constants Khi khai báo Constants trong VB.NET ta phải khai rõ Data type của nó là String, Integer, Boolean..v. v.: Public Const myConstantString as String = "happy" Public Const maxStudent as Integer = 30 Dim As New Trong VB6 ta được khuyên không nên code: Dim X as New Customer vì VB6 không instantiate một Object Customer cho đến khi X được dùng đến - chuyện nầy rất nguy hiểm vì có thể tạo ra bug mà ta không ngờ. Trong VB.NET ta có thể yên tâm code: Dim X as New Customer() vì statement nói trên lập tức tạo ra một Object Customer. Khai báo Variable trong Scope của Block Trong thí dụ dưới đây, variable X được declared trong một IF.. THEN... END IF block. Khi execution ra khỏi IF block ấy, X sẽ bị hủy diệt. Do đó, VB.NET sẽ than phiền là X undefined vì nó không thấy X bên ngoài IF block. Luật nầy cũng áp dụng cho những Blocks khác như DO... LOOP, WHILE... END WHILE, FOR... NEXT,. v. v.. Private Sub Button1_Click(ByVal sender As System. Object, ByVal e As System.EventArgs) Handles Button1.Click Dim A As Integer = 5 Dim B As Integer = 5 If A = B Then Dim X As Integer ' X is declared in this IF block X = 12 End If A = X ' X has been destroyed, so it is undefined here End Sub Có lẽ bạn hỏi Declare Variable trong FOR... LOOP có lợi gì, tại sao ta không Declare một lần duy nhất ở đầu? Thứ nhất là Block giới hạn scope (phạm vi hoạt động) của một variable để nó không đụng chạm ai dễ gây nên bug, thứ hai là trường hợp điển hình ta sẽ cần feature nầy là trong một FOR... LOOP, cứ mỗi iteration ta muốn instantiate một Object mới. Khi ấy ta cần Declare một Object variable, instantiate Object, rồi chứa nó vào một collection chẳng hạn. 2.6 Truy cập Variable/Class/Structure Trong VB.NET ta có thể quyết định giới hạn việc truy cập một Variable, Class, Structure. v. v. bằng cách dùng các keywords sau: Loại truy cập Thí dụ Chú thích Public Public Class ClassForEverybody Cho phép ở đâu cũng dùng nó được. Ta chỉ có thể dùng Public ở mức độ Module, Namespace hay File. Tức là ta không thể dùng Public trong một Sub/Function. Protected Protected Class ClassForMyHeirs Cho phép các classes con, cháu được dùng. Ta chỉ có thể dùng Protected ở mức độ Class. Friend Friend StringForThisProject As String Cho phép code trong cùng một Project được dùng. Private Private NumberForMeOnly As Integer Cho phép code trong cùng module, class, hay structure được dùng. Lưu ý là Dim coi như tương đương với Private, do đó ta nên dùng Private cho dễ đọc. Ngoài ra, nhớ là nếu container (Object chứa) của một Variable/Class/Structure là Private thì dù ta có khai báo một Variable/Class/Structure nằm bên trong container là Public ta cũng không thấy nó từ bên ngoài. Thay đổi trong Array Array index từ 0 Trong VB.NET không có Option Base và mọi Array đều có index bắt đầu từ 0. Khi bạn khai báo một array như: Dim myArray(10) as integer Kết quả là một array có 11 elements và index từ 0 đến 10. UBound của array nầy là 10 và LBound của tất cả arrays trong VB.NET đều là 0. Khai báo Array với những trị số khởi đầu Bạn có thể khai báo Array với những trị số khởi đầu như sau: Dim myArray() as Integer = { 1, 5, 8, 16 } ' Note the curly brackets Statement làm hai chuyện: quyết định size của array và cho các elements trị số khởi đầu. Để dùng feature nầy, bạn không được nói rõ size của array, mà để cho program tự tính. ReDim Preserve Trong VB.NET bạn cũng có thể tiếp tục dùng Preserve keyword để giữ nguyên trị số của các elements trong một array khi bạn ReDim nó. Tuy nhiên có một giới hạn cho array với hơn một dimension - bạn chỉ có thể resize dimention cuối (bên phải), nên những hàng code sau đây hợp lệ: Dim myArray(, ) As String ReDim myArray(5, 5) ReDim Preserve myArray(5, 8) Thay đổi trong User-Defined Type Ý niệm User-Defined Type (UDT) rất tiện cho ta gom các mảnh data liên hệ lại thành một data type có cấu trúc. Trong VB6 ta dùng nó như sau: Public Type UStudent FullName as String Age as Integer End Type VB.NET cũng giữ y đặc tính của UDT nhưng thay đổi chữ Type thành Structure: Public Structure UStudent Public FullName as String Public Age as Integer End Structure Lưu ý các Structure Members (như FullName, Age ) cần phải được Declared với keyword Dim, Public, Private hay Friend, nhưng không thể dùng Protected vì Structure không thể Inherit từ một Structure khác. Sở dĩ, có dùng Private là vì bên trong Structure có thể có Property, Sub/Function. v. v.. Thay đổi trong Collections VB6 hổ trợ Collection và sau nầy Windows Scripting Host Library cho ta collection kiểu Dictionary. VB.NET cho ta một thành phần collection rất hùng hậu trong Namespace System.Collections. Vì Collection là một trong những công cụ rất thông dụng và hiệu năng trong VB.NET nên ta sẽ có một bài dành riêng cho collection sau nầy. Dưới đây là danh sách các collections ta sẽ dùng thường xuyên: Collection Chức năng ArrayList Dynamic Array tự động lớn lên khi elements được bỏ vào. BitArray Array chứa trị số Boolean (True/False). HashTable Collection chứa những cặp key-value data, cho ta dùng làm tự điển. Queue Chứa một FIFO (First In, First Out) structure.Element có thể là bất cứ Object loại nào. Stack Chứa một LIFO (Last In, First Out) structure. SortedList Chứa một danh sách những cặp key-value data được sắp theo thứ tự. Arithmetic Operators mới VB.NET cho ta thêm cách viết Arithmetic Operator mới mà C programmers quen từ lâu nay. X += 4 tương đương với X = X + 4 Mess &= " text" tương đương với Mess = Mess & " text" Arithmetic Operation Trong VB6 Cách viết tắc mới Cộng X = X +5 X += 5 Trừ X = X - 10 X -= 10 Nhân X = X * 7 X *= 7 Chia X = X / 19 X /= 19 Chia Integer X = X \ 13 X \= 13 Lũy thừa X = X ^ 3 X ^= 3 Ghép Strings X = X & "more text" X &= "more text" Ta vẫn có thể tiếp tục dùng cách viết trong VB6, nhưng bây giờ có thêm một cách viết gọn hơn. Short Circuit trong IF.. THEN Statement Trong VB6, nếu ta viết: Dim myInt as Integer myInt = 0 If (myInt 0) And (17 \ myInt < 5 ) Then Thì sẽ bị Division by Zero error, vì mặc dầu phần (myInt 0) là False, nhưng VB6 vẫn tiếp tục tính phần (17 \ myInt < 5 ), và tạo ra error vì 17 chia cho một số 0. Trong vài ngôn ngữ lập trình khác, khi (myInt 0) là False thì nó không tính thêm nữa, tức là nó nói rằng khi một phần của AND là False thì nhất định kết quả của Logical Statement trong IF phải là False. Ðặc tính nầy gọi là Short-Circuit (đi tắt). Nếu ta dùng code nói trên trong VB.NET, nó vẫn cho Division by Zero error giống như VB6. Tuy nhiên, nếu ta muốn dùng đặc tính Short-Circuit thì ta chỉ cần thay thế chữ And bằng AndAlso như sau: Dim myInt as Integer myInt = 0 If (myInt 0) AndAlso (17 \ myInt < 5 ) Then Short-Circuit cũng áp dụng cho Logical OR khi ta thay thế chữ Or bằng OrElse để nói rằng khi phần đầu của OR là True thì nhất định kết quả của Logical Statement trong IF phải là True. Không còn Set statement cho Object Trong VB6 ta có thể viết: Set x = New Product Set w = x Trong VB.NET sẽ được viết lại như sau: x = New Product() w = x Bây giờ ta không cần phải nhớ dùng chữ Set khi nói đến Object. Thay đổi trong cách viết Property routines Dùng một Property duy nhất Nếu trong VB6 ta viết: Private mdescription as String Public Property Let Description (Value As String) mdescription = Value End Property Public Property Get Description() As String Description = mdescription End Property Trong VB.NET Let và Get đuợc hợp lại trong một Property routine duy nhất và ta lại dùng chữ Set thay cho chữ Let (mặc dầu chữ Set không còn dùng cho Object như mới nói ở trên) như sau: Private mdescription As String Public Property Description() As String Set (ByVal Value As String) mdescription = Value End Set Get Description = mdescription End Get End Property ReadOnly và WriteOnly property Bây giờ nếu Property là ReadOnly ta sẽ viết: Public ReadOnly Property Age() As Integer Get Age = 3 End Get End Property hay WriteOnly ta sẽ viết: Private _data As Integer Public WriteOnly Property Data() As Integer Set (ByVal Value As String) _data = Value End Set End Property Default Properties Ta dùng Default keyword để tạo ra Default Property như sau: Default Public Property Item(ByVal Index As Integer) as String VB.NET bắt buộc ta phải ít nhất một parameter cho Default Property. Dùng Reserved Word làm Procedure Name Trong VB.NET ta có thể dùng Reserved Word làm Procedure Name bằng cách để nó giữa ngoặc vuông. Giả tỉ ta muốn dùng chữ Compare làm tên một Function, ta sẽ viết như sau: Public Function [Compare] (ByVal v1 As Integer, ByVal v2 As Integer) As Boolean Structured Error Handling TRY... CATCH... FINALLY VB.NET cho ta Structure TRY... CATCH... FINALLY... END TRY để xử lý error. Thí dụ như trong bài toán chia dưới đây, nếu bị Division by 0 error thì ta sẽ cho kết quả bằng 0. Dù có error hay không, program vẫn hiển thị kết quả trong Output Window qua statement Console. WriteLine( result) trong phần Finally: Try result = a / b ' if this section has error jump to Catch section Catch ' only get here if an error occurs between Try and Catch result = 0 Finally ' This section is optional, but is always executed whether there is an error or not Console. WriteLine( result) End Try Nếu ta không code gì ở phần Catch thì có nghĩa là chúng ta có Handle Error nhưng lại không làm gì hết, do đó Program sẽ không bị lỗi. Ngược lại, nếu ta không dùng Try.. Catch, thì program sẽ té. Nếu muốn nhảy ra khỏi Try Structure bất cứ lúc nào ta có thể dùng Exit Try, Những cách CATCH error Ta có thể dùng Catch giống như Select Case để có một cách xử lý cho mỗi error: Try ' Main code goes here Catch When Err.Number=5 ' handle Error 5 Catch ' handle other errors End Try Ta có thể Catch Error Exception data trong một variable để dùng nó như sau: Catch e as Exception MessageBox.Show (e.ToString) Hai cách code ở trên có thể được gợp lại thành: Catch e As Exception When Err.Number = 5 Thay đổi trong cách viết Sub/Function Dùng dấu ngoặc khi gọi Procedure Trong VB6, nếu không dùng keyword Call ta không dùng dấu ngoặc khi gọi Sub. Trong VB.NET ta luôn luôn dùng cặp dấu ngoặc, ngay cả khi không có parameter. Thí dụ: ProcessData() x = New Customer() ByVal là Default cho mọi Parameters Trong VB6, ByRef là default cho các parameters passed vô Sub/Function. Tức là, Sub/Function có thể vô tình làm thay thổi trị số nguyên thủy của parameter variables. Trong VB.NET, ByVal là default cho các parameters passed vô Sub/Function. Do đó, nó sẽ tránh lỗi lầm nói trên. Optional Parameter cần có trị số Default Trong VB6 ta có thể dùng IsMissing để biết xem Optional parameter có hiện diện không. VB.NET đã bỏ IsMissing và bắt buộc ta phải cung cấp trị số Default cho Optional parameter trong phần procedure declaration giống như sau đây: Public Sub VerifyInput (Optional ByVal InputData as String="") trong thí dụ nầy ta cho Default value của Optional parameter InputData là Empty string. Return Statement Hãy xem một thí dụ dùng Function để return một Customer Object trong VB6: Public Function GetCustomer (ByVal CustID As Long) As Customer Dim objCust As Customer Set objCust = New Customer objCust.Load CustID Set GetCustomer = objCust End Function Trong VB.NET ta có thể dùng Return Statement để Return kết quả của một Function thay vì dùng chính tên của Function. Public Function GetCustomer (ByVal CustID As Long) As Customer Dim objCust As New Customer(CustID) Return objCust End Function Những chức năng Đối Tượng mới của VB.NET VB.NET khắc phục những giới hạn về Đối Tượng (Object-Oriented) của VB6 và mang đến cho ta một ngôn ngữ lập trình hoàn toàn Object-Oriented (OO). Gần như mọi thứ trong VB.NET đều liên hệ với Object. Classes và Objects, nguyên tắc Abstraction Theo phương pháp đối tượng, program được thiết kế để một phần code đại diện cho một vật tương đương ngoài đời. Nó được gọi là Class. Khi lập trình VB6 ta đã dùng những controls từ Toolbox như Textbox, Label, Listbox.. v. v.. Textbox là Class của các Objects Text1, Text2. Cũng như Label1, Label2 là những Objects tạo ra từ Class Label. Ta hay dùng hai từ Class và Object lẫn lộn nhau. Điều đó không quan trọng, miễn là ta biết rằng Class là một ý niệm Trừu tượng (Abstraction), còn Object là một vật thực hữu. Thường thường khi ta phân tích một vấn đề để thiết kế chương trình thì các Danh từ (Nouns) là những Classes. Giả dụ ta phân tích hoạt động của một Nhà Kho (warehouse). Ta có phòng chứa, ngăn tủ, bãi nhận hàng, xe nâng hàng, nhân viên.. v. v. , mỗi thứ đều có thể là một Object nên ta sẽ thiết kế một Class cho nó. Fields, Properties, Methods và Events, nguyên tắc Encapsulation Class CaSĩ diễn tả CaSĩ là người như thế nào. Như SốBàiHát là một Public Variable của Class, được gọi là Field có thể được đọc/viết trực tiếp. Còn Kiểu tóc (dài, ngắn, màu đen, có sọc nâu... ), Giọng hát (cao, trầm,.. ). là những Properties. Chúng cũng giống như Field nhưng được implemented (thi hành) bằng cách dùng procedures Property Get và Property Set. Property Set có thể được coded để kiểm soát nếu "Kiểu tóc" không thích hợp thì sẽ bị loại bỏ. Ngược lại, nếu "Kiểu tóc" thích hợp và được áp dụng thì ta sẽ thấy kết quả ngay là CaSĩ lại đẹp thêm ra. Thường thường Fields và Properties là các Danh từ (Nouns). Inheritance (Thừa Kế) Nguyên tắc Encapsulation nói trên cho phép ta dùng nhiều Objects của một hay nhiều Classes một cách an toàn, tức là không sợ Methods của các Objects giẫm chân lên nhau. Polymorphism (Đa dạng) Polymorphism là khả năng dùng Class Members trùng tên của Objects thuộc về các Classes khác nhau. Polymorphism thể hiện dưới nhiều hình thức: Dùng OO trong VB.NET Tạo một Class mới Để một Class mới trong VB.NET IDE bằng cách dùng Menu Command Project | Add Class.Dialog Add New Item sẽ hiện ra, chọn Class trong số hình các Icons nằm trong khung bên phải của Dialog. Source code của Class mới nầy sẽ được chứa trong một VB source file với extension vb. Trong VB.NET tất cả mọi VB source files đều có extension.vb. System sẽ nhận diện ra loại VB file (form, class, module,. v. v.. ) nhờ đọc content của file, chớ không dựa vào file extension. Nếu bạn muốn đặt tên cho Class mới nầy là TheClass chẳng hạn, thì bạn có thể sửa tên nó trong Dialog. Khi bạn click button Open một file mới sẽ được cho thêm vào trong Project và nó chứa hai hàng code sau: Public Class TheClass End Class 2.7 Tạo một Class mới Class Keyword Trong một.vb file ta có thể viết nhiều Classes, code của mỗi Class nằm trong một Class... End Class block. Thí dụ: Public Class TheClass Public Sub Greeting() MessageBox.Show("Hello world", MsgBoxStyle.Information, "TheClass") End Sub End Class MessageBox.Show và MsgBoxStyle.Information trong VB.NET thay thế MsgBox và vbInformation trong VB6. Classes và Namespaces Nhắc lại là.NET dùng Namespace để sắp đặt các Classes cho thứ tự theo nhóm, loại. Namespaces được declared với một Block Structure giống như sau: Namespace Vovisoft Public Class TheClass Public Sub Greeting() MessageBox.Show("Hello world", MsgBoxStyle.Information, "TheClass") End Sub End Class End Namespace Muốn nói đến bất cứ Class, Structure, hay thứ gì được declared bên trong một Namespace... End Namespace block ta phải dùng tên Namespace trước. Thí dụ: Private myObject As Vovisoft.TheClass Một source file có thể chứa nhiều Namespaces, và bên trong mỗi Namespace lại có thể có nhiều Classes. Ngoài ra, Classes thuộc về cùng một Namespace có thể nằm trong nhiều files khác nhau trong một VB.NET project. Thí dụ ta có một source file với code như sau: Namespace Vovisoft Public Class TheClass ' Code End Class End Namespace Và một source file khác trong cùng project với code: Namespace Vovisoft Public Class TheOtherClass ' Code End Class End Namespace Vậy thì trong Namespace Vovisoft ta có hai Classes TheClass và TheOtherClass. Nhớ là, by default, Root Namespace của một VB.NET project là tên của project ấy. Khi ta dùng Namespace block structure là chúng ta đang thêm một tầng tên vào Root Namespace. Do đó, trong thí dụ trên nếu tên project là MyProject thì, từ bên ngoài project ấy, ta có thể declare một variable như sau: Private myObject As MyProject.Vovisoft.TheClass Tạo ra Methods Methods trong VB.NET có hai thứ: Sub và Function. Function thì phải return một kết quả. By default, parameters của Method là ByVal chớ không phải ByRef. Tức là nếu muốn parameter nào ByRef thì phải nhớ khai ra rõ ràng. Nhắc lại là khi một variable được passed vào trong một method bằng ByVal thì system cho method đó một copy (bản sao) của variable, do đó, trị số của variable không bị thay đổi bởi công tác của method. Ngược lại, nếu một variable được passed vào trong một method bằng ByRef thì method dùng chính variable đó, do đó, trị số của variable có thể bị thay đổi bởi công tác củ._.

Các file đính kèm theo tài liệu này:

  • doc2526.doc