Lập trình C sharp cơ bản - Chương 4: Class – Object – Method

pdf 54 trang vanle 1940
Bạn đang xem 20 trang mẫu của tài liệu "Lập trình C sharp cơ bản - Chương 4: Class – Object – Method", để 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:

  • pdflap_trinh_c_sharp_co_ban_chuong_4_class_object_method.pdf

Nội dung text: Lập trình C sharp cơ bản - Chương 4: Class – Object – Method

  1. Chương 4: CLASS – OBJECT – METHOD Bài 7: CLASS (LỚP) – OBJECT (ĐỐI TƯỢNG) – METHOD (PHƯƠNG THỨC) I. Khái niệm - Kiểu dữ liệu trong C# được định nghĩa là một lớp (class). - Thể hiện riêng của từng lớp được gọi là đối tượng (object). - Hai thành phần chính cấu thành một lớp (class) là thuộc tính / tính chất và phương thức (method) / hành động ứng xử của đối tượng. II. Định nghĩa lớp (class) 1. Cú pháp [Thuộc tính] [Bổ sung truy cập] class [: Lớp cơ sở] { // Các thuộc tính // Các phương thức } 2. Ví dụ 7.1 * Khởi tạo một ứng dụng Windows Forms Application, lưu với tên là Vi Du 7.1 như sau: * Yêu cầu - Thiết kế form gồm: lbl1, txtHoTen, lbl2, lblKQ, và các button (xem hình). - Tạo class Chuoi như sau: public class Chuoi { // Thuộc tính // Phương thức } + Trong phần thuộc tính, khai báo: Lưu hành nội bộ Trang 47
  2. string tenchuongtrinh = "Chương trình xử lý họ và tên!"; + Trong phần phương thức, khai báo các phương thức sau: // Phương thức public string In() { // In tên chương trình return tenchuongtrinh; } public string Ten(string hoten) { // Lấy tên int lio=hoten.LastIndexOf(" "); return hoten.Substring(lio+1, hoten.Length-lio-1); } public string HoLot(string hoten) { // Lấy họ và lót int lio = hoten.LastIndexOf(" "); return hoten.Substring(0,lio); } public int CountOfWord(string hoten) { // Đếm số từ trong chuỗi // Tạo ra hằng ký tự khoảng trắng const char Space =' '; // Gán giá trị cho chuỗi string s = hoten.Trim(); // Thực hiện việc chia chuỗi thành mảng > Đếm từ cWord = s.Split(Space)).Length ; // Gởi kết quả trả về return cWord; } Tham khảo thêm đoạn code sau: // Đếm số từ trong chuỗi HoTen int count = 0; string s = hoten.Trim(); for (int i = 0; i 0) count++; return count; public string Proper(string hoten) { Lưu hành nội bộ Trang 48
  3. // Đổi thành chữ Hoa Đầu Từ trong chuỗi txtHoTen // Tạo ra hằng ký tự khoảng trắng const char Space = ' '; // Gán giá trị cho chuỗi string s = hoten.Trim(); // Đổi chuỗi string kq = "Chuỗi rỗng!"; if (s.Length == 0) return kq; else { kq = ""; string [] s1 = s.Split(Space); foreach (string tu in s1) { string ss = tu[0].ToString(); kq += ss.ToUpper(); kq += tu.Substring(1,tu.Length-1); kq += " "; } return kq.Trim(); } Tham khảo thêm đoạn code sau: // Đổi thành chữ Hoa Đầu Từ trong chuỗi txtHoTen string s = hoten.Trim(); string kq = "Chuỗi rỗng!"; if (s.Length > 0) { kq = s.Substring(0, 1).ToUpper(); for (int i = 1; i < s.Length; i++) { if ((s[i - 1].ToString() == " ") && (s[i].ToString() != " ")) { string ss = s[i].ToString(); kq += ss.ToUpper(); } else kq += s[i].ToString(); } } return kq; - Sử dụng các phương thức trên để thực hiện các việc sau đây (xuất kết quả trong lblKQ): + Nhắp vào button In Lời giới thiệu, sẽ in lời giới thiệu. + Nhắp button Họ Lót, tách lấy họ lót của chuỗi trong txtHoTen. + Nhắp button Tên, tách lấy tên của chuỗi trong txtHoTen. + Nhắp button Đếm từ, đếm số từ của chuỗi trong txtHoTen. + Nhắp button Hoa Đầu Từ, đổi thành chuỗi Hoa Đầu Từ của chuỗi trong txtHoTen. Lưu hành nội bộ Trang 49
  4. - Nhắp button Xóa thì xóa trống: TextBox txtHoTen, Label lblKQ đồng thời đưa con trỏ vào TextBox txtHoTen. - Nhắp button Dừng thì dừng chương trình. * Hướng dẫn - Thiết kế form như yêu cầu. - Khai báo class: qua code, thêm đoạn code để được kết quả như sau public Form1() { InitializeComponent(); } public class Chuoi { // Thuộc tính (1) // Phương thức (2) } + Trong phần (1), khai báo thuộc tính (xem đề bài) + Trong phần (2), khai báo phương thức (xem đề bài) - Nhắp đúp vào button In Lời giới thiệu, thêm vào đoạn code: Chuoi s = new Chuoi(); this.lblKQ.Text = s.In(); - Nhắp đúp vào button Họ lót, thêm vào đoạn code: Chuoi s = new Chuoi(); this.lblKQ.Text="Họ lót: " + s.HoLot(this.txtHoTen.Text); - Nhắp đúp vào button Tên, thêm vào đoạn code: Chuoi s = new Chuoi(); this.lblKQ.Text = "Tên là: " + s.Ten(this.txtHoTen.Text); - Nhắp đúp vào button Đếm từ, thêm vào đoạn code: Chuoi s = new Chuoi(); this.lblKQ.Text = "Tổng số từ là: " ; this.lblKQ.Text += s.CountOfWord(this.txtHoTen.Text); - Nhắp đúp vào button Hoa Đầu Từ, thêm vào đoạn code: Chuoi s = new Chuoi(); this.lblKQ.Text = "Kết quả là: " ; this.lblKQ.Text += s.Proper(this.txtHoTen.Text); - Nhắp đúp vào button Xóa, thêm vào đoạn code: this.lblKQ.Text = ""; this.txtHoTen.ResetText(); this.txtHoTen.Focus(); - Nhắp đúp vào button Dừng, thêm vào đoạn code: Application.Exit(); * Bổ sung - Nút button In Hoa: đổi thành chuỗi IN HOA của chuỗi trong txtHoTen . - Nút button In Thường: đổi thành chuỗi in thường của chuỗi trong txtHoTen. III. Properties - Method 1. Thuộc tính (Properties): Lưu hành nội bộ Trang 50
  5. Thuộc tính là những thông tin có thể thay đổi được. 2. Thuộc tính truy cập Thuộc tính Giới hạn truy cập public Không hạn chế. Những thành viên được đánh dấu public có thể được dùng bất kỳ các phương thức của lớp, bao gồm cả những lớp khác. private Thành viên trong lớp được đánh dấu private chỉ được dùng các phương thức của lớp này mà thôi. Protected Thành viên trong lớp được đánh dấu protected chỉ được dùng các phương thức của lớp này; và các phương thức của lớp dẫn xuất từ lớp này. Internal Thành viên trong lớp được đánh dấu là internal được dùng các phương thức của bất kỳ lớp nào cùng khối hợp ngữ với lớp này. protected internal Thành viên trong lớp được đánh dấu là protected internal được dùng các phương thức của lớp này; các phương thức của lớp dẫn xuất từ lớp này; và các phương thức của bất kỳ lớp nào trong cùng khối hợp ngữ với lớp này. 3. Phương thức (Method) - Phương thức (method) chính là các hàm (function) được tạo trong lớp (class). - Tên của phương thức thường được đặt theo tên của hành động. 4. Tham số của phương thức a) Khái niệm: - Các tham số theo sau tên phương thức và được bọc bên trong dấu ngoặc tròn (). - Mỗi tham số phải khai báo kèm theo kiểu dữ liệu. - Trong C# có 2 dạng truyền tham số: + Truyền tham chiếu: dùng thêm từ khóa ref. + Truyền tham trị b) Ví dụ: * Truyền tham số cho phương thức theo kiểu tham chiếu public class Hoandoi { public void HoanVi(ref int a, ref int b) { int c = a ; a = b ; b = c ; } } Khi đó: khi gọi hàm HoanVi ta phải truyền tham số dưới dạng tham chiếu như sau: HoanDoi s = new HoanDoi(); s.HoanVi(ref a, ref b); * Truyền tham số cho phương thức theo kiểu tham trị public class HoanDoi { public void HoanVi(int a, int b) Lưu hành nội bộ Trang 51
  6. { int c = a ; a = b ; b = c ; } } 5. Ví dụ 7.2 * Khởi tạo một ứng dụng Windows Forms Application, lưu với tên là Vi Du 7.2 như sau: * Yêu cầu - Thiết kế form gồm: lbl1, txta, lbl2, txtb, và các button (xem hình). - Tạo các class HoanDoi, trong class có hàm HoanVi cho phép hoán vị 2 giá trị số nguyên. - Nhắp button Hoán Đổi sẽ hoán đổi 2 giá trị trong txta và txtb - Nhắp button Xóa sẽ xóa trống 2 TextBox và đưa con trỏ vào ô txta. - Nhắp button Dừng sẽ dừng chương trình. * Hướng dẫn - Thiết kế form như yêu cầu. - Khai báo class: qua code, thêm đoạn code để được kết quả như sau public Form1() { InitializeComponent(); } public class HoanDoi { public void HoanVi(ref int a,ref int b) { int c = a ; a = b ; b = c ; } } - Nhắp đúp vào button Hoán đổi, thêm vào đoạn code: int a = int.Parse(this.txta.Text); int b = int.Parse(this.txtb.Text); HoanDoi s = new HoanDoi(); s.HoanVi(ref a, ref b); this.txta.Text = a.ToString(); this.txtb.Text = b.ToString(); Lưu hành nội bộ Trang 52
  7. - Nhắp đúp vào button Xóa, thêm vào đoạn code: this.txta.ResetText(); this.txtb.ResetText(); this.txta.Focus(); - Nhắp đúp vào button Dừng, thêm vào đoạn code: Application.Exit(); Bài tập Khởi tạo một ứng dụng Windows Forms Application: 1. Tạo một class có tên là BAI_TAP_CLASS, có các hàm: - Hàm TEN nhận vào một chuỗi chỉ họ và tên, giá trị trả lại của hàm là chuỗi chỉ tên. - Hàm NGTO nhận vào một số nguyên n, giá trị trả lại của hàm là true nếu n là số nguyên tố; là false nếu n không là số nguyên tố. 2. Thiết kế form có: - TextBox txtHoTen: nhập họ và tên. - TextBox txtn: nhập số nguyên n. - TextBox txtKQ: xuất kết quả. - Button btnTEN: gọi hàm TEN xử lý chuỗi họ và tên, xuất kết quả vào txtKQ. - Button btnNGTO: gọi hàm NGTO xử lý số nguyên n, xuất kết quả vào txtKQ. - Button btnXoa: xóa trống tất cả các TextBox và đưa con trỏ vào ô txtHoTen - Button btnDung: dừng chương trình. oOo Lưu hành nội bộ Trang 53
  8. Chương 5: SQL SERVER 2008 Bài 8: SQL SERVER 2008 I. Tổng quan về SQL 1. Khái niệm SQL - SQL (Structured Query Language – ngôn ngữ hỏi có cấu trúc) là 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 cơ sở dữ liệu quan hệ. - 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. 2. Vai trò của SQL - SQL không phải là một hệ quản trị cơ sở dữ liệu, do nó không thể tồn tại độc lập. - SQL 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. - 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. Lưu hành nội bộ Trang 54
  9. • 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. II. Tổng quan về cơ sở dữ liệu (CSDL) quan hệ 1. Mô hình dữ liệu quan hệ - CSDL quan hệ là một CSDL trong đó tất cả dữ liệu được tổ chức trong các bảng (table) có mối quan hệ với nhau. Mỗi bảng (table) bao gồm các dòng (record/bản ghi/bộ) và các cột (field/trường/thuộc tính). - Tóm lại, một CSDL bao gồm nhiều bảng (table) có mối quan hệ với nhau (relationship). Ví dụ: 2. Bảng (Table) Bảng (table) bao gồm các yếu tố sau: - Tên của bảng: được xác định duy nhất. - Cấu trúc của bảng: tập hợp các cột (field/trường/thuộc tính). - Dữ liệu của bảng: tập hợp các dòng (record/bản ghi/bộ) hiện có trong bảng. Ví dụ: Table DONVI 3. Khóa chính của bảng (Primary Key) - Mỗi bảng phải có một cộ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 tập hợp các dòng trong bảng. - Một cột (hoặc một tập các cột) có tính chất này gọi là khóa chính của bảng (Primary Key). Ví dụ: Table DONVI Lưu hành nội bộ Trang 55
  10. (có khóa chính là MADONVI) 4. Mối quan hệ (Relationship) và khóa ngoại (Foreign Key) - Mối quan hệ (Relationship) đượ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 ở một bảng khác. - Một cột (hoặc tập hợp các cột) (field/trường/thuộc tính) trong một bảng mà giá trị của nó được xác định từ khóa chính (Primary Key) của một bảng khác được gọi là khóa ngoại (Foreign Key). 5. Sơ lược về câu lệnh SQL Câu lệnh Chức năng Thao tác dữ liệu SELECT Truy xuất dữ liệu INSERT Bổ sung dữ liệu UPDATE Cập nhật dữ liệu DELETE Xóa dữ liệu TRUNCATE Xóa toàn bộ dữ liệu trong bảng Định nghĩa dữ liệu CREATE TABLE Tạo bảng DROP TABLE Xóa bảng ALTER TABLE Sửa cấu trúc bảng CREATE FUNCTION Tạo hàm (do người sử dụng định nghĩa) ALTER FUNCTION Sửa đổi hàm DROP FUNCTION Xóa hàm Lưu hành nội bộ Trang 56
  11. CREATE TRIGGER Tạo trigger ALTER TRIGGER Sửa trigger DROP TRIGGER Xóa trigger 6. Quy tắc sử dụng tên trong SQL - Trong câu lệnh SQL, nếu ta cần chỉ đến một bảng do một người dùng khác sở hữu (hiển nhiên là phải được phép) thì tên của bảng phải được viết sau tên của người sở hữu và phân cách với tên người sở hữu bởi dấu chấm theo công thức: tên_người_sở_hữu.tên_bảng - Trong câu lệnh SQL, nếu có sử dụng từ hai cột trở lên có cùng tên trong các bảng khác nhau thì bắt buộc phải chỉ định thêm tên bảng trước tên cột; tên bảng và tên cột được phân cách nhau bởi dấu chấm theo công thức: tên_bảng.tên_cột 7. Kiểu dữ liệu Tên kiểu Mô tả 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) 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) IMAGE Dữ liệu nhị phân với độ dài chính xác ( Lớn hơn = Lớn hơn hoặc bằng Lưu hành nội bộ Trang 57
  12. Khác !> Không lớn hơn ! b) LIKE Mô tả khuôn dạng dữ liệu cần tìm kiếm có sử dụng ký tự đại diện: % Chuỗi ký tự bất kỳ _ Một ký tự bất kỳ [] Ký tự bất kỳ trong giới hạn được chỉ định [^] Ký tự bất kỳ không nằm trong giới hạn được chỉ định III. Table (Bảng) * Quy tắc khi viết câu lệnh SQL: - Các câu lệnh SQL không phân biệt chữ hoa và chữ thường. Tuy nhiên, để dễ đọc nên viết hoa từ khóa trong mệnh đề. - Câu lệnh SQL có thể viết trên một dòng hay nhiều dòng. Nhưng nên viết mỗi dòng một mệnh đề. - Không tách từ khóa trên nhiều dòng, không viết tắt từ khóa. - Câu lệnh SQL kết thúc bằng dấu chấm phẩy (;) 1. Tạo bảng Cú pháp: CREATE TABLE tên_bảng ( tên_cột thuộc_tính_cột các_ràng_buộc [ , , tên_cột_n thuộc_tính_cột_n các_ràng_buộc_cột_n ] [ , các_ràng_buộc_trên_bảng ] ) Trong đó: tên_bảng Tên của bảng cần tạo (<=128 ký tự) tên_cột Tên của cột (field / trường) cần định nghĩa thuộc_tính_cột Gồm: • Kiểu dữ liệu của cột (field). • Giá trị mặc định của cột (filed). • IDENTITY - giá trị tự động tăng, dùng với field kiểu số. • NULL / NOT NULL các_ràng_buộc Các ràng buộc được sử dụng trên mỗi cột (field) hoặc trên bảng. Ví dụ 8.1: Lưu hành nội bộ Trang 58
  13. Tạo bảng NHANVIEN gồm các field MANV (mã nhân viên), HOTEN (họ và tên), NGAYSINH (ngày sinh của nhân viên), DIACHI (địa chỉ của nhân viên), HSLUONG (hệ số lương), MADONVI (mã đơn vị). * Hướng dẫn: CREATE TABLE nhanvien ( manv NVARCHAR(10) NOT NULL, hoten NVARCHAR(50) NOT NULL, ngaysinh DATE NULL, diachi NVARCHAR(100) NULL, dienthoai NVARCHAR(10) NULL, hsluong DECIMAL(3,2) DEFAULT (1.92) madonvi NVARCHAR(10) NOT NULL ) 2. Tạo ràng buộc a. Ràng buộc CHECK: - Chỉ định điều kiện hợp lệ đối với dữ liệu khi có sự thay đổi dữ liệu trên bảng. - Dùng với các lệnh INSERT, UPDATE. Cú pháp: [CONSTRAINT tên_ràng_buộc] CHECK (điều_kiện) Ví dụ 8.2: Tạo bảng NHANVIEN như ví dụ 8.1, trong đó: - NGAYSINH < '1/1/1990' - DIENTHOAI của nhân viên là một chuỗi 6 chữ số. * Hướng dẫn: CREATE TABLE nhanvien ( manv NVARCHAR(10) NOT NULL, hoten NVARCHAR(50) NOT NULL, ngaysinh DATE NULL CONSTRAINT CK_nhanvien_ngaysinh CHECK (ngaysinh < '1/1/1990'), diachi NVARCHAR(100) NULL, dienthoai NVARCHAR(10) NULL, CONSTRAINT CK_nhanvien_dienthoai CHECK (dienthoai LIKE '[0-9][0-9][0-9][0-9][0-9][0-9]___') hsluong DECIMAL(3,2) DEFAULT (1.92) madonvi NVARCHAR(10) NOT NULL ) b. Ràng buộc PRIMARY KEY: - Chỉ định khoá chính của bảng. Cú pháp: [CONSTRAINT tên_ràng_buộc] PRIMARY KEY [(danh_sách_cột)] Lưu ý: • Mỗi bảng có nhiều nhất một ràng buộc PRIMARY KEY. • Một khoá chính có thể bao gồm nhiều cột nhưng không vượt quá 16 cột. Lưu hành nội bộ Trang 59
  14. Ví dụ 8.3: Tạo bảng NHANVIEN như ví dụ 8.2, với khoá chính là MANV * Hướng dẫn: CREATE TABLE nhanvien ( manv NVARCHAR(10) NOT NULL, hoten NVARCHAR(50) NOT NULL, ngaysinh DATE NULL CONSTRAINT CK_nhanvien_ngaysinh CHECK (ngaysinh < '1/1/1990'), diachi NVARCHAR(100) NULL, dienthoai NVARCHAR(10) NULL, CONSTRAINT CK_nhanvien_dienthoai CHECK (dienthoai LIKE '[0-9][0-9][0-9][0-9][0-9][0-9]___') hsluong DECIMAL(3,2) DEFAULT (1.92) madonvi NVARCHAR(10) NOT NULL, CONSTRAINT PK_nhanvien_manv PRIMARY KEY ) c. Ràng buộc UNIQUE: - Chỉ định khoá phụ cho bảng. Cú pháp: [CONSTRAINT tên_ràng_buộc] UNIQUE [(danh_sách_cột)] Ví dụ 8.4: Tạo bảng NHANVIEN như ví dụ 8.3, trong đó không cho phép các nhân viên khác nhau được trùng điện thoại với nhau. * Hướng dẫn: CREATE TABLE nhanvien ( manv NVARCHAR(10) NOT NULL, hoten NVARCHAR(50) NOT NULL, ngaysinh DATE NULL CONSTRAINT CK_nhanvien_ngaysinh CHECK (ngaysinh < '1/1/1990'), diachi NVARCHAR(100) NULL, dienthoai NVARCHAR(10) NULL, CONSTRAINT CK_nhanvien_dienthoai CHECK (dienthoai LIKE '[0-9][0-9][0-9][0-9][0-9][0-9]___') hsluong DECIMAL(3,2) DEFAULT (1.92) madonvi NVARCHAR(10) NOT NULL, CONSTRAINT PK_nhanvien_manv PRIMARY KEY, CONSTRAINT UNIQUE_nhanvien_dienthoai UNIQUE(dienthoai) ) d. Ràng buộc FOREIGN KEY (khóa ngoại) - Một cột (hay một tập các cột) trong một bảng được gọi là khoá ngoại (ràng buộc FOREIGN KEY) nếu giá trị của nó được xác định từ khoá chính (PRIMARY KEY) hoặc khoá phụ (UNIQUE) của một bảng dữ liệu khác. Cú pháp: [CONSTRAINT tên_ràng_buộc] Lưu hành nội bộ Trang 60
  15. FOREIGN KEY [(danh_sách_cột)] REFERENCES tên_bảng_tham_chiếu(danh_sách_cột_tham_chiếu) [ON DELETE CASCADE | NO ACTION | SET NULL | SET DEFAULT] [ON UPDATE CASCADE | NO ACTION | SET NULL | SET DEFAULT] Trong đó: · CASCADE: Tự động xoá (cập nhật) nếu bản ghi được tham chiếu bị xoá (cập nhật). · NO ACTION (Mặc định): Nếu bản ghi trong bảng tham chiếu đang được tham chiếu bởi một bản ghi bất kỳ trong bảng được định nghĩa thì bàn ghi đó không được phép xoá hoặc cập nhật (đối với cột được tham chiếu). · SET NULL: Cập nhật lại khoá ngoài của bản ghi thành giá trị NULL (nếu cột cho phép nhận giá trị NULL). · SET DEFAULT: Cập nhật lại khoá ngoài của bản ghi nhận giá trị mặc định (nếu cột có qui định giá trị mặc định). Ví dụ 8.5: Tạo bảng NHANVIEN như ví dụ 8.4, trong đó khoá ngoài trên cột MADONVI (bảng DONVI). Giả sử rằng bảng DONVI đã được định nghĩa. * Hướng dẫn: CREATE TABLE nhanvien ( manv NVARCHAR(10) NOT NULL, hoten NVARCHAR(50) NOT NULL, ngaysinh DATE NULL CONSTRAINT CK_nhanvien_ngaysinh CHECK (ngaysinh < '1/1/1990'), diachi NVARCHAR(100) NULL, dienthoai NVARCHAR(10) NULL, CONSTRAINT CK_nhanvien_dienthoai CHECK (dienthoai LIKE '[0-9][0-9][0-9][0-9][0-9][0-9]___') hsluong DECIMAL(3,2) DEFAULT (1.92) madonvi NVARCHAR(10) NOT NULL, CONSTRAINT PK_nhanvien_manv PRIMARY KEY, CONSTRAINT UNIQUE_nhanvien_dienthoai UNIQUE(dienthoai) , CONSTRAINT FK_nhanvien_madonvi FOREIGN KEY(madonvi) REFERENCES donvi(madonvi) ON DELETE CASCADE ON UPDATE CASCADE ) 3. Sửa cấu trúc bảng a. Cú pháp ALTER TABLE tên_bảng ADD định_nghĩa_cột | ALTER COLUMN tên_cột kiểu_dữ_liêu [NULL | NOT NULL] | DROP COLUMN tên_cột | ADD CONSTRAINT tên_ràng_buộc định_nghĩa_ràng_buộc | DROP CONSTRAINT tên_ràng_buộc b. Ví dụ 8.6 Lưu hành nội bộ Trang 61
  16. Bổ sung vào bảng DONVI ở ví dụ 8.5, cột GHICHU * Hướng dẫn: ALTER TABLE nhanvien ADD ghichu NVARCHAR(50) 4. Xóa bảng a. Cú pháp DROP TABLE tên_bảng b. Ví dụ 8.7: Xoá bảng DONVI ra khỏi CSDL. Lưu ý: Cột MADONVI trong bảng DONVI đang được tham chiếu bởi khoá ngoài FK_nhanvien_madonvi trong bảng NHANVIEN. * Hướng dẫn: - Xoá bỏ ràng buộc FK_nhanvien_madonvi khỏi bảng NHANVIEN ALTER TABLE nhanvien DROP CONSTRAINT FK_nhanvien_madonvi - Xoá bảng DONVI: DROP TABLE donvi Thực hành 1. Khởi động SQL SERVER 2008: a. Start à All programs à Microsoft SQL Server 2008 à SQL Server Management Studio b. Chứng thực: chọn 1 trong 2 chế độ v Là của Windows v Là của SQL Server c. Chọn Connect 2. Tạo database: Ở cửa sổ Object Explorer, click chuột phải vào Database sau đó chọn New database - Database nane: banhang - Chọn Ok 3. Tạo cấu trúc table: a. Tạo table Nhanvien Lưu hành nội bộ Trang 62
  17. * Ở cửa sổ Object Explorer: - Nhắp dấu + trước database banhang (thành dấu -) - Click chuột phải vào Table sau đó chọn New table - Khai báo cấu trúc: Ví dụ 8.1 - Lưu: nhắp b. Tạo table Donvi : tự thực hiện. 4. Tạo ràng buộc cho table * Chọn table Nhanvien a. Ràng buộc CHECK Ví dụ 8.2 * Ở cửa sổ hiển thị cấu trúc của table Nhanvien - Click chuột phải vào field ngaysinh, chọn CheckConstraints - Nhắp Add + (Name): gõ CK_nhanvien_ngaysinh Expression: gõ ([ngaysinh] < '1/1/1990') - Nhắp Add (lần 2) + (Name): gõ CK_nhanvien_dienthoai + Expression: gõ (dienthoai LIKE '[0-9][0-9][0-9][0-9][0-9][0-9]___') - Nhắp Close * Chọn table Donvi: tự thực hiện cho field dienthoai. b. Ràng buộc PRIMARY KEY * Chọn table Nhanvien Ví dụ 8.3 * Ở cửa sổ hiển thị cấu trúc của table Nhanvien - Click phải chuột vào field manv và chọn Set Primary Key * Cho table Donvi: tự thực hiện cho field madonvi . c. Ràng buộc UNIQUE * Chọn table Nhanvien Ví dụ 8.4 * Ở cửa sổ hiển thị cấu trúc của table Nhanvien - Click phải chuột vào field dienthoai và chọn Indexes / Keys - Nhắp Add + (Name): gõ UNIQUE_nhanvien_dienthoai + Columns: dienthoai (ASC) + Type: Unique Key - Nhắp Close 5. Tạo quan hệ (relationship) cho các table: Donvi, Nhanvien Ví dụ 8.5 * Ở cửa sổ Object Explorer - Click chuột phải vào Database Diagrams sau đó chọn New database Diagram - Chọn các table tham gia tạo quan hệ, nhắp Close. - Rê field madonvi (từ table nhanvien) thả vào field madonvi (của table donvi). - Khai báo: Primary key table Foreign key table Donvi Nhanvien madonvi madonvi Lưu hành nội bộ Trang 63
  18. 6. Thêm field GHICHU vào table DONVI Ví dụ 8.6 * Ở cửa sổ hiển thị cấu trúc của table Donvi - Khai báo (ở cuối) thêm field: ghichu, nvarchar(50), NULL 7. Nhập dữ liệu cho các table: Donvi, Nhanvien * Ở cửa sổ Object Explorer: - Click chuột phải vào dbo.donvi / dbo.nhanvien sau đó chọn Edit top 200 Rows - Nhập dữ liệu oOo Lưu hành nội bộ Trang 64
  19. Bài 9: CÁC CÂU LỆNH TRUY VẤN * Xét CSDL banhang gồm các table: NHANVIEN, DONVI, MATHANG, NHATKYBANHANG - Cấu trúc: - Dữ liệu: Bảng NHANVIEN Bảng DONVI Lưu hành nội bộ Trang 65
  20. IV. Các câu lệnh truy vấn 1. Câu lệnh SELECT Công dụng: - Chọn các field từ bảng. Cú pháp: SELECT [ALL | DISTINCT][TOP n] danh_sách_chọn [INTO tên_bảng_mới] FROM danh_sách_bảng [ | khung_nhìn] [WHERE điều_kiện] [GROUP BY danh_sách_cột] [HAVING điều_kiện] [ORDER BY cột_sắp_xếp] [COMPUTE danh_sách_hàm_gộp [BY danh_sách_cột]] Chú ý: Các thành phần trong câu lệnh SELECT phải được sử dụng theo đúng thứ tự trên. c. Danh sách chọn trong câu lệnh SELECT - Chọn tất cả các field Ví dụ 9.1a: Câu lệnh sau đây cho biết thông tin của các nhân viên trong bảng NHANVIEN. SELECT * FROM nhanvien n1 - Đổi tên các cột trong kết quả Ví dụ 9.1b: Câu lệnh sau đây cho biết HOTEN (họ tên) được đổi thành Họ và Tên, DIACHI (địa chỉ) được đổi thành Địa Chỉ của các nhân viên trong bảng NHANVIEN. SELECT 'Họ và Tên' = hoten, 'Địa Chỉ' = diachi FROM nhanvien Hoặc: SELECT hoten 'Họ và Tên', diachi 'Địa Chỉ' FROM nhanvien - Sử dụng cấu trúc CASE để đổi tên các cột trong kết quả Ví dụ 9.1c: Câu lệnh sau đây cho biết HOTEN (họ tên), HSLUONG (hệ số lương) và (xếp loại lương) của các nhân viên trong bảng NHANVIEN theo HSLUONG (hệ số lương). SELECT 'Họ và Tên'= hoten, 'Hệ số lương' = hsluong, 'Hệ số lương' = CASE WHEN hsluong = NULL THEN 'Không xác định' WHEN hsluong <= 1.92 THEN 'Lương thấp' WHEN hsluong <= 3.11 THEN 'Lương trung bình' WHEN hsluong <= 5.2 THEN 'Lương cao' ELSE 'Lương rất cao' END FROM nhanvien - Thêm chuỗi ký tự trong kết quả Ví dụ 9.1d: Câu lệnh sau đây sẽ cho thêm chuỗi 'Hệ số lương là:' ở trước cột HSLUONG (hệ số lương) trong từng dòng kết quả. SELECT 'Họ và Tên' = hoten, 'Hệ số lương là:', 'Hệ số lương' = hsluong FROM nhanvien - Tính toán các giá trị trong câu lệnh SELECT Lưu hành nội bộ Trang 66
  21. Ví dụ 9.1e: Câu lệnh sau đây sẽ cho HOTEN (họ tên) và LUONG (lương) của nhân viên theo công thức LUONG = HSLUONG * 730000. SELECT 'Họ và Tên' = hoten, 'Lương' = hsluong * 730000 FROM nhanvien - Từ khóa DISTINCT: dùng để loại bỏ những dòng dữ liệu có kết quả giống nhau Ví dụ 9.1f: Câu lệnh sau sẽ cho các giá trị hsluong khác nhau trong bảng NHANVIEN SELECT hsluong FROM nhanvien - Tạo bảng mới bằng câu lệnh SELECT INTO Ví dụ 9.1g: Câu lệnh sau sẽ tạo bảng có tên NHANVIEN_LUU gồm các field HOTEN (họ tên), DIACHI (địa chỉ) của các nhân viên có HSLUONG > 1.92 từ bảng NHANVIEN. SELECT hoten, diachi INTO nhanvien_luu FROM nhanvien WHERE hsluong > 1.92 - Sắp xếp kết quả (ASC: tăng, DESC: giảm) bằng ORDER BY Ví dụ 9.1h: Câu lệnh sau đây sẽ sắp xếp các nhân viên theo thứ tự giảm dần của HSLUONG (hệ số lương), nếu HSLUONG bằng nhau thì sắp xếp kết quả theo thứ tự tăng dần của NGAYSINH (ngày sinh) SELECT hoten, ngaysinh, hsluong FROM nhanvien ORDER BY hsluong DESC, ngaysinh ASC d. Xác định bảng bằng mệnh đề FROM FROM danh_sách_bảng [ | khung_nhìn] Ví dụ 9.1i: Câu lệnh sau đây cho biết HOTEN (họ tên), DIACHI (địa chỉ) của các nhân viên bằng cách gán bí danh (alias) cho bảng NHANVIEN. SELECT hoten, diachi FROM nhanvien n1 e. Đặt điều kiện truy xuất dữ liệu bằng mệnh đề WHERE WHERE điều_kiện điều_kiện: sử dụng các phép toán sau + So sánh: = , > , = , , !> , ! 1.92 Lưu hành nội bộ Trang 67
  22. Ví dụ 9.1k: Câu lệnh sau đây cho biết HOTEN (họ tên), DIACHI (địa chỉ) và DIENTHOAI (điện thoại) của các nhân viên có HSLUONG (hệ số lương) trong khoảng 1.92 đến 3.11 SELECT hoten, diachi FROM nhanvien WHERE hsluong BETWEEN 1.92 AND 3.11 Ví dụ 9.1l: Câu lệnh sau đây cho biết HOTEN (họ tên), DIACHI (địa chỉ) và DIENTHOAI (điện thoại) của các nhân viên có HSLUONG (hệ số lương) là 1.86, 1.92, 2.11 SELECT hoten, diachi FROM nhanvien WHERE hsluong IN (1.86, 1.92, 2.11) * Hoặc: SELECT hoten, diachi FROM nhanvien WHERE hsluong = 1.86 OR hsluong = 1.92 OR hsluong = 2.11 Ví dụ 9.1m: Câu lệnh sau đây cho biết thông tin của nhân viên có tên là NAM. SELECT * FROM nhanvien WHERE hoten LIKE '%NAM' Ví dụ 9.1n: Câu lệnh sau đây cho biết thông tin của nhân viên không có điện thoại. SELECT * FROM nhanvien WHERE dienthoai IS NULL 2. Thêm dữ liệu INSERT Công dụng: - Thêm dòng dữ liệu (mẫu tin/record) vào bảng. Cú pháp: INSERT INTO tên_bảng [(danh_sách_cột)] VALUES(danh_sách_trị) Ví dụ 9.2a: Câu lệnh sau đây thêm một dòng dữ liệu vào bảng DONVI INSERT INTO donvi VALUES('06', 'Phòng CTCT-HSSV', '821460') Ví dụ 9.2b: Câu lệnh sau đây thêm một dòng dữ liệu vào bảng NHANVIEN INSERT INTO nhanvien VALUES('NV02003', 'Lê Thị Mai', '23/05/1972', NULL, '523312', 1.92, '02') Ví dụ 9.2c: Câu lệnh sau đây thêm một dòng dữ liệu vào bảng NHANVIEN nhưng chỉ điền dữ liệu vào một số cột. INSERT INTO nhanvien(manv, hoten, diachi, madonvi) VALUES('NV05002', 'Nguyễn Thị Hạnh Dung', '56 Trần Phú', '05') Ví dụ 9.2d: Thêm dữ liệu vào bảng với dữ liệu lấy từ bảng khác Câu lệnh sau đây thêm dữ liệu vào bảng LUONG_NHANVIEN với dữ liệu lấy từ bảng NHANVIEN. Lưu hành nội bộ Trang 68
  23. INSERT INTO luong_nhanvien SELECT manv, hoten, hsluong*730000 FROM nhanvien 3. Cập nhật dữ liệu UPDATE Công dụng: - Cập nhật dữ liệu trong các bảng. Cú pháp: UPDATE tên_bảng SET tên_cột = biểu_thức [ , , tên_cột_k = biểu_thức_k] [FROM danh_sách_bảng] [WHERE điều_kiện] Ví dụ 9.3a: Câu lệnh sau đây tăng HSLUONG (hệ số lương) thêm 0.2 cho các nhân viên có MADONVI là 04. UPDATE nhanvien SET hsluong = hsluong + 0.2 WHERE madonvi = '04' Ví dụ 9.3b: Câu lệnh sau đây sẽ cập nhật giá trị cho field THANHTIEN (thành tiền) trong bảng NHATKYBANHANG theo công thức THANHTIEN = SOLUONG * DONGIA. UPDATE nhatkybanhang SET thanhtien = soluong * MATHANG.dongia FROM MATHANG WHERE nhatkybanhang.mahang = MATHANG.mahang 4. Xóa dữ liệu DELETE Công dụng: - Để xóa dữ liệu trong bảng. Cú pháp: DELETE FROM tên_bảng [FROM danh_sách_bảng] [WHERE điều_kiện] Ví dụ 9.4: Câu lệnh sau đây xoá khỏi bảng NHANVIEN những nhân viên làm tại đơn vị có SODIENTHOAI (số điện thoại) là '848484' DELETE FROM nhanvien FROM donvi WHERE nhanvien.madonvi = donvi.madonvi AND donvi.dienthoai = '848484' 5. Xóa toàn bộ dữ liệu TRUNCATE Công dụng: - Để xóa toàn bộ dữ liệu trong bảng. Cú pháp: TRUNCATE TABLE tên_bảng Ví dụ 9.5: Câu lệnh sau xoá toàn bộ dữ liệu trong bảng LUONG_NHANVIEN DELETE FROM luong_nhanvien Lưu hành nội bộ Trang 69
  24. Tương đương câu lệnh TRUNCATE TABLE luong_nhanvien V. Một số hàm thường dùng trong SQL Server 1. Hàm ngày – giờ a. Hàm DATEADD Cú pháp: DATEADD(datepart, number, date) Datepart: tham số chỉ định thành phần sẽ được cộng thêm vào ngày date. DatePart Viết tắt year yy, yyyy quarter qq, q month mm, m dayofyear dy, y day dd, d week wk, ww hour hh minute mi, n second ss, s milisecond ms Công dụng: Hàm trả về một giá trị kiểu DateTime bằng cách cộng thêm một khoảng giá trị là number vào ngày date được chỉ định. b. Hàm DATEDIFF Cú pháp: DATEDIFF(datepart, startdate, enddate) Công dụng: Hàm trả về khoảng thời gian giữa 2 giá trị kiểu ngày startdate và enddate tùy thuộc vào datepart. Ví dụ: DateDiff(year, '3/10/2003', '6/15/2010') à kết quả: 7 c. Hàm DATEPART Cú pháp: DATEPART(datepart, date) Công dụng: Hàm trả về một số nguyên được trích ra từ thành phần được chỉ định bởi datepart trong giá trị ngày date. Ví dụ: DatePart(year, '6/15/2010') à kết quả: 2010 d. Hàm GETDATE Cú pháp: GETDATE() Công dụng: Hàm trả về giá trị là ngày hiện tại. e. Hàm DAY, MONTH, YEAR Cú pháp: DAY(date) / MONTH(date) / YEAR(date) Công dụng: Hàm trả về giá trị là ngày / tháng / năm của ngày date. Ví dụ: Day('6/15/2010') à kết quả: 15 Month('6/15/2010') à kết quả: 6 Lưu hành nội bộ Trang 70
  25. Year('6/15/2010') à kết quả: 2010 2. Hàm chuỗi a. Hàm LEFT Cú pháp: LEFT(string, n) Công dụng: Hàm trích từ chuỗi string n ký tự tính từ bên trái. b. Hàm RIGHT Cú pháp: RIGHT(string, n) Công dụng: Hàm trích từ chuỗi string n ký tự tính từ bên phải. c. Hàm SUBSTRING Cú pháp: SUBSTRING(string, m, n) Công dụng: Hàm trích từ chuỗi string n ký tự tính từ ký tự thứ m. d. Hàm LTRIM Cú pháp: LTRIM(string) Công dụng: Hàm cắt bỏ khoảng trắng thừa bên trái chuỗi string. e. Hàm RTRIM Cú pháp: RTRIM(string) Công dụng: Hàm cắt bỏ khoảng trắng thừa bên phải chuỗi string. f. Hàm LEN Cú pháp: LEN(string) Công dụng: Hàm trả về độ dài của chuỗi string. Thực hành 1. Khởi động SQL SERVER 2008: a. Start à All programs à Microsoft SQL Server 2008 à SQL Server Management Studio b. Chứng thực c. Chọn Connect 2. Ở cửa sổ Object Explorer, click phải chuột lên banhang và chọn lệnh New Query 3. Ở cửa sổ query, thực hiện các câu lệnh trong các Ví dụ ở trên. oOO Lưu hành nội bộ Trang 71
  26. Chương 6: LẬP TRÌNH KẾT NỐI CSDL SQL SERVER 2008 Bài 10-11: LẬP TRÌNH KẾT NỐI CƠ SỞ DỮ LIỆU * Chuẩn bị: - Tên máy được sử dụng (SERVERNAME) là PC-PC - Database được sử dụng (DATABASENAME) là QuanLyBanHang, gồm có các table: + Nhanvien + HoaDon + Sanpham + ChiTietHoaDon + Khachhang + ThanhPho - Với quan hệ (Relationship) như sau: - Sử dụng Visual Studio 2008 tạo một project mới (Windows Forms Application) I. Tạo kết nối - Vận chuyển dữ liệu 1. Khai báo namespace sử dụng using System.Data.SqlClient; 2. Khai báo ở mức class // Chuỗi kết nối string strConnectionString = "Data Source=SERVERNAME;Initial Catalog=DATABASENAME;Integrated Security=True"; // Đối tượng kết nối SqlConnection conn = null; // Đối tượng đưa dữ liệu vào DataTable dtTABLENAME SqlDataAdapter daTABLENAME = null; // Đối tượng hiển thị dữ liệu lên Form DataTable dtTABLENAME = null; 3. Khai báo ở Form Load Lưu hành nội bộ Trang 72
  27. // Khởi động kết nối conn = new SqlConnection(strConnectionString); // Vận chuyển dữ liệu lên DataTable dtTABLENAME daTABLENAME = new SqlDataAdapter("SELECT * FROM TABLENAME",conn); dtTABLENAME = new DataTable(); daTABLENAME.Fill(dtTABLENAME); 4. Giải phóng tài nguyên . Chuyển Form về chế độ Design View . Ở cửa sổ properties của form đang chọn, click Events . Nhắp đúp lên sự kiện FormClosing . Viết code cho sự kiện này như sau: // Giải phóng tài nguyên dtTABLENAME.Dispose(); dtTABLENAME = null; // Hủy kết nối conn = null; II. Đưa dữ liệu lên các đối tượng ListBox / ComboBox – DataGridView 1. Đưa dữ liệu lên ListBox / ComboBox Ví dụ 10.1: Thiết kế form như sau (lstThanhPho, btnThoat) * Yêu cầu: . Khi Form load: đưa dữ liệu từ table ThanhPho lên ListBox (lstThanhPho), kèm bẫy lỗi. . Nhắp vào Button Thoát: dừng chương trình (có hiện hộp thoại hỏi đáp trước khi dừng). * Hướng dẫn: - Thiết kế form như yêu cầu. - Khai báo namespace sử dụng: using System.Data.SqlClient; - Ờ mức class, khai báo: // Chuỗi kết nối string strConnectionString = "Data Source=PC-PC;Initial Catalog=QuanLyBanHang;Integrated Security=True"; // Đối tượng kết nối SqlConnection conn = null; // Đối tượng đưa dữ liệu vào DataTable dtThanhPho SqlDataAdapter daThanhPho = null; // Đối tượng hiển thị dữ liệu lên Form DataTable dtThanhPho = null; Lưu hành nội bộ Trang 73
  28. - Form load: try { // Khởi động connection conn = new SqlConnection(strConnectionString); // Vận chuyển dữ liệu lên DataTable dtThanhPho daThanhPho = new SqlDataAdapter("SELECT * FROM THANHPHO", conn); dtThanhPho = new DataTable(); dtThanhPho.Clear(); daThanhPho.Fill(dtThanhPho); // Đưa dữ liệu lên ListBox this.lstThanhPho.DataSource = dtThanhPho; this.lstThanhPho.DisplayMember = "TenThanhPho"; this.lstThanhPho.ValueMember = "ThanhPho"; } catch (SqlException) { MessageBox.Show("Không lấy được nội dung trong table THANHPHO. Lỗi rồi!!!"); } - FormClosing: // Giải phóng tài nguyên dtThanhPho.Dispose(); dtThanhPho = null; // Hủy kết nối conn = null; - Button Thoát: // Khai báo biến traloi DialogResult traloi; // Hiện hộp thoại hỏi đáp traloi = MessageBox.Show("Chắc không?", "Trả lời", MessageBoxButtons.OKCancel, MessageBoxIcon.Question); // Kiểm tra có nhắp chọn nút Ok không? if (traloi == DialogResult.OK)Application.Exit(); 2. Đưa dữ liệu lên DataGridView Ví dụ 10.2: Thiết kế form như sau Lưu hành nội bộ Trang 74
  29. (dgvKHACHHANG, btnThoat) * Yêu cầu: . Khi Form load: đưa dữ liệu từ table KhachHang lên DataGridView (dgvKHACHHANG), có bẫy lỗi. . Nhắp vào Button Thoát: dừng chương trình. * Hướng dẫn: - Thiết kế form theo yêu cầu. - DataGridView có thuộc tính: + Name: dgvKHACHHANG + Nhắp phải chuột lên DataGridView chọn Edit Columns + Trong hộp thoại Edit Columns, nhắp Add để mở hộp thoại Add column và các column (cột) theo danh sách sau: Name Type Header text DataPropertyName Width Ghi chú MaKH TextBox Mã KH MaKH 100 Frozen TenCty TextBox Tên Cty TenCty 250 DiaChi TextBox Địa chỉ DiaChi 200 ThanhPho TextBox Thành Phố ThanhPho 100 DienThoai TextBox Ngày Nhận Hàng DienThoai 100 Trong đó: TextBox: là DataGridViewTextBoxColumn CheckBox: là DataGridViewCheckBoxColumn ComboBox: là DataGridViewComboBoxColumn Thuộc tính DataPropertyName, Width điều chỉnh trong hộp thoại Edit Column. - Khai báo namespace sử dụng: using System.Data.SqlClient; - Ờ mức class, khai báo: // Chuỗi kết nối string strConnectionString = "Data Source=PC-PC;Initial Catalog=QuanLyBanHang;Integrated Security=True"; // Đối tượng kết nối SqlConnection conn = null; // Đối tượng đưa dữ liệu vào DataTable dtKhachHang SqlDataAdapter daKhachHang = null; // Đối tượng hiển thị dữ liệu lên Form Lưu hành nội bộ Trang 75
  30. DataTable dtKhachHang = null; - Form load: try { // Khởi động connection conn = new SqlConnection(strConnectionString); // Vận chuyển dữ liệu lên DataTable dtKhachHang daKhachHang = new SqlDataAdapter("SELECT * FROM KHACHHANG", conn); dtKhachHang = new DataTable(); dtKhachHang.Clear(); daKhachHang.Fill(dtKhachHang); // Đưa dữ liệu lên DataGridView dgvKHACHHANG.DataSource = dtKhachHang; } catch (SqlException) { MessageBox.Show("Không lấy được nội dung trong table KHACHHANG. Lỗi rồi!!!"); } - FormClosing: // Giải phóng tài nguyên dtKhachHang.Dispose(); dtKhachHang = null; // Hủy kết nối conn = null; - Button Thoát: // Khai báo biến traloi DialogResult traloi; // Hiện hộp thoại hỏi đáp traloi = MessageBox.Show("Chắc không?", "Trả lời", MessageBoxButtons.OKCancel, MessageBoxIcon.Question); // Kiểm tra có nhắp chọn nút Ok không? if (traloi == DialogResult.OK)Application.Exit(); 3. Đưa dữ liệu vào ComboBox trong DataGridView Ví dụ 10.3: Từ Ví Dụ 10.2, bổ sung button ReLoad (btnReLoad): load lại nội dung của table KhachHang vào DataGridView. Lưu hành nội bộ Trang 76
  31. * Hướng dẫn: - Ờ mức class, bổ sung đoạn code và khai báo hàm LoadData() như sau: // Đối tượng đưa dữ liệu vào DataTable dtThanhPho SqlDataAdapter daThanhPho = null; // Đối tượng hiển thị dữ liệu lên Form DataTable dtThanhPho = null; void LoadData() { try { // Khởi động connection conn = new SqlConnection(strConnectionString); // Vận chuyển dữ liệu vào DataTable dtThanhPho daThanhPho = new SqlDataAdapter("SELECT * FROM THANHPHO", conn); dtThanhPho = new DataTable(); dtThanhPho.Clear(); daThanhPho.Fill(dtThanhPho); // Đưa dữ liệu lên ComboBox trong DataGridView (dgvKHACHHANG.Columns["ThanhPho"] as DataGridViewComboBoxColumn).DataSource = dtThanhPho; (dgvKHACHHANG.Columns["ThanhPho"] as DataGridViewComboBoxColumn).DisplayMember = "TenThanhPho"; (dgvKHACHHANG.Columns["ThanhPho"] as DataGridViewComboBoxColumn).ValueMember = "ThanhPho"; // Vận chuyển dữ liệu vào DataTable dtKhachHang daKhachHang = new SqlDataAdapter("SELECT * FROM KHACHHANG", conn); dtKhachHang = new DataTable(); dtKhachHang.Clear(); daKhachHang.Fill(dtKhachHang); // Đưa dữ liệu lên DataGridView Lưu hành nội bộ Trang 77
  32. dgvKHACHHANG.DataSource = dtKhachHang; } catch (SqlException) { MessageBox.Show("Không lấy được nội dung trong table KHACHHANG. Lỗi rồi!!!"); } } - Form Load: bỏ nội dung cũ, thay bằng LoadData(); - ReLoad: Nhắp đúp vào Button ReLoad, viết đoạn code như sau LoadData(); III. Các thao tác trên dữ liệu: Thêm – Sửa - Xóa 1. Ví dụ 10.4: Từ Ví dụ 10.3, bổ sung button sau Xóa (btnXoa): xóa record hiện hành ra khỏi table KhachHang. * Hướng dẫn: - Xóa: Nhắp đúp vào Button Xóa, thực hiện như sau // Mở kết nối conn.Open(); try { // Thực hiện lệnh SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandType = CommandType.Text; // Lấy thứ tự record hiện hành int r = dgvKHACHHANG.CurrentCell.RowIndex; // Lấy MaKH của record hiện hành string strMAKH = dgvKHACHHANG.Rows[r].Cells[0].Value.ToString(); // Viết câu lệnh SQL cmd.CommandText = System.String.Concat("Delete From KhachHang Where MaKH='" + strMAKH + "'"); cmd.CommandType = CommandType.Text; // Thực hiện câu lệnh SQL Lưu hành nội bộ Trang 78
  33. cmd.ExecuteNonQuery(); // Cập nhật lại DataGridView LoadData(); // Thông báo MessageBox.Show("Đã xóa xong!"); } catch (SqlException) { MessageBox.Show("Không xóa được. Lỗi rồi!!!"); } // Đóng kết nối conn.Close(); 2. Ví dụ 10.5: Từ Ví dụ 10.4, bổ sung các đối tượng như sau (xem hình) - Panel, trong đó có + 4 TextBox: txtMaKH, txtTenCty, txtDiachi, txtDienthoai + 1 ComboBox: cbThanhpho - 4 Button: btnThem, btnSua, btnLuu, btnHuy * Yêu cầu: - Thiết kế không cho người dùng thao tác (Enabled = false) khi load form: + Panel + Các Button Lưu, Hủy - Điều chỉnh lại thuộc tính (properties) của DataGridView + AllowUserToAddRows = False + EditMode = EditProgrammatically - Khi Form load: đưa dữ liệu từ table KhachHang lên DataGridView (dgvKHACHHANG), có bẫy lỗi. - Nhắp vào Button ReLoad: load lại nội dung table KhachHang lên dgvKHACHHANG - Nhắp vào Button Thêm: + Xóa trống các đối tượng trong Panel. + Cho phép nhập thông tin khách hàng vào các đối tượng trên Panel + Không cho phép thao tác trên các Button: Thêm, Sửa, Xóa, Thoát. + Cho phép thao tác trên các Button: Lưu, Hủy. - Nhắp vào Button Sửa: + Đưa thông tin của khách hàng đang được chọn trong DataGridView lên Panel. + Cho phép nhập / sửa thông tin khách hàng vào / trong các đối tượng trên Panel. + Không cho phép thao tác trên các Button: Thêm, Sửa, Xóa, Thoát. + Cho phép thao tác trên các Button: Lưu, Hủy. - Nhắp vàp Button Lưu. + Insert / Update thông tin khách hàng từ Panel vào table KhachHang. + ReLoad lại DataGridView - Nhắp vàp Button Hủy: + Xóa trống các đối tượng trong Panel. + Không cho phép nhập thông tin khách hàng vào các đối tượng trên Panel Lưu hành nội bộ Trang 79
  34. * Hướng dẫn: - Thiết kế bổ sung Panel với 4 TextBox và 1 ComboBox, Panel có Enabled = false - Ờ mức class, bổ sung khai báo biến như sau: // Khai báo biến kiểm tra việc Thêm hay Sửa dữ liệu bool Them; - Hàm LoadData(): bổ sung dưới hàng // Đưa dữ liệu lên DataGridView dgvKHACHHANG.DataSource = dtKhachHang; đoạn code sau // Xóa trống các đối tượng trong Panel this.txtMaKH.ResetText(); this.txtTenCty.ResetText(); this.txtDiaChi.ResetText(); this.txtDienThoai.ResetText(); // Không cho thao tác trên các nút Lưu / Hủy this.btnLuu.Enabled = false; this.btnHuy.Enabled = false; this.panel.Enabled = false; // Cho thao tác trên các nút Thêm / Sửa / Xóa / Thoát this.btnThem.Enabled = true; this.btnSua.Enabled = true; this.btnXoa.Enabled = true; this.btnThoat.Enabled = true; - Thêm: nhắp đúp vào button Thêm, bổ sung đoạn code // Kich hoạt biến Them Them = true; // Xóa trống các đối tượng trong Panel this.txtMaKH.ResetText(); this.txtTenCty.ResetText(); this.txtDiaChi.ResetText(); Lưu hành nội bộ Trang 80
  35. this.txtDienThoai.ResetText(); // Cho thao tác trên các nút Lưu / Hủy / Panel this.btnLuu.Enabled = true; this.btnHuy.Enabled = true; this.panel.Enabled = true; // Không cho thao tác trên các nút Thêm / Xóa / Thoát this.btnThem.Enabled = false; this.btnSua.Enabled = false; this.btnXoa.Enabled = false; this.btnThoat.Enabled = false; // Đưa dữ liệu lên ComboBox this.cbThanhPho.DataSource = dtThanhPho; this.cbThanhPho.DisplayMember = "TenThanhPho"; this.cbThanhPho.ValueMember = "ThanhPho"; // Đưa con trỏ đến TextField txtMaKH this.txtMaKH.Focus(); - Sửa: Nhắp đúp vào button Sửa, bổ sung đoạn code // Kích hoạt biến Sửa Them = false; // Đưa dữ liệu lên ComboBox this.cbThanhPho.DataSource = dtThanhPho; this.cbThanhPho.DisplayMember = "TenThanhPho"; this.cbThanhPho.ValueMember = "ThanhPho"; // Cho phép thao tác trên Panel this.panel.Enabled = true; // Thứ tự dòng hiện hành int r = dgvKHACHHANG.CurrentCell.RowIndex; // Chuyển thông tin lên panel this.txtMaKH.Text = dgvKHACHHANG.Rows[r].Cells[0].Value.ToString(); Lưu hành nội bộ Trang 81
  36. this.txtTenCty.Text = dgvKHACHHANG.Rows[r].Cells[1].Value.ToString(); this.txtDiaChi.Text = dgvKHACHHANG.Rows[r].Cells[2].Value.ToString(); this.cbThanhPho.SelectedValue = dgvKHACHHANG.Rows[r].Cells[3].Value.ToString(); this.txtDienThoai.Text = dgvKHACHHANG.Rows[r].Cells[4].Value.ToString(); // Cho thao tác trên các nút Lưu / Hủy / Panel this.btnLuu.Enabled = true; this.btnHuy.Enabled = true; this.panel.Enabled = true; // Không cho thao tác trên các nút Thêm / Xóa / Thoát this.btnThem.Enabled = false; this.btnSua.Enabled = false; this.btnXoa.Enabled = false; this.btnThoat.Enabled = false; // Đưa con trỏ đến TextField txtMaKH this.txtMaKH.Focus(); - Lưu: Nhắp đúp vào button Lưu, bổ sung đoạn code // Mở kết nối conn.Open(); // Thêm dữ liệu if (Them) { try { // Thực hiện lệnh SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; Lưu hành nội bộ Trang 82
  37. cmd.CommandType = CommandType.Text; // Lệnh Insert InTo cmd.CommandText = System.String.Concat("Insert Into KhachHang Values(" + "'" + this.txtMaKH.Text.ToString() + "','" + this.txtTenCty.Text.ToString() + "','" + this.txtDiaChi.Text.ToString() + "','" + this.cbThanhPho.SelectedValue.ToString() + "','" + this.txtDienThoai.Text.ToString() + "')"); cmd.CommandType = CommandType.Text; cmd.ExecuteNonQuery(); // Load lại dữ liệu trên DataGridView LoadData(); // Thông báo MessageBox.Show("Đã thêm xong!"); } catch (SqlException) { MessageBox.Show("Không thêm được. Lỗi rồi!"); } } if (!Them) { try { // Thực hiện lệnh SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandType = CommandType.Text; // Thứ tự dòng hiện hành int r = dgvKHACHHANG.CurrentCell.RowIndex; // MaKH hiện hành string strMAKH = dgvKHACHHANG.Rows[r].Cells[0].Value.ToString(); // Câu lệnh SQL cmd.CommandText = System.String.Concat("Update KhachHang Set TenCty='" + this.txtTenCty.Text.ToString() + "', DiaChi='" + this.txtDiaChi.Text.ToString() + "', ThanhPho='" + this.cbThanhPho.SelectedValue.ToString() + "', DienThoai='" + this.txtDienThoai.Text.ToString() + "' Where MaKH='" + strMAKH + "'"); // Cập nhật cmd.CommandType = CommandType.Text; cmd.ExecuteNonQuery(); // Load lại dữ liệu trên DataGridView Lưu hành nội bộ Trang 83
  38. LoadData(); // Thông báo MessageBox.Show("Đã sửa xong!"); catch (SqlException) { MessageBox.Show("Không sửa được. Lỗi rồi!"); } } // Đóng kết nối conn.Close(); - Hủy: Nhắp đúp vào button Hủy, bổ sung đoạn code // Xóa trống các đối tượng trong Panel this.txtMaKH.ResetText(); this.txtTenCty.ResetText(); this.txtDiaChi.ResetText(); this.txtDienThoai.ResetText(); // Cho thao tác trên các nút Thêm / Sửa / Xóa / Thoát this.btnThem.Enabled = true; this.btnSua.Enabled = true; this.btnXoa.Enabled = true; this.btnThoat.Enabled = true; // Không cho thao tác trên các nút Lưu / Hủy / Panel this.btnLuu.Enabled = false; this.btnHuy.Enabled = false; this.panel.Enabled = false; Bài Tập 1. Thiết kế form như sau: (cbSanpham, btnThoat) * Yêu cầu: . Form load: đưa dữ liệu từ table SanPham lên ComboBox (cbSanPham), kèm bẫy lỗi. . Nhắp vào Button Thoát: dừng chương trình (có hiện hộp thoại hỏi / đáp). 2. Đưa dữ liệu lên DataGridView (như II. 2) cho các table: NhanVien, SanPham. 3. Thiết kế form (như III) thực hiện các thao tác: Thêm, Sửa, Xóa cho các table: HoaDon, ChiTietHoaDon. Lưu ý: Các field MaKH, MaNV, MaSP thể hiện dưới dạng ComboBox. oOo Lưu hành nội bộ Trang 84
  39. Chương 7: XÂY DỰNG ỨNG DỤNG Bài 12-13-14-15: ỨNG DỤNG QUẢN LÝ BÁN HÀNG I. Chuẩn bị: - Tên máy được sử dụng (SERVERNAME) là PC-PC (thay đổi cho đúng máy đang dùng!) - Database được sử dụng (DATABASENAME) là QuanLyBanHang, gồm có các table sau: + ThanhPho + Sanpham + Khachhang + Hoadon + Nhanvien + ChitietHoadon - Với quan hệ (Relationship) như sau: - Khởi động SQL Server 2008, tạo một DataBase mới có tên QuanLyBanHang, import dữ liệu từ file QuanLyBanHang.mdb - Khởi động Visual Studio 2008, tạo một project mới (Windows Forms Application), lưu với tên QUANLYBANHANG II. Sử dụng control: Câu 01: (Form1 – Màn hình chính) Thiết kế như sau Lưu hành nội bộ Trang 85
  40. * Yêu cầu: Khi Form1 được thực hiện sẽ thể hiện màn hình “Đăng nhập hệ thống” là Form2. * Hướng dẫn: - Ờ mức class, khai báo hàm frmLogin() như sau: Form frm = new Form2(); frm.ShowDialog(); - Form Load: frmlogin(); Câu 02: (Form2 – Màn hình Đăng nhập - login) Viết chương trình thể hiện màn hình “Đăng nhập” (login) như sau: (txtUser, txtPass, btnDangNhap, btnThoat) * Yêu cầu: - Khi nhắp vào nút Đăng nhập (btnDangNhap) sẽ thực hiện kiểm tra: + Nếu txtUser = "teonv" và txtPass = "123" thì chuyển sang Form1. + Ngược lại thì thông báo "Không đúng tên người dùng / mật khẩu !!!" - Nhắp button Thoát thì hiển thị thông báo "Chắc không? " + Nếu chọn Yes thì kết thúc chương trình. + Ngược lại thì trở lại màn hình Đăng nhập hệ thống. * Hướng dẫn: - Đăng nhập: Nhắp đúp vào button btnDangnhap, gõ vào đoạn code sau if ((this.txtUser.Text=="teonv")&&(this.txtPass.Text=="123")) this.Close(); else { MessageBox.Show("Không đúng tên người dùng / mật khẩu !!!","Thông báo"); this.txtUser.Focus(); } - Thoát: Nhắp đúp vào button btnThoat, gõ vào đoạn code sau DialogResult traloi; traloi = MessageBox.Show("Chắc không?", "Trả lời", MessageBoxButtons.OKCancel, MessageBoxIcon.Question); if ( traloi == DialogResult.OK) Application.Exit(); Lưu hành nội bộ Trang 86
  41. Câu 03: (Form1 – Hệ thống Menu) Thêm vào Form1, hệ thống menu như sau Lưu hành nội bộ Trang 87
  42. * Hướng dẫn: Sử dụng MenuStrip Câu 04: (Form1 – Menu Hệ thống) * Yêu cầu: Trên Form1, viết lệnh cho menu hệ thống như sau - Khi chọn menu “Hệ thống \ Đăng nhập” sẽ thực hiện đăng nhập lại hệ thống (Form2). - Khi chọn menu “Hệ thống \ Thoát” sẽ dừng chương trình. * Hướng dẫn: - Menu “Hệ thống \ Đăng nhập”: Nhắp đúp vào menu “Hệ thống \ Đăng nhập”, gõ vào đoạn code sau: frmlogin(); - Menu “Hệ thống \ Thoát”: Nhắp đúp vào menu “Hệ thống \ Đăng nhập”, gõ vào đoạn code sau: DialogResult traloi; traloi = MessageBox.Show("Chắc không?", "Trả lời", MessageBoxButtons.OKCancel, MessageBoxIcon.Question); if ( traloi == DialogResult.OK) Application.Exit(); III. Sử dụng DataBase: Câu 05: a) (Form1 – Menu Danh mục) * Yêu cầu: Trên Form1, viết lệnh cho menu danh mục như sau - Viết hàm XemDanhMuc(int intDanhMuc) thực hiện mở Form3 và gánForm3.Text = intDanhMuc. - Khi chọn menu “Xem Danh mục \ ” sẽ thực hiện gọi hàm XemDanhMuc( ), với là giá trị tương ứng với danh mục được chọn. * Hướng dẫn: - Ờ mức class, khai báo hàm XemDanhMuc(int intDanhMuc) như sau: // Hàm xemm danh mục void XemDanhMuc(int intDanhMuc) { Form frm = new Form3(); frm.Text = intDanhMuc.ToString(); frm.ShowDialog(); } - Menu “Xem Danh mục \ Danh mục Thành Phố”: Nhắp đúp vào menu “Xem Danh mục \ Danh mục Thành Phố”, gõ vào đoạn code sau: XemDanhMuc(1); - Menu “Xem Danh mục \ Danh mục Khách Hàng”: Nhắp đúp vào menu “Xem Danh mục \ Danh mục Khách Hàng”, gõ vào đoạn code sau: XemDanhMuc(2); - Menu “Xem Danh mục \ Danh mục Nhân Viên”: Nhắp đúp vào menu “Xem Danh mục \ Danh mục Nhân Viên”, gõ vào đoạn code sau: XemDanhMuc(3); - Menu “Xem Danh mục \ Danh mục Sản Phẩm”: Nhắp đúp vào menu “Xem Danh mục \ Danh mục Sản Phẩm”, gõ vào đoạn code sau: XemDanhMuc(4); Lưu hành nội bộ Trang 88
  43. - Menu “Xem Danh mục \ Danh mục Hóa Đơn”: Nhắp đúp vào menu “Xem Danh mục \ Danh mục Hóa Đơn”, gõ vào đoạn code sau: XemDanhMuc(5); - Menu “Xem Danh mục \ Danh mục Chi Tiết Hóa Đơn”: Nhắp đúp vào menu “Xem Danh mục \ Danh mục Chi Tiết Hóa Đơn”, gõ vào đoạn code sau: XemDanhMuc(6); b) (Form3) Thiết kế Form3 theo mẫu như sau (lblDanhMuc, dgvDANHMUC, btnTroVe) * Yêu cầu: Trên Form3 - Khi Form được load sẽ hiển thị tên table (được chọn) lên Label lblDanhMuc và nội dung của table này lên DataGridView dgvDANHMUC. - Khi nhắp vào button Trở Về sẽ đóng Form3. * Hướng dẫn: - Khai báo namespace sử dụng: using System.Data.SqlClient; - Ờ mức class, khai báo như sau: // Chuỗi kết nối string strConnectionString = "Data Source=PC-PC;Initial Catalog=QuanLyBanHang;Integrated Security=True"; // Đối tượng kết nối SqlConnection conn = null; // Đối tượng đưa dữ liệu vào DataTable dtTable SqlDataAdapter daTable = null; // Đối tượng hiển thị dữ liệu lên Form DataTable dtTable = null; - Form Load try { // Khởi động connection conn = new SqlConnection(strConnectionString); // Xử lý danh mục int intDM = Convert.ToInt32(this.Text); switch (intDM) Lưu hành nội bộ Trang 89
  44. { case 1: lblDM.Text = "Danh Mục Thành Phố"; daTable = new SqlDataAdapter("SELECT ThanhPho, TenThanhPho FROM THANHPHO", conn); break; case 2: lblDM.Text = "Danh Mục Khách Hàng"; daTable = new SqlDataAdapter("SELECT MaKH, TenCTy FROM KHACHHANG", conn); break; case 3: lblDM.Text = "Danh Mục Nhân Viên"; daTable = new SqlDataAdapter("SELECT MaNV, Ho, Ten FROM NHANVIEN", conn); break; case 4: lblDM.Text = "Danh Mục Sản Phẩm"; daTable = new SqlDataAdapter("SELECT MaSP, TenSP, DonViTinh, DonGia FROM SANPHAM", conn); break; case 5: lblDM.Text = "Danh Mục Hóa Đơn"; daTable = new SqlDataAdapter("SELECT MaHD, MaKH, MaNV FROM HOADON", conn); break; case 6: lblDM.Text = "Danh Mục Chi Tiết Hóa Đơn"; daTable = new SqlDataAdapter("SELECT * FROM CHITIETHOADON", conn); break; default: break; } // Vận chuyển dữ liệu lên DataTable dtTable dtTable = new DataTable(); dtTable.Clear(); daTable.Fill(dtTable); // Đưa dữ liệu lên DataGridView dgvDANHMUC.DataSource = dtTable; // Thay đổi độ rộng cột dgvDANHMUC.AutoResizeColumns(); } catch (SqlException) { MessageBox.Show("Không lấy được nội dung trong table. Lỗi rồi!!!"); Lưu hành nội bộ Trang 90
  45. } } - Trở Về: Nhắp đúp vào button Trở Về, thêm vào đoạn code sau this.Close(); Câu 06: (Form4 – Menu Quản lý danh mục đơn \ Danh mục Thành Phố ) * Yêu cầu: - Trên Form1: khi chọn menu “Quản lý danh mục đơn \ Danh mục Thành Phố” sẽ mở Form4. - Trên Form4: Thiết kế như sau: (panel, txtThanhPho, txtTenThanhPho, dgvTHANHPHO, btnReLoad, btnThem, btnSua, btnXoa, btnLuu, btnHuyBo, btnTroVe) * Hướng dẫn: a) (Form1 – Menu Quản lý danh mục đơn) - Menu “Quản lý danh mục đơn \ Danh mục Thành Phố”: Nhắp đúp vào menu “Quản lý danh mục đơn \ Danh mục Thành Phố”, gõ vào đoạn code sau: Form frm = new Form4(); frm.Text = "Quản lý Danh mục Thành Phố"; frm.ShowDialog(); b) (Form4) Thiết kế Form4 như mẫu - Khai báo namespace sử dụng: using System.Data.SqlClient; - Ờ mức class, khai báo như sau: // Chuỗi kết nối string strConnectionString = "Data Source=PC-PC;Initial Catalog=QuanLyBanHang;Integrated Security=True"; // Đối tượng kết nối SqlConnection conn = null; Lưu hành nội bộ Trang 91
  46. // Đối tượng đưa dữ liệu vào DataTable dtThanhPho SqlDataAdapter daThanhPho = null; // Đối tượng hiển thị dữ liệu lên Form DataTable dtThanhPho = null; // Khai báo biến kiểm tra việc Thêm hay Sửa dữ liệu bool Them; void LoadData() { try { // Khởi động connection conn = new SqlConnection(strConnectionString); // Vận chuyển dữ liệu lên DataTable dtThanhPho daThanhPho = new SqlDataAdapter("SELECT * FROM THANHPHO", conn); dtThanhPho = new DataTable(); dtThanhPho.Clear(); daThanhPho.Fill(dtThanhPho); // Đưa dữ liệu lên DataGridView dgvTHANHPHO.DataSource = dtThanhPho; // Thay đổi độ rộng cột dgvTHANHPHO.AutoResizeColumns(); // Xóa trống các đối tượng trong Panel this.txtThanhPho.ResetText(); this.txtTenThanhPho.ResetText(); // Không cho thao tác trên các nút Lưu / Hủy this.btnLuu.Enabled = false; this.btnHuyBo.Enabled = false; this.panel.Enabled = false; // Cho thao tác trên các nút Thêm / Sửa / Xóa / Thoát this.btnThem.Enabled = true; this.btnSua.Enabled = true; this.btnXoa.Enabled = true; this.btnTroVe.Enabled = true; } catch (SqlException) { MessageBox.Show("Không lấy được nội dung trong table THANHPHO. Lỗi rồi!!!"); } } - Form Load: LoadData(); - FormClosing: // Giải phóng tài nguyên dtThanhPho.Dispose(); dtThanhPho = null; Lưu hành nội bộ Trang 92
  47. // Hủy kết nối conn = null; - ReLoad: Nhắp đúp vào button ReLoad, thêm vào đoạn code sau LoadData(); - Trở Về: Nhắp đúp vào button Trở Về, thêm vào đoạn code sau this.Close(); - Thêm: Nhắp đúp vào button Thêm, thêm vào đoạn code sau // Kich hoạt biến Them Them = true; // Xóa trống các đối tượng trong Panel this.txtThanhPho.ResetText(); this.txtTenThanhPho.ResetText(); // Cho thao tác trên các nút Lưu / Hủy / Panel this.btnLuu.Enabled = true; this.btnHuyBo.Enabled = true; this.panel.Enabled = true; // Không cho thao tác trên các nút Thêm / Xóa / Thoát this.btnThem.Enabled = false; this.btnSua.Enabled = false; this.btnXoa.Enabled = false; this.btnTroVe.Enabled = false; // Đưa con trỏ đến TextField txtThanhPho this.txtThanhPho.Focus(); - Sửa: Nhắp đúp vào button Sửa, thêm vào đoạn code sau // Kích hoạt biến Sửa Them = false; // Cho phép thao tác trên Panel this.panel.Enabled = true; // Thứ tự dòng hiện hành int r = dgvTHANHPHO.CurrentCell.RowIndex; // Chuyển thông tin lên panel this.txtThanhPho.Text = dgvTHANHPHO.Rows[r].Cells[0].Value.ToString(); this.txtTenThanhPho.Text = dgvTHANHPHO.Rows[r].Cells[1].Value.ToString(); // Cho thao tác trên các nút Lưu / Hủy / Panel this.btnLuu.Enabled = true; this.btnHuyBo.Enabled = true; this.panel.Enabled = true; // Không cho thao tác trên các nút Thêm / Xóa / Thoát this.btnThem.Enabled = false; this.btnSua.Enabled = false; this.btnXoa.Enabled = false; this.btnTroVe.Enabled = false; // Đưa con trỏ đến TextField txtMaKH this.txtThanhPho.Focus(); - Xóa: Nhắp đúp vào button Xóa, thêm vào đoạn code sau // Mở kết nối conn.Open(); Lưu hành nội bộ Trang 93
  48. try { // Thực hiện lệnh SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandType = CommandType.Text; // Lấy thứ tự record hiện hành int r = dgvTHANHPHO.CurrentCell.RowIndex; // Lấy MaKH của record hiện hành string strTHANHPHO = dgvTHANHPHO.Rows[r].Cells[0].Value.ToString(); // Viết câu lệnh SQL cmd.CommandText = System.String.Concat("Delete From ThanhPho Where ThanhPho='" + strTHANHPHO + "'"); cmd.CommandType = CommandType.Text; // Thực hiện câu lệnh SQL cmd.ExecuteNonQuery(); // Cập nhật lại DataGridView LoadData(); // Thông báo MessageBox.Show("Đã xóa xong!"); } catch (SqlException) { MessageBox.Show("Không xóa được. Lỗi rồi!"); } // Đóng kết nối conn.Close(); - Hủy Bỏ: Nhắp đúp vào button Hủy Bỏ, thêm vào đoạn code sau // Xóa trống các đối tượng trong Panel this.txtThanhPho.ResetText(); this.txtTenThanhPho.ResetText(); // Cho thao tác trên các nút Thêm / Sửa / Xóa / Thoát this.btnThem.Enabled = true; this.btnSua.Enabled = true; this.btnXoa.Enabled = true; this.btnTroVe.Enabled = true; // Không cho thao tác trên các nút Lưu / Hủy / Panel this.btnLuu.Enabled = false; this.btnHuyBo.Enabled = false; this.panel.Enabled = false; - Lưu: Nhắp đúp vào button Lưu, thêm vào đoạn code sau // Mở kết nối conn.Open(); // Thêm dữ liệu if (Them) { try { Lưu hành nội bộ Trang 94
  49. // Thực hiện lệnh SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandType = CommandType.Text; // Lệnh Insert InTo cmd.CommandText = System.String.Concat("Insert Into ThanhPho Values(" + "'" + this.txtThanhPho.Text.ToString() + "','" + this.txtTenThanhPho.Text.ToString() + "')"); cmd.CommandType = CommandType.Text; cmd.ExecuteNonQuery(); // Load lại dữ liệu trên DataGridView LoadData(); // Thông báo MessageBox.Show("Đã thêm xong!"); } catch (SqlException) { MessageBox.Show("Không thêm được. Lỗi rồi!"); } } if (!Them) { // Thực hiện lệnh SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandType = CommandType.Text; // Thứ tự dòng hiện hành int r = dgvTHANHPHO.CurrentCell.RowIndex; // MaKH hiện hành string strTHANHPHO = dgvTHANHPHO.Rows[r].Cells[0].Value.ToString(); // Câu lệnh SQL cmd.CommandText = System.String.Concat("Update ThanhPho Set TenThanhPho='" + this.txtTenThanhPho.Text.ToString() + "' Where ThanhPho='" + strTHANHPHO + "'"); // Cập nhật cmd.CommandType = CommandType.Text; cmd.ExecuteNonQuery(); // Load lại dữ liệu trên DataGridView LoadData(); // Thông báo MessageBox.Show("Đã sửa xong!"); } // Đóng kết nối conn.Close(); Câu 07: (Form5 – Menu Quản lý danh mục đơn \ Danh mục Khách Hàng) Lưu hành nội bộ Trang 95
  50. * Yêu cầu: - Trên Form1: khi chọn menu “Quản lý danh mục đơn \ Danh mục Khách Hàng” sẽ mở Form5. - Trên Form5: thiết kế như sau Câu 08: (Form6 – Menu Quản lý danh mục đơn \ Danh mục Nhân Viên) * Yêu cầu: - Trên Form1: khi chọn menu “Quản lý danh mục đơn \ Danh mục Nhân Viên” sẽ mở Form6. - Trên Form6: thiết kế như sau Câu 09: (Form7 – Menu Quản lý danh mục đơn \ Danh mục Sản Phẩm) * Yêu cầu: - Trên Form1: khi chọn menu “Quản lý danh mục đơn \ Danh mục Sản Phẩm” sẽ mở Form7. - Trên Form7: thiết kế như sau Lưu hành nội bộ Trang 96
  51. Câu 10: (Form8 – Menu Quản lý danh mục đơn \ Danh mục Hóa Đơn) * Yêu cầu: - Trên Form1: khi chọn menu “Quản lý danh mục đơn \ Danh mục Hóa Đơn” sẽ mở Form8. - Trên Form8: thiết kế như sau Câu 11: (Form9 – Menu Quản lý danh mục đơn \ Danh mục Chi Tiết Hóa Đơn) * Yêu cầu: - Trên Form1: khi chọn menu “Quản lý danh mục đơn \ Danh mục Chi Tiết Hóa Đơn” sẽ mở Form9. Lưu hành nội bộ Trang 97
  52. - Trên Form9: thiết kế như sau Câu 11: (Form10 – Menu Quản lý danh mục theo nhóm \ Khách hàng theo thành phố) * Yêu cầu: - Trên Form1: khi chọn menu “Quản lý danh mục theo nhóm \ Khách hàng theo Thành Phố” sẽ mở Form10. - Trên Form10: thiết kế như sau Câu 12: (Form11 – Menu Quản lý danh mục theo nhóm \ Hóa đơn theo Khách hàng) * Yêu cầu: Lưu hành nội bộ Trang 98
  53. - Trên Form1: khi chọn menu “Quản lý danh mục theo nhóm \ Hóa đơn theo Khách hàng” sẽ mở Form11. - Trên Form11: thiết kế như sau Câu 13: (Form12 – Menu Quản lý danh mục theo nhóm \ Hóa đơn theo Sản phẩm) * Yêu cầu: - Trên Form1: khi chọn menu “Quản lý danh mục theo nhóm \ Hóa đơn theo Sản phẩm” sẽ mở Form12. - Trên Form12: thiết kế như sau à tự thực hiện Câu 14: (Form13 – Menu Quản lý danh mục theo nhóm \ Hóa đơn theo Nhân viên) * Yêu cầu: - Trên Form1: khi chọn menu “Quản lý danh mục theo nhóm \ Hóa đơn theo Nhân viên” sẽ mở Form13. - Trên Form13: thiết kế như sau à tự thực hiện Câu 15: (Form14 – Menu Quản lý danh mục theo nhóm \ Chi tiết hóa đơn theo Hóa đơn) * Yêu cầu: - Trên Form1: khi chọn menu “Quản lý danh mục theo nhóm \ Chi tiết hóa đơn theo Hóa đơn” sẽ mở Form14. - Trên Form14: thiết kế như sau à tự thực hiện Câu 16: (Form15 – Menu Quản lý danh mục theo nhóm \ Đa cấp) * Yêu cầu: - Trên Form1: bổ sung menu “Quản lý danh mục theo nhóm \ Quản lý Đa cấp”, và khi chọn sẽ mở Form15. - Trên Form15: thiết kế như sau Lưu hành nội bộ Trang 99
  54. Hết Lưu hành nội bộ Trang 100