Đăng ký Đăng nhập
Trang chủ Công nghệ thông tin Kỹ thuật lập trình Công cụ xây dựng phần mềm (phần nâng cao)...

Tài liệu Công cụ xây dựng phần mềm (phần nâng cao)

.PDF
202
834
53

Mô tả:

TRÖÔØNG ÑAÏI HOÏC TOÂN ÑÖÙC THAÉNG PHOØNG TRUNG CAÁP CHUYEÂN NGHIEÄP VAØ DAÏY NGHEÀ NGAØNH TIN HOÏC _oOo_ COÂ ÖÏNG NG COÂN NG G CU CUÏÏ XAÂ XAÂYY D DÖÏ PHA PHAÀÀN N ME MEÀÀM M (PHA (PHAÀÀN N NAÂ NAÂN NG G CAO) CAO) ThS.Lê Văn Hạnh 1 NỘI DUNG I. II. III. IV. V. Mô hình triển khai ứng dụng ADO.NET Lưu trữ và xử lý dữ liệu Trình bày dữ liệu Xây dựng ứng dụng quản lý đặt và bán hàng VI. Crystal Report VII. Bảo mật trong ứng dụng 2 I.-MÔ HÌNH TRIỂN KHAI ỨNG DỤNG 1. Kiến trúc n-tier ß ß 2-tier (client / server) 3-tier 2. Mô hình thiết kế ứng dụng ß ß ß WaterFall (thác nước) Prototyping (nguyên mẫu) Spiral (xoắn ốc) 3 I.1- Kiến trúc n-tier a/- 2-tier 1. Ứng dụng khách sử dụng ADO/ADO.NET truy xuất trực tiếp CSDL 2. Thích hợp cho các ứng dụng vừa và nhỏ, không có quá nhiều form 4 I.1- Kiến trúc n-tier a/- 2-tier (tt) 1. Các kỹ thuật triển khai ß ß Sử dụng các kỹ thuật gắn kết dữ liệu để kết nối tập dữ liệu ADO.NET trực tiếp đến các control Viết lệnh truy xuất các đối tượng ADO.NET và gắn kết dữ liệu thủ công đến các control 2. Ưu điểm ß ß Triển khai nhanh chóng và dễ dàng Quan sát toàn bộ mã lệnh trong form 3. Khuyết điểm ß ß ß Thay đổi quy trình công việc Î biên dịch lại Thay đổi lược đồ dữ liệu Î biên dịch lại Ít khả năng tận dụng được các lệnh xử lý giống nhau giữa các form do tên field, tên table khác nhau5 I.1- Kiến trúc n-tier b/- 3-tier 1. Sử dụng XML Web/Windows service nhằm tách biệt công việc truy xuất CSDL 2. Thích hợp với các ứng dụng lớn có số lượng form nhiều và xử lý dữ liệu phức tạp 6 I.1- Kiến trúc n-tier b/- 3-tier (tt) 1. Các kỹ thuật triển khai ß Tất cả thao tác dữ liệu đều ở XML Web Service. Các tập dữ liệu đều được tạo dựng trên server và trả về thông qua XML stream ß Các tập dữ liệu được trả về từ XML Web Service có thể được gắn kết vào các control một cách trực tiếp hoặc thủ công 2. Ưu điểm ß Triển khai nhanh chóng và dễ dàng ß Người dùng có thể sử dụng ứng dụng tại bất kỳ nơi nào có kết nối mạng ß Các thao tác CSDL tập trung tại XML Web Service, giảm thiểu chi phí bảo trì ứng dụng khách ß Các thay đổi trên lược đồ CSDL hay quy trình công việc đều được cập nhật tách biệt 3. Khuyết điểm ß Thay đổi quy trình công việc sẽ dẫn đến việc cập nhật toàn bộ các ứng dụng khách nằm rải rác ß Lược đồ CSDL được xây dựng cố định Î chi phí cập nhật cao 7 ß Hiệu suất thực hiện kém do phụ thuộc kết nối mạng I.2.- Mô hình thiết kế ứng dụng: a/- WaterFall Model Khảo sát Phân tích Thiết kế Cài đặt Thử nghiệm Triển khai & Bảo trì 8 I.2.- Mô hình thiết kế ứng dụng (tt) b/- Prototyping Model Yêu cầu Đánh giá & Cải tiến Thiết kế Tạo mẫu 9 I.2.- Mô hình thiết kế ứng dụng (tt) c/- Spiral Model Yêu cầu và cài đặt Ước lượng và giảm thiểu rủi ro Tính khả thi ... Thiết kế đúng đắn Lập kế hoạch Phát triển và đánh giá Hiểu rõ yêu cầu 10 NỘI DUNG (tt) 1. 2. 3. 4. 5. Mô hình triển khai ứng dụng ADO.NET Lưu trữ và xử lý dữ liệu Trình bày dữ liệu Xây dựng ứng dụng quản lý đặt và bán hàng 6. Crystal Report 7. Bảo mật trong ứng dụng 11 II.- ADO.NET 1. Các công nghệ truy xuất dữ liệu 2. Các đối tượng của ADO.NET ß ß ß ß Connection Command DataAdapter DataTable, DataSet 3. Tạo kết nối và truy xuất CSDL 12 II.- ADO.NET II.1.- Các công nghệ truy xuất dữ liệu APPLICATION ODBC SQL Native Oracle Native Native Library SQL Server Oracle Fox / Access Kiến trúc ODBC. 13 II.- ADO.NET 2.- Các đối tượng của ADO.NET (tt) APPLICATION OLEDB ODBC SQL Native Oracle Native Native Library SQL Server Oracle Fox / Access Kiến trúc OLEDB. 14 II.- ADO.NET 2.- Các đối tượng của ADO.NET (tt) APPLICATION .NET ADO.NET Provider SQL/Oracle Provider OLEDB Provider ODBC Provider OLEDB ODBC SQL Native Oracle Native Native Library SQL Server Oracle Fox / Access 15 Kiến trúc ADO.NET. II.- ADO.NET 2.- Các đối tượng của ADO.NET (tt) 1. Active Data Object .NET 2. ADO.NET có thể kết nối và thao tác trên các hệ quản trị CSDL như SQL server, MySQL, MS Access, Oracle, . . . 3. Tối ưu cho các ứng dụng Internet và phân tán. 4. ADO.NET được thiết kế nhằm tăng tốc độ truy cập và thao tác dữ liệu trong môi trường đa lớp. 5. Hai thành phần chính của ADO.NET là: ß ß Thành phần kết nối (.NET Framework Data Providers) Thành phần lưu trữ và xử lý 16 II.- ADO.NET 2.- Các đối tượng của ADO.NET (tt) 1. .NET Framework Data Providers ß ß ß ß Connection Command DataReader DataAdapter 2. Container – DataSet ß ß ß DataTable = {DataRow, DataColumn, Constraint} DataView DataRelation 17 II.- ADO.NET 2.- Các đối tượng của ADO.NET (tt) ADO.NET DataTable DataRows DataColumns DataSet DataTable DataRelation collection DataTable Client Application .NET framework Data Provider Data Reader Data Adapter Select Command Insert Command Update Command Delete Command Command Parameters Connection Transaction Data source 18 II.- ADO.NET 2.- Các đối tượng của ADO.NET (tt) ADO.NET DataSet Tables Relations DataTable Columns DataColumn Rows DataRow Client Application Data Reader Command DataRelation Parameters .NET framework Data Provider Data Adapter Data Reader Select Command Insert Command Update Command Delete Command Command Parameters Connection Transaction Data source 19 II.- ADO.NET 2.- Các đối tượng của ADO.NET (tt) .NET framework Data Provider Connection Data Adapter Transaction SelectCommand Dataset DataTableCollection DataTable DataRowCollection Command InsertCommand DataColumnCollection Parameters UpdateCommand ConstraintCollection Data Reader DeleteCommand DataRelationCollection Database XML 20 II.- ADO.NET 2.- Các đối tượng của ADO.NET (tt) 1. 2. ADO.NET chỉ cung cấp một đặc tả giao tiếp cho các đối tượng như Connection, Command, DataReader, DataAdapter Các hệ quản trị CSDL sẽ được xây dựng riêng các trình điều khiển gọi là Provider SQL Server NET Data OLE DB . . NET Data System.Data.SqlClient System.Data.OleDb SqlCommand SqlConnection SqlDataAdapter SqlDataReader SqlParameter OleDbCommand OleDbConnection OleDbDataAdapter OleDbDataReader OleDbParameter 21 II.- ADO.NET 2.- Các đối tượng của ADO.NET (tt) ADO.NET .NET Framework Data Provider SQLDataAdapter OleDBDataAdapte r SQLCommand OleDBCommand SQLConnection OleDBConnection SQL Server Access DataSet using System.Data DataTableCollection Order Products DataRelationCollection using System.Data.SqlClient 22 using System.Data.OleDb II.- ADO.NET 2.- Các đối tượng của ADO.NET (tt) a/- Đối tượng Connection SqlConnection OleDbConnection Phương thức Open() Cho phép mở kết nối CSDL với các thuộc tính khai báo trong ConnectionString Close() Cho phép đóng kết nối CSDL đang mở CreateCommand() Phương thức này cho phép gán hay trảvề một đối tượng SqlCommand / OleDbCommand ứng với đối tượng SqlConnection/ OleDbConnection Begin Transaction() Phương thức này khai báo bắt đầu 1 chuyển tác, để kết thúc chuyển tác bạn sử dụng Table Commit Rollback() Trong trường hợp có lỗi phát sinh bạn có thể sử dụng phương thức Rollback để hủy bỏ các chuyển tác đã được thực hiện Dispose() Dùng để giải phóng tài nguyên mà đối tượng SqlConnection đang sử dụng 23 II.- ADO.NET 2.- Các đối tượng của ADO.NET a/- 1. 2. 3. ConnectionString: chuỗi chỉ định kết nối Mỗi Provider có riêng một định dạng chuỗi kết nối SQLConnection: ß 4. Đối tượng Connection(tt) “DataSource=(local);Initial Catalog=qlsv; user=sa;pwd=sa” OleDBConnection: ß “Provider=SQLOLEDB;Data Source=(local);Initial Catalog=qlsv;Integrated Security=False;User ID=sa;Password=sa” ß “Provider=SQLOLEDB;Data Source=(local);Initial Catalog=qlsv;Integrated Security=True” ß “Provider=Microsoft.Jet.OLEDB.4.0; Data Source=D:\qlsv.mdb;User ID=Admin;Password=” 24 II.- ADO.NET 2.- Các đối tượng của ADO.NET a/- 1. Đối tượng Connection (tt) Kết nối CSDL với SQLConnection ß ß 2. String connStr = “server=(local);Init Catalog=qlsv;Integrated Security=True;”; SqlConnection dbConn = new SqlConnection(connStr); Kết nối CSDL với OleDbConnection ß ß 3. String connStr = “Provider=SQLOLEDB;Data Source=(local);Init Catalog=qlsv;User ID=sa;pwd=sa;”; OleDbConnection dbConn = new OleDbConnection(connStr); Thực hiện kết nối ß ß ß dbConn.Open(); // Mở kết nối //… Các lệnh truy xuất và xử lý CSDL dbConn.Close(); // Đóng kết nối 25 II.- ADO.NET 2.- Các đối tượng của ADO.NET (tt) b/- Đối tượng Command 2.b.1.- Đối tượng Command cho phép thi hành các câu lệnh truy vấn SQL, gọi thủ tục nội của SQL Server, ... Thuộc tính Mô tả Connection Mỗi đối tượng SqlCommand được sử dụng phải kèm theo đối tượng SqlConnection CommandText Tên bảng, lệnh Sql hoặc tên Storeprocedure muốn thực hiện trên nguồn dữ liệu CommandType Tương ứng với giá trị CommandText. Gồm Text, TableDirect, StoredProcedure CommandTimeout Khai báo thời gian chờ cho câu lệnh thực hiện (thời gian thực hiện mặc định là 30 giây) Parameters Tập hợp các tham số dùng trong Command 26 II.- ADO.NET 2.- Các đối tượng của ADO.NET b/- Đối tượng Command (tt) Phương thức Mô tả ExcuteNonQuery() Phương thức dùng để gọi thực thi các câu lệnh SQL, thủ tục nội tại của Sql Server, tên bảng dữ liệu. Kết quả trả về là số mẫu tin chịu tác động của Command ExcuteReader() Phương thức này trả về một đối tượng DataReader chỉ đọc một chiều. DataReader đọc dữ liệu trực tiếp từ nguồn dữ liệu nên phải duy trì kết nối cho đến khi đọc xong. ExcuteScalar() Phương thức này thực hiện lệnh của Command và trả về giá trị của cột đầu tiên và dòng đầu tiên. Phương thức này thường được sử dụng khi muốn Command thực hiện các hàm tính thống kê như : SUM, COUNT, AVG, MAX, MIN… trên nguồn dữ liệu 27 ngay lúc thực thi. II.- ADO.NET 2.- Các đối tượng của ADO.NET b/- Đối tượng Command (tt) 2.b.2.- Tạo lệnh truy xuất dữ liệu ß ß ß ß String sql = “SELECT * FROM SINHVIEN”; String sql = “vMonHoc”; String sql = “sp_KetQuaSV”; String sql = “INSERT INTO KETQUA VALUES(‘A01’,’K1’,9)”; 2.b.3.- Truy xuất CSDL với SqlCommand ß SqlCommand dbCmd = new SqlCommand(sql, dbConn); 2.b.4.- Truy xuất CSDL với OleDbCommand ß OleDbCommand dbCmd = new OleDbCommand(sql, dbConn); 2.b.5.- Thực hiện ß ß dbCmd.CommandType = CommandType.XXX; dbCmd.ExecuteReader(); / ExecuteNoneQuery(); 28 II.- ADO.NET 2.- Các đối tượng của ADO.NET b/- 2.b.6.- ß Thực hiện và nhận kết quả vô hướng Gọi Stored Procedure - OleDbCommand z z z ß Đối tượng Command (tt) OleDbCommand dbCmd = new OleDbCommand(“select count(*) from MonHoc”, dbConn); dbCmd.CommandType = CommandType.Text; int SLMonHoc = dbCmd.ExecuteScalar(); Gọi Stored Procedure – SqlCommand z z z SqlCommand dbCmd = new SqlCommand(“select count(*) from MonHoc”, dbConn); dbCmd.CommandType = CommandType.Text; int SLMonHoc = dbCmd.ExecuteScalar(); 29 II.- ADO.NET 2.- Các đối tượng của ADO.NET Đối tượng Command (tt) 2.b.7.-Thuộc tính Parameters của Command b/- z Parameter dùng để truyền tham số cho chuỗi lệnh Sql trong thuộc tính CommandText có thể sử dụng dấu ? thay thế cho các giá trị chưa xác định, hay thủ tục nội của Sql có thể cần phải truyền các tham số đầu vào/ đầu ra. z Cơ chế Parameter giúp cho việc truyền tải thông tin giữa ứng dụng và server mang tính bảo mật và an toàn hơn cách thức nối chuỗi SQL thông thường 30 II.- ADO.NET 2.- Các đối tượng của ADO.NET b/- Đối 2.b.7.-Thuộc tượng Command (tt) tính Parameters của Command (tt) Thuộc tính của Parameters Mô tả Direction Giá trị cho biết loại tham số với các giá trị sau: + Input (mặc định): loại tham số đầu vào +Output: loại tham số đầu ra +InputOutput: loại tham số vào/ra +ReturnValue: loại tham số nhận giá trị trả về của một thủ tục nội, một hàm, hàm do người dùng định nghĩa. OleDbType SqlDbType Kiểu dữ liệu OleDb hoặc SqlDb của tham số (đọc ghi) ParameterName Tên tham số (đọc ghi) Value Giá trị của tham số (đọc ghi) 31 II.- ADO.NET 2.- Các đối tượng của ADO.NET b/- Đối 2.b.7.-Thuộc tượng Command (tt) tính Parameters của Command (tt) Để đưa tham số cho Command, chúng ta có thể sử dụng một trong các cách sau: 1. Dùng phương thức CreateParameter của Command và Add của tập hợp Parameters 2. Đưa tham số vào tập hợp Parameters 3. Tạo tham số và đưa vào tập hợp Parameters 32 II.- ADO.NET 2.- Các đối tượng của ADO.NET b/- Đối tượng Command (tt) 1. Stored Procedure có tham số a/- Tạo Stored Procedure CREATE PROCEDURE sp_KetQuaSV @masv as nvarchar(10) AS BEGIN SELECT MaSV, HoSV, TenSV, TenMH, Diem FROM SinhVien sv, KetQua kq, KhoaHoc k, MonHoc mh WHERE sv.MaSV=@masv AND sv.MaSV=kq.MaSV AND kq.MaKH=k.MaKH AND k.MaMH=mh.MaMH END 33 II.- ADO.NET 2.- Các đối tượng của ADO.NET b/- Đối tượng Command (tt) b/- Gọi Stored Procedure - OleDbCommand ß ß ß ß OleDbCommand dbCmd = new OleDbCommand(“sp_KetQuaSV”, dbConn); dbCmd.CommandType = CommandType.StoredProcedure; dbCmd.Parameters.Add("@masv", OleDbType.VarWChar).Value = "A01“; dbCmd.ExecuteNonQuery(); c/- Gọi Stored Procedure – SqlCommand ß ß ß ß SqlCommand dbCmd = new SqlCommand(“sp_KetQuaSV”, dbConn); dbCmd.CommandType = CommandType.StoredProcedure; dbCmd.Parameters.Add("@masv", SqlType.NVarChar).Value = "A01“; dbCmd.ExecuteNonQuery(); 34 II.- ADO.NET 2.- Các đối tượng của ADO.NET c/- Đối tượng DataAdapter 1. Dùng luân chuyển và trao đổi dữ liệu, xử lý logic một cách hiệu quả giữa ứng dụng và CSDL 2. Mỗi đối tượng Command là một lệnh tách rời. DataAdapter cung cấp cùng lúc 4 đối tượng Command: Select, Insert, Update, Delete. 3. DataAdapter không lưu trữ dữ liệu mà chỉ đóng vai trò cầu nối giữa Connection và DataTable (DataSet). 35 II.- ADO.NET 2.- Các đối tượng của ADO.NET c/- Đối tượng DataAdapter (tt) 1. Khai báo sử dụng: ß ß Dim adap As New SqlDataAdapter(dbCmd) Dim adap As New OleDbDataAdapter(dbCmd) 2. Lưu ý: dbCmd là đối tượng SqlCommand hoặc OleDbCommand tương ứng, đã được tạo ra với SqlConnection hoặc OleDbConnection tương ứng và Connection này phải đã được mở (Open). 36 II.- ADO.NET 2.- Các đối tượng của ADO.NET c/- Đối tượng DataAdapter (tt) 3. Phương thức Fill – Đọc và lưu trữ dữ liệu ß ß ß DataAdapter cung cấp 4 đối tuợng Command trong đó phương thức Fill tương ứng với việc gọi SELECT Command Lệnh khai báo đối tượng ở slide trước chỉ nên dùng cho các đối tượng Command thực hiện lệnh SELECT Khi tạo DataAdapter có sử dụng cả 4 Command, chúng ta nên tạo riêng từng Command này. 37 II.- ADO.NET 2.- Các đối tượng của ADO.NET c/- Đối tượng DataAdapter (tt) 4. SELECT Command (đổi Sql thành OleDb để sử dụng OLEDB) ß ß ß ß ß SqlDataAdapter adap = new SqlDataAdapter(); adap.SelectCommand = new SqlCommand(“SELECT * FROM MonHoc”, dbConn); DataTable tbl = new DataTable(); adap.Fill(tbl); ‘ Các lệnh xử lý khác 38 II.- ADO.NET 2.- Các đối tượng của ADO.NET c/- Đối tượng DataAdapter (tt) 5.- Update – Cập nhật dữ liệu ß ß ß Phương thức Update hoạt động dựa trên 3 Command còn lại (Insert, Update, Delete) Khi trình bày dữ liệu trên Form thông qua các control, phương thức Update sẽ tự động cập nhật tất cả thay đổi lên CSDL thông qua 3 Command này Trước khi sử dụng, phải xây dựng tường minh 3 Command này 39 II.- ADO.NET 2.- Các đối tượng của ADO.NET c/- Đối tượng DataAdapter (tt) 6.- Đổi Sql thành OleDb để sử dụng OLEDB a/- INSERT Command … adap.InsertCommand = new SqlCommand(“INSERT INTO MonHoc VALUES (@mamh, @tenmh, @sotc)”, dbConn) adap.InsertCommand.Parameters.Add(“@mamh”).SourceColumn=“MaMH” adap.InsertCommand.Parameters.Add(“@tenmh”).SourceColumn=“TenMH” adap.InsertCommand.Parameters.Add(“@sotc”).SourceColumn=“SoTC” 40 II.- ADO.NET 2.- Các đối tượng của ADO.NET c/- Đối tượng DataAdapter (tt) b/- UPDATE Command … adap.UpdateCommand = New SqlCommand(“UPDATE MonHoc SET TenMH=@tenmh, SoTC=@sotc WHERE MaMH=@mamh”, dbConn) adap.UpdateCommand.Parameters.Add(“@mamh”).SourceColumn= “MaMH” adap.UpdateCommand.Parameters.Add(“@tenmh”).SourceColumn= “TenMH” adap.UpdateCommand.Parameters.Add(“@sotc”).SourceColumn=“SoTC” 41 II.- ADO.NET 2.- Các đối tượng của ADO.NET c/- Đối tượng DataAdapter (tt) c/- DELETE Command … adap.DeleteCommand = New SqlCommand(“DELETE MonHoc WHERE MaMH=@mamh”, dbConn) adap.DeleteCommand.Parameters.Add(“@mamh”).SourceColumn= “MaMH” d/- Sau khi xây dựng đủ 4 Command, sử dụng Fill để thực hiện SELECT Command lấy dữ liệu, z Sử dụng Update để cập nhật dữ liệu DataTable tbl = new DataTable(); adap.Fill(tbl); // Các lệnh thao tác khác adap.Update(tbl); 42 II.- ADO.NET 2.- Các đối tượng của ADO.NET c/- Đối tượng DataAdapter (tt) z Sử dụng đối tượng SqlCommandBuilder / OleDBCommandBuilder để xây dựng tự động 3 Command còn lại dựa vào SELECT Command được cung cấp ban đầu SqlDataAdapter adap = new SqlDataAdapter(“select * from SinhVien”, dbConn); SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(adap); DataTable tbl = new DataTable(); adap.Fill(tbl); ... 43 II.- ADO.NET 2.- Các đối tượng của ADO.NET c/- Đối tượng DataAdapter (tt) Ví dụ Đọc tên SV và hiển thị trong List private void btnKetNoi_Click(object sender, EventArgs e) { String connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\NghiaTran\Documents\qlsv.mdb;User ID=Admin;Password=“; OleDbConnection dbConn = new OleDbConnection(connStr); OleDbCommand dbCmd = new OleDbCommand("select * from sinhvien", dbConn); OleDbAdapter adap = new OleDbDataAdapter(dbCmd); DataSet ds = new DataSet(); DataRow dr = null; adap.Fill(ds); foreach (dr in ds.Tables(0).Rows) ListBox1.Items.Add(dr["tensv“].ToString()); dbConn.Close(); } 44 II.- ADO.NET 2.- Các đối tượng của ADO.NET c/- Đối tượng DataAdapter (tt) Ví dụ Hiển thị và cập nhật trong DataGrid 1. Tạo project mới, trong Form1 thêm các lệnh using cần thiết, vẽ 2 button và 1 DataGridView. Viết lệnh như sau // biến thành viên của form OleDbConnection dbConn = new OleDbConnection(connStr); OleDbDataAdapter adap = new OleDbDataAdapter(); private void btnMonHoc_Click(object sender, EventArgs e) { String connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\NghiaTran\Documents\qlsv.mdb;User ID=Admin;Password=“; // Gõ các lệnh xây dựng 4 Command ở các slide trước DataTable tbl = new DataTable(); adap.Fill(tbl); dgrSV.DataSource = tbl; } private void btnUpdate_Click(object sender, EventArgs e) { } adap.Update(dgrSV.DataSource); 45 NỘI DUNG (tt) I. II. III. IV. V. Mô hình triển khai ứng dụng ADO.NET Lưu trữ và xử lý dữ liệu Trình bày dữ liệu Xây dựng ứng dụng quản lý đặt và bán hàng VI. Crystal Report VII. Bảo mật trong ứng dụng 46 III.- LƯU TRỮ VÀ XỬ LÝ DỮ LIỆU 1. DataTable 2. DataSet 3. BindingSource ß ß Di chuyển dữ liệu Ràng buộc dữ liệu 4. Dùng DataRelation thiết lập quan hệ 5. Xử lý lỗi phát sinh khi chạy ứng dụng 47 II.-Lưu trữ và xử lý dữ liệu 1.- DataTable 1. Dùng lưu trữ và xử lý dữ liệu được lấy từ CSDL thông qua đối tượng DataAdapter 2. DataTable có khả năng tạo bảng mới với cấu trúc bảng được tạo thông qua các đối tượng DataColumn; thêm dữ liệu mới và cập nhật dữ liệu đã có bằng DataRow 3. Trong môn học này, DataTable chủ yếu được dùng để lưu trữ dữ liệu phục vụ cho việc trình bày dữ liệu trên Form 4. using System.Data 48 II.-Lưu trữ và xử lý dữ liệu 1.- Đối tượng DataTable (tt) Thuộc tính Mô tả ChildRelations Tập hợp những quan hệ trong đó bảng đóng vai trò bảng cha ParentRelations Tập hợp những quan hệ trong đó bảng đóng vai trò bảng con TableName Tên của DataTable Columns Tập hợp các cột trong bảng (thuộc lớp DataColumn) Rows Tập hợp các dòng dữ liệu của bảng (thuộc lớp DataRow) Constraints Tập hợp các ràng buộc trong bảng DataSet Cho biết DataSet chứa bảng DefaultView Cho biết DefaultView phát sinh từ bảng PrimaryKey Mảng các cột có chức năng làm khoá chính của bảng49 II.-Lưu trữ và xử lý dữ liệu 1.- Đối tượng DataTable (tt) Phương thức Mô tả GetChanges() Trả về một DataTable chứa các dòng dữ liệu bị người dùng thay đổi RejectChanges() Hủy bỏ tất cả những thay đổi của người dùng trên dữ liệu AcceptChanges() Chấp nhận tất cả những thay đổi của người dùng trên dữ liệu Clear() Xóa toàn bộ dữ liệu trong bảng Copy() Tạo DataTable mới có cùng cấu trúc và dữ liệu Clone() Tạo DataTable mới có cùng cấu trúc nhưng không có dữ liệu LoadDataRow Thêm các dòng dữ liệu mới dạng mảng vào bảng WriteXml Ghi toàn bộ cấu trúc và dữ liệu ra file XML ReadXml Đọc lại toàn bộ cấu trúc và dữ liệu từ file XML 50 II.-Lưu trữ và xử lý dữ liệu 2.- Đối tượng DataSet 1. ADO.NET hoạt động theo cơ chế Disconnected ß ß Tạo kết nối CSDL khi cần Ngắt kết nối khi thực hiện xong thao tác 2. Ưu điểm ß ß Không chiếm giữ nhiều tài nguyên Phục vụ được nhiều ứng dụng 3. Khuyết điểm ß Những thay đổi trên CSDL diễn ra tại một nơi khác sẽ không được cập nhật ngay cho người dùng 51 II.-Lưu trữ và xử lý dữ liệu 2.- Đối tượng DataSet (tt) 1. DataSet có thể được xem như một CSDL thu nhỏ, do nó có thể bao gồm nhiều: ß ß ß ß DataTable (các table, view trong CSDL) DataView DataRelation Stored Procedure 2. using System.Data 52 II.-Lưu trữ và xử lý dữ liệu 2.- Đối tượng DataSet (tt) DataSet DataTable Tables Relations Columns DataColumn Rows DataRow DataRelation 53 II.-Lưu trữ và xử lý dữ liệu 2.- Đối tượng DataSet (tt) Thuộc tính Mô tả Relations Tập hợp các quan hệ mộtnhiều giữa các DataTable của DataSet Tables Tập hợp các bảng, view, stored procedure của DataSet Name Tên của DataSet 54 II.-Lưu trữ và xử lý dữ liệu 2.- Đối tượng DataSet (tt) 1. Sử dụng các phương thức Add, Remove của hai đối tượng thuộc tính Relations và Tables để thêm, xóa DataTable hay DataRelation vào DataSet 2. Khi sử dụng phương thức Fill của DataAdapter cho DataSet thì DataSet sẽ có số lượng DataTable tương ứng với số lượng câu truy vấn trong đối tượng SELECT Command của DataAdapter 55 II.-Lưu trữ và xử lý dữ liệu 3.- BindingSource 1. Điều khiển việc di chuyển dữ liệu giữa các dòng trong DataTable. Trong chức năng này, BindingSource đóng vai trò cầu nối giữa DataTable với control hiển thị dữ liệu (DataGridView) 2. Cung cấp cơ chế tạo liên kết di chuyển, cập nhật giữa 2 DataTable khi xây dựng Master/Detail form 56 II.-Lưu trữ và xử lý dữ liệu Ví dụ về DataSet, DataTable, BindingSource 1. Tạo project mới, đặt tên Form là frmSinhVien 2. Thêm control DataGridView vào form 3. Thêm Toolbar vào form và tạo 5 button cùng 1 TextBox trên Toolbar như trên hình 57 II.-Lưu trữ và xử lý dữ liệu Ví dụ về DataSet, DataTable, BindingSource (tt) 4. Khai báo biến thành viên của lớp như sau: ß ß ß ß ß private String connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= C:\Users\NghiaTran\Documents\qlsv.mdb;User ID=Admin;Password=“; private OleDbConnection dbConn; private BindingSource bindSV; // dùng di chuyển record private OleDbDataAdapter adapSV; private DataSet dsSV; 58 II.-Lưu trữ và xử lý dữ liệu Ví dụ về DataSet, DataTable, BindingSource (tt) 5. Chận sự kiện Form_Load, thực hiện: private void KetQuaSV_Load(object sender, EventArgs e) { OleDbCommandBuilder cmdBuilder; // dùng xây dựng các lệnh dbConn = new OleDbConnection(connStr); dbConn.Open(); adapSV = new OleDbDataAdapter("select * from sinhvien", dbConn); cmdBuilder = new OleDbCommandBuilder(adapSV); dsSV = new DataSet(); adapSV.Fill(dsSV); // lấy và lưu trữ dữ liệu bindSV = new BindingSource(); // tạo BindingSource bindSV.DataSource = dsSV.Tables[0]; // chỉ định nguồn dữ liệu cho bind dgrSV.DataSource = bindSV; // nguồn dữ liệu cho lưới là bind } 59 II.-Lưu trữ và xử lý dữ liệu Ví dụ về DataSet, DataTable, BindingSource (tt) 6. Chận sự kiện Click của 4 button di chuyển private void goFirst_Click(object sender, EventArgs e) { bindSV.MoveFirst(); } private void goPrev_Click(object sender, EventArgs e) { bindSV.MovePrevious(); } private void goNext_Click(object sender, EventArgs e) { bindSV.MoveNext(); } private void goLast_Click(object sender, EventArgs e) { bindSV.MoveLast(); } 60 II.-Lưu trữ và xử lý dữ liệu Ví dụ về DataSet, DataTable, BindingSource (tt) 7. Cập nhật giá trị cho TextBox trên ToolBar Chận sự kiện SelectionChanged của DataGridView txtRec.Text = (bindSV.Position + 1).ToString() + " / " + dsSV.Tables(0).Rows.Count.ToString(); 8. Chận sự kiện Click của button Update để thực hiện lưu các thay đổi adapSV.Update(dsSV.Tables[0]); 9. F5 để chạy ứng dụng 61 II.-Lưu trữ và xử lý dữ liệu 4.- Dùng DataRelation thiết lập quan hệ 1. Tạo project mới, đặt tên Form là frmKQMH 2. Thêm 2 control DataGridView vào form 3. Thêm Toolbar vào form và tạo 5 button cùng 1 TextBox trên Toolbar như trên hình 62 II.-Lưu trữ và xử lý dữ liệu 4.- Dùng DataRelation thiết lập quan hệ (tt) 4. Khai báo các biến thành viên: private String connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\NghiaTran\Documents\qlsv.mdb;User ID=Admin;Password=“; private OleDbConnection dbConn; private BindingSource bindMH; // dùng cho Table DM_MonHoc private BindingSource bindKQ; // dùng cho Table KetQua private OleDbDataAdapter adapMH; // dùng cho Table DM_MonHoc private OleDbDataAdapter adapKQ; // dùng cho Table KetQua private DateSet dsKQMH; // tập DataSet chứa dữ liệu của cả 2 table DM_MonHoc và KetQua, đồng thời chứa Relation tạo ra cho 2 table này 63 II.-Lưu trữ và xử lý dữ liệu 4.- Dùng DataRelation thiết lập quan hệ (tt) Gõ các lệnh sau trong sự kiện Form_Load OleDbCommandBuilder cmdBuilder; DataTable tblMH, tblKQ; DataRelation relation; dbConn = new OleDbConnection(connStr); dbConn.Open(); ‘ Lấy và xử lý dữ liệu dm_monhoc dbCmd = new OleDbCommand(); adapMH = new OleDbDataAdapter("select * from dm_monhoc", dbConn); cmdBuilder = new OleDbCommandBuilder(adapMH) ‘ Lấy và xử lý dữ liệu ketqua adapKQ = new OleDbDataAdapter("select * from ketqua", dbConn); cmdBuilder = new OleDbCommandBuilder(adapKQ) ‘ Tạo DataSet chứa toàn bộ dữ liệu dsKQMH = new DataSet("dsKQMH"); ‘ Đặt dữ liệu từ 2 DataAdapter vào 2 table trong DataSet adapMH.Fill(dsKQMH, "Master"); adapKQ.Fill(dsKQMH, "Detail"); ‘ Tạo mối quan hệ giữa 2 table bằng DataRelation tblMH = dsKQMH.Tables["Master"]; tblKQ = dsKQMH.Tables["Detail"]; relation = new DataRelation("relKQMH", tblMH.Columns["MaMH"], tblKQ.Columns["MaMH"]); dsKQMH.Relations.Add(relation); ‘ Thiết lập quan hệ thực sự giữa 2 table bindMH = new BindingSource(); bindMH.DataSource = dsKQMH; bindMH.DataMember = "Master"; bindKQ = new BindingSource(); bindKQ.DataSource = bindMH; bindKQ.DataMember = "relKQMH“; ‘ Đặt nguồn dữ liệu hiển thị cho các control dgrMH.DataSource = bindMH; dgrKQ.DataSource = bindKQ; 64 II.-Lưu trữ và xử lý dữ liệu 4.- Dùng DataRelation thiết lập quan hệ (tt) 1. Các chức năng di chuyển học viên tự thực hiện 2. Khi chọn Update, ứng dụng cần cập nhật cả 2 table, do đó ta có 2 lệnh như sau: ß ß adapMH.Update(dsKQMH.Tables["Master"]); adapKQ.Update(dsKQMH.Tables["Detail"]); 65 II.-Lưu trữ và xử lý dữ liệu 5.- Xử lý lỗi phát sinh khi chạy ứng dụng 1. Giúp ứng dụng không bị hệ điều hành bắt ngưng hoạt động đột ngột khi xảy ra lỗi 2. Khi sử dụng bất kỳ phương thức nào của các đối tượng ADO.NET, cần tham khảo kỹ phương thức này sẽ phát sinh những ngoại lệ (exception) nào để ứng dụng có thể chận bắt hợp lệ 66 II.-Lưu trữ và xử lý dữ liệu 5.- Xử lý lỗi phát sinh khi chạy ứng dụng (tt) 1. Sử dụng khối try … catch cho ngoại lệ try { Các lệnh xử lý } catch ( ex1) { Các lệnh xử lý lỗi } … catch ( exn) { Các lệnh xử lý lỗi } 67 II.-Lưu trữ và xử lý dữ liệu 5.- Xử lý lỗi phát sinh khi chạy ứng dụng(tt) try { dbConn = new OleDbConnection(connStr); dbConn.Open(); // Lấy và xử lý dữ liệu dm_monhoc dbCmd = new OleDbCommand(); adapMH = new OleDbDataAdapter("SELECT * FROM dm_monhoc", dbConn); cmdBuilder = new OleDbCommandBuilder(adapMH); // Lấy và xử lý dữ liệu ketqua ... } catch (OleDbException ex) { MessageBox.Show(ex.Message, “Lỗi”, ...) } 68 NỘI DUNG (tt) 1. 2. 3. 4. 5. Mô hình triển khai ứng dụng ADO.NET Lưu trữ và xử lý dữ liệu Trình bày dữ liệu Xây dựng ứng dụng quản lý đặt và bán hàng 6. Crystal Report 7. Bảo mật trong ứng dụng 69 IV.- TRÌNH BÀY DỮ LIỆU 1. DataView 2. DataGridView 3. Windows Form controls ß ß ß ß Label TextBox CheckBox ComboBox / ListBox 4. Binding Navigator 70 IV.- TRÌNH BÀY DỮ LIỆU 1.-DataView 1. Tương tự như view trong SQL Server, DataView là một dạng trình bày dữ liệu cho DataTable 2. Một DataView phải gắn kết với một DataTable 3. Một DataTable có thể có nhiều DataView 4. Mỗi đối tượng DataTable đều có sẵn một DataView mặc định (thuộc tính DefaultView) 71 IV.- TRÌNH BÀY DỮ LIỆU 1.-DataView (tt) 1. Lọc dữ liệu ß ß String str = “ HoSV like ‘Trần*’ ”; tbl.DefaultView.RowFilter = str; 2. Sắp xếp dữ liệu ß ß String str = “TenSV ASC”; tbl.DefaultView.Sort = str; 72 IV.- TRÌNH BÀY DỮ LIỆU 1.-DataView (tt) 1. Tạo view mới cho DataTable ß ß ß ß View viewSortTenHo = new View(); viewSortTenHo.Table = tbl; viewSortTenHo.Sort = “TenSV DESC, HoSV ASC”; dgr.DataSource = viewSortTenHo; 73 IV.- TRÌNH BÀY DỮ LIỆU 2.- DataGridView 1. Tiếp nhận và trình bày dữ liệu từ các đối tượng DataSet, DataTable, DataView 2. Đây là đối tượng tiện dụng nhất cho việc xem và nhập dữ liệu dạng bảng 3. Dữ liệu được cung cấp cho DataGridView thông qua thuộc tính DataSource và DataMember (nếu nguồn dữ liệu là DataSet) dgr.DataSource = dsKQMH dgr.DataMember = “Master” 74 IV.- TRÌNH BÀY DỮ LIỆU 2.- DataGridView (tt) 1. Thuộc tính CurrentRow: xác định dòng hiện hành 2. Thuộc tính CurrentCell: xác định ô hiện hành 3. Thuộc tính RowCount: xác định số lượng dòng 4. Thuộc tính ColumnCount: xác định số lượng cột 5. Rows(i)(j): xác định ô tại vị trí dòng i cột j 6. Rows(i)(j).Value: đọc (hay ấn định) giá trị cho ô tại vị trí dòng i cột j 75 IV.- TRÌNH BÀY DỮ LIỆU 2.- DataGridView (tt) 6. Các sự kiện phát sinh (thường sử dụng) ß ß ß SelectionChanged: xảy ra khi user di chuyển con trỏ sang dòng dữ liệu khác. Dùng sự kiện này để cập nhật lại thông tin hoặc kiểm tra tính đúng đắn của thông tin được nhập vào DoubleClick: phát sinh khi user nhấn đôi chuột lên DataGridView. Có thể dùng để hiển thị thông tin chi tiết của dòng được nhấn hoặc liên kết đến form dữ liệu khác CellClick: phát sinh khi user nhấn trái chuột lên 1 cell của DataGridView. Thường dùng cho cột Button 76 IV.- TRÌNH BÀY DỮ LIỆU 2.- DataGridView (tt) Các control nhập liệu 1. Khi muốn DataGridView hiển thị các cột theo ý muốn của mình (ComboBox, số lượng cột), ta có thể tạo riêng từng cột và thêm vào DataGridView 2. Cột của DataGridView có thể có dạng: ß ß ß ß TextBox (mặc định) ComboBox Command Button CheckBox 77 IV.- TRÌNH BÀY DỮ LIỆU 2.- DataGridView (tt) Các control nhập liệu: TextBox 1. Đối với control dạng này, ta cần quan tâm đến thuộc tính: ß DataPropertyName: chỉ định tên field của nguồn dữ liệu cung cấp cho DataGridView. TextBox control sẽ lấy dữ liệu từ field này để hiển thị và cập nhật dữ liệu 2. Ngoài ra, ta có thể điều chỉnh tiêu đề và dạng trình bày (font) DataGridViewCellStyle cellStyleBoldItalicRed = new DataGridViewCellStyle(); cellStyleBoldItalicRed.ForeColor = Color.Red; cellStyleBoldItalicRed.Font = new Font("Times New Roman", 10, FontStyle.Bold | FontStyle.Italic); DataGridViewTextBoxColumn dgrcolDiem = new DataGridViewTextBoxColumn(); dgrcolDiem.DataPropertyName = “DIEM”; dgrcolDiem.HeaderText = “Điểm”; dgrcolDiem.DefaultCellStyle = cellStyleBoldItalicRed; dgrKQ.Columns.Add(dgrcolDiem); 78 IV.- TRÌNH BÀY DỮ LIỆU 2.- DataGridView (tt) Các control nhập liệu: ComboBox 1. Ngoài DataPropertyName, ta cần quan tâm đến những thuộc tính sau: ß ß ß DataSource: nguồn dữ liệu hiển thị cho ComboBox DisplayMember: field của nguồn dữ liệu. ComboBox sẽ hiển thị dữ liệu trong field này ValueMember: field của nguồn dữ liệu. ComboBox sẽ lấy dữ liệu trong field này cập nhật vào DataPropertyName 79 IV.- TRÌNH BÀY DỮ LIỆU 2.- DataGridView (tt) Các control nhập liệu: ComboBox (tt) DataGridViewComboBoxColumn dgrcolSV = new DataGridViewComboBoxColumn(); dgrcolSV.DataSource = dsKQMH.Tables["DM_SV"]; dgrcolSV.ValueMember = "MASV"; dgrcolSV.DisplayMember = "HoTen"; dgrcolSV.DataPropertyName = "masv"; dgrcolSV.HeaderText = "Sinh Viên"; dgrKQ.Columns.Add(dgrcolSV); 80 IV.- TRÌNH BÀY DỮ LIỆU 2.- DataGridView (tt) Ví dụ về Các control nhập liệu 1. Sử dụng lại project đã xây dựng trong Slide 60 2. Xây dựng lại sự kiện Form_Load như sau 81 IV.- TRÌNH BÀY DỮ LIỆU 2.- DataGridView (tt) Ví dụ về Các control nhập liệu z Khai báo thêm biến thành viên dưới đây để lấy dữ liệu về danh mục sinh viên: private OleDbDataAdapter adapDMSV; z Chỉ định dữ liệu cho adapDMSV: adapDMSV = new OleDbDataAdapter("SELECT masv, hosv & \" \" & tensv as hoten FROM sinhvien", dbConn); z Lấy dữ liệu vào DataSet adapDMSV.Fill(dsKQMH, “DM_SV”); 82 IV.- TRÌNH BÀY DỮ LIỆU 2.- DataGridView (tt) Ví dụ về Các control nhập liệu Thay lệnh dgrKQ.DataSource = bindKQ bằng các lệnh sau: DataGridViewComboBoxColumn dgrcolSV=new DataGridViewComboBoxColumn();// ComboBox column dgrcolSV.DataSource = dsKQMH.Tables["DM_SV"]; // Chỉ định nguồn dữ liệu hiển thị dgrcolSV.ValueMember = "MASV"; dgrcolSV.DisplayMember = "HoTen"; dgrcolSV.DataPropertyName = "masv“; // Chỉ định dữ liệu cập nhật dgrcolSV.HeaderText = "Sinh viên“; dgrKQ.Columns.Add(dgrcolSV); // Thêm cột vào DataGridView DataGridViewCellStyle cellStyleBoldItalicRed = new DataGridViewCellStyle();// Định dạng hiển thị cell cellStyleBoldItalicRed.ForeColor = Color.Red; cellStyleBoldItalicRed.Font = new Font("Times New Roman", 10, FontStyle.Bold Or FontStyle.Italic); DataGridViewTextBoxColumn dgrcolDiem = new DataGridViewTextBoxColumn();// Tạo TextBox column dgrcolDiem.DataPropertyName = "diem“ ; // Chỉ định dữ liệu cập nhật dgrcolDiem.HeaderText = "Điểm“; dgrcolDiem.DefaultCellStyle = cellStyleBoldItalicRed; dgrKQ.Columns.Add(dgrcolDiem); // Thêm cột vào DataGridView dgrKQ.DataSource = bindKQ; // Chỉ định nguồn dữ liệu cho DataGridView dgrKQ.Columns["MAMH"].Visible = false; // Ẩn cột MAMH 83 IV.- TRÌNH BÀY DỮ LIỆU 4.-Ràng buộc dữ liệu với các control WindowsForm 1. Ngoài DataGridView cho phép hiển thị (và cập nhật dữ liệu) nhiều record, các control thông thường của WindowsForm cũng có thể hiển thị và cập nhật dữ liệu 2. Label 3. TextBox 4. CheckBox 5. ComboBox / ListBox 84 IV.- TRÌNH BÀY DỮ LIỆU 4.-Ràng buộc dữ liệu với các control WindowsForm: Label 1. Label là control chỉ hiển thị mà không cho phép chỉnh sửa dữ liệu 2. Cú pháp: .DataBindings.Add(“Tên thuộc tính”, nguồn dữ liệu, “Tên field”) 3. Ví dụ: lblMaMH.DataBindings.Add(“Text”, bindMH, “MaMH”) 85 IV.- TRÌNH BÀY DỮ LIỆU 4.-Ràng buộc dữ liệu với các control WindowsForm: TextBox 1. TextBox là control cho phép hiển thị và chỉnh sửa dữ liệu 2. Cú pháp: .DataBindings.Add(“Tên thuộc tính”, nguồn dữ liệu, “Tên field”) 3. Ví dụ: txtTenMH.DataBindings.Add(“Text”, bindMH, “TenMH”) 86 IV.- TRÌNH BÀY DỮ LIỆU 4.-Ràng buộc dữ liệu với các control WindowsForm: CheckBox 1. CheckBox thường được ràng buộc với các field có kiểu Yes/No (Bit) trong dữ liệu 2. Cú pháp: .DataBindings.Add(“Tên thuộc tính”, nguồn dữ liệu, “Tên field”) 3. Ví dụ: chkPhaiNu.DataBindings.Add(“Checked”, bindSV, “PhaiNu”) 87 IV.- TRÌNH BÀY DỮ LIỆU 4.-Ràng buộc dữ liệu với các control WindowsForm: ComboBox 1. Thường dùng cho những field là khóa ngoại tham chiếu đến một table khác 2. ListBox sử dụng tương tự 3. Cú pháp phần dữ liệu cập nhật: .DataBindings.Add(“Tên thuộc tính”, nguồn dữ liệu, “Tên field”) 4. Ví dụ: cboDMKhoa.DataBindings.Add(“SelectedValue”, bindSV, “MaKhoa”) 88 IV.- TRÌNH BÀY DỮ LIỆU 4.-Ràng buộc dữ liệu với các control WindowsForm:ComboBox (tt) 5. Cú pháp phần dữ liệu hiển thị: .DataSource = nguồn dữ liệu .DisplayMember = “field hiển thị” .ValueMember = “field giá trị” 6. Ví dụ: cboDMKhoa.DataSource = dsSV.Tables[“DM-Khoa”]; cboDMKhoa.DisplayMember = “TenKhoa”; cboDMKhoa.ValueMember = “MaKhoa”; 89 IV.- TRÌNH BÀY DỮ LIỆU 5.- Binding Navigator 1. Cho phép user sử dụng để duyệt (di chuyển) giữa các record (đầu, cuối, trước, sau), thêm mới, xóa, cập nhật các record 2. Binding Navigator nằm trên ToolBox thuộc nhóm Data 3. Sau khi đưa vào form, ta ấn định thuộc tính BindingSource của control này bindNaviSV.BindingSource = bindSV 90 IV.- TRÌNH BÀY DỮ LIỆU 6.- Ví dụ form danh mục sinh viên 1. Tạo project mới, đặt tên form là frmQLSV 2. Thêm các control (Label, TextBox, ComboBox, DateTimePicker, BindingNavigator) vào form như hình vẽ 91 IV.- TRÌNH BÀY DỮ LIỆU 6.- Ví dụ form danh mục sinh viên (tt) 3. Khai báo các biến thành viên private String connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\NghiaTran\Documents\qlsv.mdb ;User ID=Admin;Password=“; private OleDbConnection dbConn; private OleDbDataAdapter adapSV; private OleDbDataAdapter adapKhoa; private DataSet dsSV; private BindingSource bindSV; 92 IV.- TRÌNH BÀY DỮ LIỆU 6.- Ví dụ form danh mục sinh viên (tt) 4. Gõ các lệnh sau vào sự kiện Form_Load dbConn = new OleDbConnection(connStr); dbConn.Open(); adapSV = new OleDbDataAdapter("select * from sinhvien", dbConn); OleDbCommandBuilder cmdBuilder = new OleDbCommandBuilder(adapSV); adapKhoa = new OleDbDataAdapter("select * from dm_khoa", dbConn); dsSV = new DataSet(); adapSV.Fill(dsSV, "SinhVien"); adapKhoa.Fill(dsSV, "Khoa"); bindSV = new BindingSource(); bindSV.DataSource = dsSV.Tables["sinhvien"]; bindSV.AllowNew = true; txtMaSV.DataBindings.Add("Text", bindSV, "MaSV"); txtHoSV.DataBindings.Add("Text", bindSV, "HoSV"); txtTenSV.DataBindings.Add("Text", bindSV, "tensv"); chkPhaiNu.DataBindings.Add("Checked", bindSV, "PhaiNu"); dtpNgaySinh.DataBindings.Add("Value", bindSV, "NgaySinh"); txtNoiSinh.DataBindings.Add("Text", bindSV, "NoiSinh"); txtHocBong.DataBindings.Add("Text", bindSV, "HocBong"); cboKhoa.DataSource = dsSV.Tables["khoa"]; cboKhoa.DisplayMember = "TenKhoa“; cboKhoa.ValueMember = "MaKhoa“; cboKhoa.DataBindings.Add("SelectedValue", bindSV, "MaKhoa"); bindNaviSV.BindingSource = bindSV; 93 IV.- TRÌNH BÀY DỮ LIỆU 6.- Ví dụ form danh mục sinh viên (tt) 5.Trên control BindingNavigator, thêm một Button item mới và chỉ định hình ảnh cho item này 6. Button này có chức năng cập nhật các thay đổi dữ liệu trên form, double click vào Button và gõ: bindSV.EndEdit(); adapSV.Update(dsSV, "sinhvien"); 94 NỘI DUNG (tt) 1. 2. 3. 4. 5. Mô hình triển khai ứng dụng ADO.NET Lưu trữ và xử lý dữ liệu Trình bày dữ liệu Xây dựng ứng dụng quản lý đặt và bán hàng 6. Crystal Report 7. Bảo mật trong ứng dụng 95 V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG 1. Thiết kế dữ liệu ß Mô tả ứng dụng ß Tables 2. Thiết kế giao diện ß ß ß ß Main Danh mục Master / Detail Báo biểu 3. Thiết kế xử lý ß Views ß Stored Procedures ß Triggers 4. Xây dựng ứng dụng ß Quy hoạch DataSet ß Cài đặt giao diện 96 V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG 1.- Thiết kế dữ liệu a/- Mô tả ứng dụng LoaiHH (1,n) (1,1) thuộc HangHoa (0,n) (0,n) (0,n) KhachHang (0,n) gồm gồm lập lập (1,n) DonDatHang (1,n) (1,n) (1,1) (1,1) HoaDon (1,1) (1,1) (0,n) lập do NhanVien lập do 97 V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG 1.- Thiết kế dữ liệu b/- Tables CHITIETDDH SODDH Nvarchar(10) MAHH Nvarchar(10) SOLUONG integer KHACHHANG MAKH Nvarchar(10) TENKH Nvarchar(50) DIACHI Nvarchar(50) DIENTHOAI Nvarchar(15) FAX Nvarchar(15) MAHH = MAHH MALOAI TENLOAI SODDH = SODDH LOAIHH Nvarchar(10) Nvarchar(10) MAHH = MALOAI MAKH = MAKH MANV = MANV SODDH NGAYDH NGAYGH TONGTIEN MAKH MANV DDH Nvarchar(10) timestamp timestamp float Nvarchar(10) Nvarchar(10) HANGHOA MAHH Nvarchar(10) TENHH Nvarchar(50) MOTA Nvarchar(100) THOIGIANBH timestamp DVT Nvarchar(10) DONGIA float MALOAI Nvarchar(10) SODDH = SODDH NHANVIEN MANV Nvarchar(10) TENNV Nvarchar(50) DIACHI Nvarchar(50) DIENTHOAI Nvarchar(15) MANV = MANV HOADON SOHD Nvarchar(10) NGAYHD timestamp TONGTIEN float SODDH Nvarchar(10) MANV Nvarchar(10) SOHD = SOHD CHITIETHD SOHD Nvarchar(10) MAHH Nvarchar(10) SOLUONG integer 98 V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG 2.- Thiết kế giao diện a/– 1. 2. Main Màn hình chính được thiết kế dạng MDI có hệ thống trình đơn gọi các giao diện Hệ thống trình đơn: ß Ứng dụng z Đăng nhập z Đăng xuất z Thoát ß ß z Lập đơn đặt hàng z Báo cáo Danh mục z z z z Loại hàng hóa Hàng hóa Khách hàng Nhân viên Đặt hàng ß Hóa đơn z Lập hóa đơn z Báo cáo 99 V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG 2.- Thiết kế giao diện b/–Danh 1. mục Các giao diện cho cập nhật danh mục được thiết kế cho phép xem và chỉnh sửa theo cả 2 dạng ß ß Grid (xem và chỉnh sửa tổng thể) Columnar (xem và chỉnh sửa chi tiết) 100 V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG 2.- Thiết kế giao diện c/– Master/Detail 1. Hai chức năng: đơn đặt hàng và hóa đơn sẽ được thiết kế giao diện dạng Master/Detail 101 V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG 2.- Thiết kế giao diện d/–Báo biểu 1. Báo biểu thống kê cho các đơn đặt hàng / hóa đơn từ ngày … đến ngày … 102 V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG 2.- Thiết kế xử lý a/– View 1. Khi trình bày dữ liệu trên form, ta nên tạo ra các View đối với các ComboBox muốn hiển thị nhiều field ß Thông tin hàng hóa hiển thị trong các ComboBox nên là Mã hàng hóa, Tên hàng hóa kết hợp với đơn vị tính 2. Tạo các View cho các báo biểu không cần tham số đầu vào 103 V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG 2.- Thiết kế xử lý b/– Stored Procedures 1. Tạo các stored procedure phục vụ cho các mục tiêu sau: ß ß ß ß Các xử lý, tính toán phức tạp trên form Cập nhật các giá trị được tính toán liên quan hệ, liên thuộc tính Truy vấn các giá trị tính toán bổ sung không thuộc phạm vi dữ liệu trên form Các báo biểu cần tham số đầu vào 104 V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG 2.- Thiết kế xử lý c/–Triggers 1. Liệt kê và cài đặt tất cả các ràng buộc toàn vẹn cho dữ liệu ß ß ß ß ß ß 2. Số lượng của một mặt hàng được đặt trong một đơn đặt hàng phải ≥ số lượng đã bán của mặt hàng này trong các hóa đơn của đơn đặt hàng đó Tổng tiền của một đơn đặt hàng phải bằng tổng số tiền của các mặt hàng trong đơn đặt hàng đó Các mặt hàng trong một hóa đơn phải thuộc một trong các mặt hàng đã được đặt hàng trong đơn đặt hàng tương ứng Số lượng của một mặt hàng trong một hóa đơn không được vượt quá số lượng đã đặt của mặt hàng này Tổng tiền của một hóa đơn phải bằng tổng số tiền của các mặt hàng trong hóa đơn đó Ngày lập hóa đơn không thể trước ngày đặt hàng Chú ý: tránh cài đặt trùng lặp các chức năng đã được xử lý trong stored procedure 105 V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG 3.- Xây dựng ứng dụng a/–Quy hoạch DataSet 1. Nguồn cung cấp dữ liệu cho một form nên được quản lý gói gọn trong một DataSet 2. Dựa vào phần thiết kế giao diện, ta cần xác định những dữ liệu nào cần thiết ß ß Tạo DataAdapter và CommandBuilder cho các dữ liệu có cập nhật Tạo DataAdapter cho các dữ liệu tham chiếu 3. Fill các DataAdapter này vào một DataSet 106 V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG 3.- Xây dựng ứng dụng b/– 1. 2. 3. Xây dựng giao diện Dữ liệu cần cho form: Table LoaiHH Dữ liệu được cập nhật: LoaiHH DataSet cho form danh mục loại hàng hóa: dsLoaiHH 107 V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG 3.- Xây dựng ứng dụng b/– Xây dựng giao diện (tt) 4. Bổ sung form mới vào project, frmDMLoaiHH 5. Thêm TabControl vào form, đặt tên là TabLoaiHangHoa ß TabPage1: z z ß Name: tabPageLoaiHHAll Text: Tất cả TabPage2: z z Name: tabPageLoaiHHDetail Text: Chi tiết 108 V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG 3.- Xây dựng ứng dụng b/– Xây dựng giao diện (tt) 6. Trong tabPageLoaiHHAll, thêm DataGridView, dgrLoaiHH 7. Trong tabPageLoaiHHDetail, thêm 2 Label, 2 TextBox. 8. Đặt tên cho 2 TextBox tương ứng với tên field (txtMaLoaiHH, txtTenLoaiHH) 109 V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG 3.- Xây dựng ứng dụng b/– Xây dựng giao diện (tt) 9. Đặt control BindingNavigator vào form, tên bindNaviLoaiHH 10. Bổ sung 1 Button, 1 Label và 1 TextBox (txtFilter) vào trên control này Update Button Label txtFilter Click để thêm control mới 110 V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG 3.- Xây dựng ứng dụng b/– Xây dựng giao diện (tt) 11. Khai báo thư viện SQL using System.Data.SqlClient; 12. Khai báo các biến thành viên private String connStr = "Data Source=(local);Initial Catalog=qlbh;Integrated Security=True“; private SqlConnection dbConn // kết nối CSDL private SqlDataAdapter adapLoaiHH private DataSet dsLoaiHH; // chứa dữ liệu cho form private BindingSource bindLoaiHH;// di chuyển trên dữ liệu 111 V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG 3.- Xây dựng ứng dụng b/– Xây dựng giao diện (tt) private void frmHangHoa_Load(object sender, EventArgs e) { try { dbConn = new SqlConnection(connStr); dbConn.Open(); adapLoaiHH = new SqlDataAdapter("select * from loaihh", dbConn); SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(adapLoaiHH); dsLoaiHH = new DataSet(); adapLoaiHH.Fill(dsLoaiHH, "LoaiHH"); bindHH = new BindingSource(); bindHH.DataSource = dsLoaiHH; bindHH.DataMember = “LoaiHH“; BindingControls(); } catch (SqlException ex) { MessageBox.Show(ex.Message, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error); } } 112 V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG 3.- Xây dựng ứng dụng b/– Xây dựng giao diện (tt) private void BindingControls() { dgrLoaiHH.DataSource = bindHH; FormatDataGridView(); // định dạng và điều chỉnh cột cho DataGridView txtMaLoaiHH.DataBindings.Add("Text", bindLoaiHH, "MaLoai"); txtTenLoaiHH.DataBindings.Add("Text", bindLoaiHH, "TenLoai"); bindNaviLoaiHH.BindingSource = bindLoaiHH; } private void FormatDataGridView() { dgrLoaiHH.Columns[0].HeaderText = "Mã loại hàng hóa“; dgrLoaiHH.Columns[1].HeaderText = "Tên loại hàng hóa“; } 113 V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG 3.- Xây dựng ứng dụng b/– Xây dựng giao diện (tt) private void tsbtnUpdate_Click(object sender, EventArgs e) { try { if (dgrLoaiHH.Focused = false) bindLoaiHH.EndEdit(); adapLoaiHH.Update(dsLoaiHH, “LoaiHH"); } Catch (SqlException ex) { MessageBox.Show(ex.Message, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error); } } 114 V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG 3.- Xây dựng ứng dụng b/– Xây dựng giao diện (tt) 13. Dữ liệu cần cho form: Table HangHoa, LoaiHH 14. Dữ liệu được cập nhật: HangHoa 15. DataSet cho form danh mục hàng hóa: dsHH 115 V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG 3.- Xây dựng ứng dụng b/– Xây dựng giao diện (tt) 16. Bổ sung form mới vào project, frmDMHH 17. Thêm TabControl vào form, đặt tên là TabHangHoa ß TabPage1: z z ß Name: tabPageHHAll Text: Tất cả TabPage2: z z Name: tabPageHHDetail Text: Chi tiết 116 V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG 3.- Xây dựng ứng dụng b/– Xây dựng giao diện (tt) 17. Trong tabPageHHAll, thêm DataGridView, dgrHH 18. Trong tabPageHHDetail, thêm 7 Label, 6 TextBox và 1 ComboBox. 19. Đặt tên cho 6 TextBox tương ứng với tên field (txtMaHH, txtTenHH, ...) 20. Đặt tên cho ComboBox là cboLoaiHH 117 V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG 3.- Xây dựng ứng dụng b/– Xây dựng giao diện (tt) 21. Đặt control BindingNavigator vào form, tên bindNaviHH 22. Bổ sung 1 Button, 1 Label và 1 TextBox (txtFilter) vào trên control này Update Button Label txtFilter Click để thêm control mới 118 V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG 3.- Xây dựng ứng dụng b/– Xây dựng giao diện (tt) 23. Khai báo thư viện SQL using System.Data.SqlClient; 24. Khai báo các biến thành viên private String connStr = "Data Source=(local);Initial Catalog=qlbh;Integrated Security=True“; private SqlConnection dbConn; // kết nối CSDL private SqlDataAdapter adapHH; // HangHoa DataAdapter private SqlDataAdapter adapLoaiHH; private DataSet dsHH; // DataSet chứa dữ liệu cho form private BindingSource bindHH; // di chuyển trên dữ liệu 119 V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG 3.- Xây dựng ứng dụng b/– Xây dựng giao diện (tt) private void frmHangHoa_Load(object sender, EventArgs e) { try { dbConn = new SqlConnection(connStr); dbConn.Open(); adapHH = new SqlDataAdapter("select * from hanghoa", dbConn); adapLoaiHH = new SqlDataAdapter("select * from loaihh", dbConn); SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(adapHH); dsHH = new DataSet(); adapHH.Fill(dsHH, "HangHoa"); adapLoaiHH.Fill(dsHH, "LoaiHH"); bindHH = new BindingSource(); bindHH.DataSource = dsHH; bindHH.DataMember = "HangHoa“; BindingControls(); } catch (SqlException ex) { MessageBox.Show(ex.Message, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error); } } 120 V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG 3.- Xây dựng ứng dụng b/– Xây dựng giao diện (tt) private void BindingControls() { dgrHH.DataSource = bindHH; FormatDataGridView();// định dạng và điều chỉnh cột cho DataGridView txtMaHH.DataBindings.Add("Text", bindHH, "MaHH"); txtTenHH.DataBindings.Add("Text", bindHH, "TenHH"); txtMoTa.DataBindings.Add("Text", bindHH, "MoTa"); txtTGBH.DataBindings.Add("Text", bindHH, "ThoiGianBH"); txtDVT.DataBindings.Add("Text", bindHH, "DVT"); txtDG.DataBindings.Add("Text", bindHH, "DonGia"); cboLoaiHH.DataBindings.Add("SelectedValue", bindHH, "MaLoai"); cboLoaiHH.DataSource = dsHH.Tables["LoaiHH“]; cboLoaiHH.DisplayMember = "TenLoai“; cboLoaiHH.ValueMember = "MaLoai“; bindNaviHangHoa.BindingSource = bindHH; } 121 V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG 3.- Xây dựng ứng dụng b/– Xây dựng giao diện (tt) private void FormatDataGridView() { dgrHH.Columns[0].HeaderText = "Mã hàng hóa“; dgrHH.Columns[1].HeaderText = "Tên hàng hóa“; dgrHH.Columns[2].HeaderText = "Mô tả“; dgrHH.Columns[3].HeaderText = "Thời gian bảo hành“; dgrHH.Columns[4].HeaderText = "Đơn vị tính“; dgrHH.Columns[5].HeaderText = "Đơn giá“; // Loại bỏ cột loại hàng hóa cũ và thay bằng ComboBox dgrHH.Columns.RemoveAt(6); DataGridViewComboBoxColumn dgrcolLoaiHH=new DataGridViewComboBoxColumn(); dgrcolLoaiHH.HeaderText = "Loại hàng hóa“; dgrcolLoaiHH.DataPropertyName = "MaLoai“; // Field cập nhật của table HangHoa dgrcolLoaiHH.DataSource = dsHH.Tables["LoaiHH“]; dgrcolLoaiHH.DisplayMember = "TenLoai“; dgrcolLoaiHH.ValueMember = "MaLoai“; dgrcolLoaiHH.Name = "MaLoai“; dgrHH.Columns.Add(dgrcolLoaiHH); //Thêm cột mới } 122 V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG 3.- Xây dựng ứng dụng b/– Xây dựng giao diện (tt) private void tsbtnUpdate_Click(object sender, EventArgs e) { try { if (dgrHH.Focused = false) bindHH.EndEdit(); adapHH.Update(dsHH, "HangHoa"); } catch (SqlException ex) { MessageBox.Show(ex.Message, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error) } } 123 V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG 3.- Xây dựng ứng dụng b/– Xây dựng giao diện (tt) 25. Dữ liệu cần cho form: Table DDH, CTDDH, NhanVien, KhachHang, HangHoa 26. Dữ liệu được cập nhật: DDH, CTDDH 27. DataSet cho form đặt hàng: dsDatHang 124 V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG 3.- Xây dựng ứng dụng b/– Xây dựng giao diện (tt) 28. Bổ sung form mới vào project, frmDatHang 29. Thêm 2 DataGridView (dgrDDH, dgrCTDDH) vào form 125 V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG 3.- Xây dựng ứng dụng b/– Xây dựng giao diện (tt) 30. Đặt control BindingNavigator vào form, tên bindNaviDDH 31. Bổ sung 1 Button, 1 Label và 1 TextBox (txtFilter) vào trên control này Update Button Label txtFilter Click để thêm control mới 126 V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG 3.- Xây dựng ứng dụng b/– Xây dựng giao diện (tt) 32. Khai báo thư viện SQL using System.Data.SqlClient; 33. Khai báo các biến thành viên private String connStr = "Data Source=(local);Initial Catalog=qlbh;Integrated Security=True“; private SqlConnection dbConn; // kết nối CSDL private SqlDataAdapter adapDDH; private SqlDataAdapter adapCTDDH; private SqlDataAdapter adapKH; private SqlDataAdapter adapNV; private SqlDataAdapter adapHH; private DataSet dsDatHang; private BindingSource bindDDH; private BindingSource bindCTDDH; private DataRelation relDDH; // Tạo quan hệ Master / Detail 127 V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG 3.- Xây dựng ứng dụng b/– Xây dựng giao diện (tt) private void frmDatHang_Load(object sender, EventArgs e) { try { dbConn = new SqlConnection(connStr); dbConn.Open(); adapDDH = new SqlDataAdapter("select * from DDH", dbConn); adapCTDDH = new SqlDataAdapter("select * from CTDDH", dbConn); adapKH = new SqlDataAdapter("select MaKH, TenKH from KhachHang", dbConn); adapNV = new SqlDataAdapter("select MaNV, TenNV from NhanVien", dbConn); adapHH = new SqlDataAdapter("select MaHH, MoTaHH from vHangHoa", dbConn); SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(adapDDH); cmdBuilder = new SqlCommandBuilder(adapCTDDH); dsDatHang = new DataSet(); adapDDH.Fill(dsDatHang, "DDH"); adapCTDDH.Fill(dsDatHang, "CTDDH"); adapKH.Fill(dsDatHang, "KhachHang"); adapNV.Fill(dsDatHang, "NhanVien"); adapHH.Fill(dsDatHang, "HangHoa"); 128 V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG 3.- Xây dựng ứng dụng b/– Xây dựng giao diện (tt) relDDH = new DataRelation("relDDH", dsDatHang.Tables["DDH“].Columns["SoDDH“], dsDatHang.Tables["CTDDH“].Columns["SoDDH“]); dsDatHang.Relations.Add(relDDH); bindDDH = new BindingSource(); bindDDH.DataSource = dsDatHang; bindDDH.DataMember = "DDH“; bindCTDDH = new BindingSource(); bindCTDDH.DataSource = bindDDH; bindCTDDH.DataMember = "relDDH“; dgrDDH.DataSource = bindDDH; dgrCTDDH.DataSource = bindCTDDH; FormatDataGrid(); bindNaviDDH.BindingSource = bindDDH; } catch (SqlException ex) { MessageBox.Show(ex.Message, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error) } } 129 V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG 3.- Xây dựng ứng dụng b/– Xây dựng giao diện (tt) dgrDDH.Columns["SoDDH“].HeaderText = "Số ĐĐH“; dgrDDH.Columns["NgayDH“].HeaderText = "Ngày ĐH“; dgrDDH.Columns["NgayGH“].HeaderText = "Ngày GH“; dgrDDH.Columns["TongTien“].HeaderText = "Tổng tiền“; private void FormatDataGrid() { DataGridViewComboBoxColumn dgrcolKH, dgrcolNV, dgrcolHH; dgrDDH.Columns.Remove("MaKH"); dgrDDH.Columns.Remove("MaNV"); dgrDDH.Columns.Add(dgrcolKH); dgrDDH.Columns.Add(dgrcolNV); dgrcolKH = new DataGridViewComboBoxColumn(); dgrcolKH.DataPropertyName = "MaKH“; dgrcolKH.DataSource = dsDatHang.Tables["KhachHang“]; dgrcolKH.DisplayMember = "TenKH“; dgrcolKH.ValueMember = "MaKH“; dgrcolKH.HeaderText = "Khách hàng“; dgrcolHH = new DataGridViewComboBoxColumn(); dgrcolHH.DataPropertyName = "MaHH“; dgrcolHH.DataSource = dsDatHang.Tables["HangHoa“]; dgrcolHH.DisplayMember = "MoTaHH“; dgrcolHH.ValueMember = "MaHH“; dgrcolHH.HeaderText = "Hàng hóa“; dgrcolNV = new DataGridViewComboBoxColumn(); dgrcolNV.DataPropertyName = "MaNV“; dgrcolNV.DataSource = dsDatHang.Tables["NhanVien“]; dgrcolNV.DisplayMember = "TenNV“; dgrcolNV.ValueMember = "MaNV“; dgrcolNV.HeaderText = "Nhân viên“; dgrCTDDH.Columns["SoDDH“].Visible = false; dgrCTDDH.Columns.Remove("MaHH"); dgrCTDDH.Columns.Insert(1, dgrcolHH); dgrCTDDH.Columns["SL“].HeaderText = "Số lượng“; } 130 V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG 3.- Xây dựng ứng dụng b/– Xây dựng giao diện (tt) private void tsbtnUpdate_Click(object sender, EventArgs e) try { adapDDH.Update(dsDatHang, "ddh"); adapCTDDH.Update(dsDatHang, "ctddh"); } catch (SqlException ex) { MessageBox.Show(ex.Message, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error) } } 131 NỘI DUNG (tt) 1. 2. 3. 4. 5. Mô hình triển khai ứng dụng ADO.NET Lưu trữ và xử lý dữ liệu Trình bày dữ liệu Xây dựng ứng dụng quản lý đặt và bán hàng 6. Crystal Report 7. Bảo mật trong ứng dụng 132 VI.- Crystal Report 1. Tạo báo biểu 2. Tùy biến báo biểu ß ß ß ß ß Tùy biến môi trường thiết kế Tùy biến các control Các loại control Sắp xếp Gom nhóm 3. Trình bày và in báo biểu ß ß ß Phân loại báo biểu Xem báo biểu trước khi in In báo biểu trực tiếp 4. Báo biểu có tham số 133 VI.-Crystal Report 1.– Tạo báo biểu 1. Phần này hướng dẫn từng bước cách tạo một báo biểu cho danh mục hàng hóa được trình bày theo từng loại hàng hóa 2. Tạo nguồn dữ liệu cho báo biểu: CREATE STORED PROCEDURE sp_rptDMHH AS BEGIN SELECT MaHH, TenHH, MoTa, DVT, DonGia, TenLoai FROM HangHoa hh, LoaiHH loai WHERE hh.MaLoai = loai.MaLoai END 134 VI.-Crystal Report 1.– Tạo báo biểu (tt) 3. Chọn Project / Add New Item, sau đó chọn Crystal Report. Đặt tên cho báo biểu là rptDMHH 135 VI.-Crystal Report 1.– Tạo báo biểu (tt) 4. Chọn Using the Report Expert, Standard 136 VI.-Crystal Report 1.– Tạo báo biểu (tt) 5. Chọn Create New Connection. Click dấu + bên trái OLEDB (ADO), hộp thoại ở slide sau xuất hiện. 137 VI.-Crystal Report 1.– Tạo báo biểu (tt) 6. Chọn như trong hình để tạo kết nối OLEDB đến CSDL SQL Server 7. Next 138 VI.-Crystal Report 1.– Tạo báo biểu (tt) 8. Điền tên của SQL Server, User ID, Password 9. Chọn CSDL qlbh 10. Next 11. Finish 139 VI.-Crystal Report 1.– Tạo báo biểu (tt) 12. Chọn kết nối vừa tạo và chọn tiếp sp_DMHH 13. Click “>” để ấn định nguồn dữ liệu 140 VI.-Crystal Report 1.– Tạo báo biểu (tt) 14. Click “>>” để chọn toàn bộ field sẽ được trình bàu trong báo biểu 15. Next 141 Crystal Report – Tạo báo biểu 16. Chọn TenLoai rồi click “>” để ấn định báo biểu sẽ được trình bày gom nhóm theo TenLoai 17. Next 142 VI.-Crystal Report 1.– Tạo báo biểu (tt) Click chọn, rồi click “<“ để không tính tổng theo ThoiGianBH Click chọn, rồi click vào ô Sum ở dưới, chọn lại là Count để dếm số lượng mặt hàng của một loại 143 VI.-Crystal Report 1.– Tạo báo biểu (tt) 18. Giữ nguyên phần mặc định 19. Next 144 VI.-Crystal Report 1.– Tạo báo biểu (tt) 20. Giữ nguyên phần mặc định 21. Next 145 VI.-Crystal Report 1.– Tạo báo biểu (tt) 22. Giữ nguyên phần mặc định 23. Next 146 VI.-Crystal Report 1.– Tạo báo biểu (tt) 24. Chọn kiểu trình bày báo biểu 25. Finish 147 VI.-Crystal Report 1.– Tạo báo biểu (tt) 26. Báo biểu vừa tạo ra sẽ mặc định ở chế độ Design cho phép chỉnh sửa 148 VI.-Crystal Report 1.– Tạo báo biểu (tt) 27. Click Main Report Preview để xem trước kết quả 149 Crystal Report 1. Tạo báo biểu 2. Tùy biến báo biểu ß ß ß ß ß Tùy biến môi trường thiết kế Tùy biến các control Các loại control Sắp xếp Gom nhóm 3. Trình bày và in báo biểu ß ß ß Phân loại báo biểu Xem báo biểu trước khi in In báo biểu trực tiếp 4. Báo biểu có tham số 150 VI.-Crystal Report 2.– Tuỳ biến báo biểu a/- Tùy biến môi trường thiết kế 1. Đây là môi trường chúng ta làm việc nhiều nhất trong quá trình tạo báo biểu, bao gồm điều chỉnh vị trí, thêm mới, xóa các control 2. Một số thiết lập ta cần quan tâm: ß ß Default Settings Page Setup 151 VI.-Crystal Report 2.– Tuỳ biến báo biểu a/- Tùy biến môi trường thiết kế (tt) 3. Default Settings: Click phải vào vùng xám trên Report, chọn Design Æ Default Settings 4. Nên chọn Show Grid và Snap to Grid để dễ điều chỉnh vị trí các control 152 VI.-Crystal Report 2.– Tuỳ biến báo biểu a/- Tùy biến môi trường thiết kế (tt) 5. Default Settings: Click phải vào vùng xám trên Report, chọn Design Æ Default Settings 6. Chọn dạng hiển thị cho các control tùy theo kiểu dữ liệu của field 153 VI.-Crystal Report 2.– Tuỳ biến báo biểu a/- Tùy biến môi trường thiết kế (tt) 154 VI.-Crystal Report 2.– Tuỳ biến báo biểu a/- Tùy biến môi trường thiết kế (tt) 7. Page Setup: Click phải vào vùng xám trên Report, chọn Design Æ Page Setup 8. Cỡ giấy tùy theo máy in (Printer Setup) 155 VI.-Crystal Report 2.– Tuỳ biến báo biểu b/- Tùy biến các control 1. Các control thông thường có thể thêm vào Report bằng cách chọn chúng trên ToolBox hoặc copy và paste control có sẵn 2. Click chọn nhiều control bằng cách giữ thêm phím Ctrl hoặc Shift 3. Có thể điều chỉnh kích thước cho 1 hoặc nhiều control cùng lúc 4. Gióng thẳng hàng dọc hoặc ngang các control thông qua menu Align 156 VI.-Crystal Report 2.– Tuỳ biến báo biểu b/- Tùy biến các control (tt) 5. Định dạng trình bày cho một hoặc nhiều control (chỉ có thể chọn các control tương thích) bằng cách click phải lên chúng và chọn Format Object 6. Tùy theo kiểu dữ liệu được ấn định cho control, Crystal Report sẽ hiển thị hộp thoại Format tương ứng. Hộp thoại này là một trong các hộp thoại tương ứng với các kiểu dữ liệu được trình bày trong slide 151 157 VI.-Crystal Report 2.– Tuỳ biến báo biểu c/- Các loại control 1. Text control: dùng hiển thị các văn bản thông thường (Label), các field trong CSDL hoặc các công thức tính toán, ... 2. Field control: thực chất là 1 Text control tương ứng với 1 field trong nguồn dữ liệu 3. Line, Box control: vẽ các đường thẳng hoặc HCN phân định các vùng dữ liệu trong report. Có thể thay đổi màu, độ rộng và kiểu đường kẻ. Box control có thể hiển thị dạng Ellipse hoặc Rounding 158 VI.-Crystal Report 2.– Tuỳ biến báo biểu c/- Các loại control (tt) 4. Picture: Click phải / Insert / Picture để thêm control này vào report 5. Chart: Click phải / Insert / Chart 6. OLE: Click phải / Insert / OLE Object. Nhúng các tài liệu Word, Excel, ... 7. Hyperlink: liên kết đến 1 trang web hay sub report 159 VI.-Crystal Report 2.– Tuỳ biến báo biểu c/- Các loại control (tt) 8. Insert / Special Field: ß DataDate: ngày cuối cùng cập nhật report ß DateTime: giờ cuối cùng cập nhật report ß FileAuthor: thông tin tác giả ß FileCreationDate: ngày tạo report ß Filename: tên file report ß GroupNumber: Nhóm số hiện tại ß ModificationDate: ngày chỉnh sửa cuối cùng ß ModificationTime: giờ chỉnh sửa cuối cùng 160 VI.-Crystal Report 2.– Tuỳ biến báo biểu c/- Các loại control (tt) 9. Insert / Special Field: ß PageNofM: In dạng “Page N of M” ß PageNumber: số trang hiện tại ß PrintDate: ngày in report ß PrintTime: giờ in report ß RecordNumber: số record hiện tại ß RecordSelection: cách chọn record được in ß ReportComments: ghi chú của report ß ReportTitle: tiêu đề của report ß TotalPageCount: tổng số trang 161 VI.-Crystal Report 2.– Tuỳ biến báo biểu c/- Các loại control (tt) Vùng ẩn (suppress), không được in ra. Click phải vào Section1, chọn Don’t Suppress để in phần này Special control Text control Field control 162 VI.-Crystal Report 2.– Tuỳ biến báo biểu c/- Các loại control (tt) 10. Điều chỉnh report: 1. Thêm Text control vào ReportHeader, thuộc tính Text=DANH MỤC HÀNG HÓA, đổ bóng, border nét đôi, màu chữ SeaGreen, canh giữa, kích thước bằng chiều rộng report 2. Di chuyển TenLoai trong PageHeader xuống GroupHeader và gõ nội dung “Loại hàng hóa”, di chuyển TenLoai trong Detail lên GroupHeader. Font chữ kích thước 14, đậm, nghiêng 3. Đổi nội dung tất cả Text control trong PageHeader thành tiếng việt có dấu, kích thước 12 và di chuyển xuống GroupHeader 163 VI.-Crystal Report 2.– Tuỳ biến báo biểu c/- Các loại control (tt) 1. Điều chỉnh report (tt): 4. Điều chỉnh hình chữ nhật bao trọn phần Detail và các đường thẳng dọc cùng các Text control trong Detail sao cho ngay ngắn với phần GroupHeader 5. Thêm Text control “Số lượng mặt hàng” vào GroupFooter có định dạng giống “Loại hàng hóa” trong GroupHeader. 6. Xóa control trong ReportFooter. 7. Rút gọn tối thiểu PageHeader và ReportFooter 8. Kết quả cuối cùng như sau 164 VI.-Crystal Report 2.– Tuỳ biến báo biểu c/- Các loại control (tt) 165 VI.-Crystal Report 2.– Tuỳ biến báo biểu c/- Các loại control (tt) 166 VI.-Crystal Report 2.– Tuỳ biến báo biểu d/- Sắp xếp 1. Ngoài việc chỉnh định sắp xếp dữ liệu từ trong CSDL, Crystal Report cũng cho phép sắp xếp thông qua chức năng Record Sort Expert 2. Click phải / Report / Record Sort Expert 3. Nguyên tắc sắp xếp theo thứ tự từ trên xuống, field trên cùng sắp trước, nếu trùng sẽ sắp đến field phía dưới 167 VI.-Crystal Report 2.– Tuỳ biến báo biểu d/- Sắp xếp Chọn field sắp xếp Hủy field sắp xếp Giảm dần, đã chọn lúc tạo report Điều chỉnh thứ tự sắp xếp Giảm dần Tăng dần 168 VI.-Crystal Report 2.– Tuỳ biến báo biểu e/- Gom nhóm 1. Ngoài việc gom nhóm ngay khi tạo report, ta có thể điều chỉnh gom nhóm trong lúc thiết kế report 2. Click phải / Report / Group Expert 169 VI.-Crystal Report 2.– Tuỳ biến báo biểu e/- Gom nhóm (tt) 1. 2. 3. 4. 5. 6. Bổ sung gom nhóm theo DVT như hình vẽ Di chuyển “Đơn vị tính” từ GroupHeader TenLoai xuống GroupHeader DVT Di chuyển “DVT” từ Detail lên GroupHeader DVT Điều chỉnh font chữ và các định dạng khác cho 2 control này theo ý thích Di chuyển các Text control từ GroupHeader TenLoai xuống GroupHeader DVT Điều chỉnh phần GroupHeader TenLoai và Detail 170 VI.-Crystal Report 2.– Tuỳ biến báo biểu e/- Gom nhóm (tt) 171 VI.-Crystal Report 2.– Tuỳ biến báo biểu e/- Gom nhóm (tt) 172 Crystal Report 1. Tạo báo biểu 2. Tùy biến báo biểu ß ß ß ß ß Tùy biến môi trường thiết kế Tùy biến các control Các loại control Sắp xếp Gom nhóm 3. Trình bày và in báo biểu ß ß ß Phân loại báo biểu Xem báo biểu trước khi in In báo biểu trực tiếp 4. Báo biểu có tham số 173 VI.-Crystal Report 3.– Trình bày và in báo biều a/- Phân loại báo biểu 1. Báo biểu định kiểu (Strongly-Typed) ß ß ß Khi 1 báo biểu được tạo ra, .NET tự động tạo 1 lớp báo biểu (Report Class) cho riêng báo biểu này trong project hiện hành Lớp này được sử dụng bình thường như các lớp .NET khác Được biên dịch và kết hợp trực tiếp vào file thực thi của ứng dụng 174 VI.-Crystal Report 3.– Trình bày và in báo biều a/- Phân loại báo biểu 2. Báo biểu phi định kiểu (Untyped) ß ß ß Mỗi báo biểu được tạo ra sẽ được lưu thêm trong 1 file .rpt riêng biệt, độc lập với project File .rpt có thể được chép sang và sử dụng trong 1 project khác thông qua tên file của nó Báo biểu được sử dụng bởi tên file thay vì tên lớp là báo biểu phi định kiểu 175 VI.-Crystal Report 3.– Trình bày và in báo biều b/- Xem báo biểu trước khi in 1. Bổ sung 1 form mới vào project và đặt tên là frmInDMHH 2. Trong ToolBox, phần CrystalReport, chọn đưa control CrystalReportViewer vào form, đặt tên là rptViewerDMHH 3. Trong sự kiện Load của form, gõ: ß rptViewerDMHH.ReportSource = new rptDMHH(); 176 VI.-Crystal Report 3.– Trình bày và in báo biều b/- Xem báo biểu trước khi in (tt) 1. Trong form frmHangHoa, bổ sung 1 button trên BindingNavigator và viết các lệnh sau cho sự kiện click của button này: ß ß frmInDMHH frm = new frmInDMHH(); frm.Show(); 177 VI.-Crystal Report 3.– Trình bày và in báo biều b/- Xem báo biểu trước khi in (tt) 1. Mỗi lần gọi hiển thị report, ứng dụng đều yêu cầu đăng nhập lại CSDL. Để tránh điều này, ta cần ấn định thông tin đăng nhập trước khi hiển thị report 2. Điều chỉnh thông tin đăng nhập CSDL ß ß ß rptDMHH rpt = new rptDMHH(); rpt.SetDatabaseLogon("sa", “…", "nghiatran-pc", "qlbh"); rptViewerDMHH.ReportSource = rpt; 178 VI.-Crystal Report 3.– Trình bày và in báo biều c/- In báo biểu trực tiếp 1. Bổ sung 1 button trên BindingNavigator và viết các lệnh sau cho sự kiện click của button này: ß ß ß rptDSSV rpt = new rptDSSV(); rpt.SetDatabaseLogon("sa", “...", "nghiatranpc", "qlbh"); rpt.PrintToPrinter(1, False, 0, 0); 179 VI.-Crystal Report 4. Báo biểu có tham số 1. 2. Trong form frmDatHang, chọn lệnh In để in đơn đặt hàng hiện hành Nguồn dữ liệu CREATE PROCEDURE sp_In_DDH @SoDDH nvarchar(10) AS BEGIN SELECT d.SoDDH, NgayDH, NgayGH, kh.MaKH, TenKH, kh.DiaChi, kh.DienThoai, kh.Fax, nv.TenNV, TenHH, SL, DonGia, 'ThanhTien'=SL*DonGia FROM DDH d, CTDDH ctd, KhachHang kh, NhanVien nv, HangHoa hh WHERE d.SoDDH = @SoDDH and d.SoDDH = ctd.SoDDH and d.MaKH = kh.MaKH and d.MaNV = nv.MaNV and ctd.MaHH = hh.MaHH END 180 VI.-Crystal Report 4. Báo biểu có tham số (tt) 3. Thiết kế report theo mẫu sau: 181 VI.-Crystal Report 4. Báo biểu có tham số (tt) 4. Tạo form frmInDonDatHang để xem trước báo biểu vừa tạo, gõ lệnh sau vào sự kiện Form_Load ß ß ß ß rptDonDatHang rpt = new rptDonDatHang(); rpt.SetDatabaseLogon("sa", “...", "nghiatran-pc", "qlbh"); rpt.SetParameterValue("@SoDDH", _SoDDH); rptViewerDDH.ReportSource = rpt; 182 VI.-Crystal Report 4. Báo biểu có tham số (tt) 5. Do báo biểu nhận dữ liệu từ stored procedure có tham số là SoDDH, ta cần chuyển giá trị SoDDH hiện hành trên DataGridView cho frmInDonDatHang để form này gán giá trị cho tham số: rpt.SetParameterValue("@SoDDH", _SoDDH) 6. Trong frmInDonDatHang, ta xây dựng thuộc tính sau: private String _SoDDH; public String SoDDH { get { return _SoDDH; } set { _SoDDH = value; } } 183 VI.-Crystal Report 4. Báo biểu có tham số (tt) 7. Trong form frmDatHang, bổ sung 1 button vào BindingNavigator và viết lệnh như sau cho sự kiện click: frmInDonDatHang frm = new frmInDonDatHang(); frm.SoDDH = dgrDDH.CurrentRow.Cells("SoDDH").Value; frm.Show(); 184 VI.-Crystal Report 4. Báo biểu có tham số (tt) 8. Báo biểu khi in ra có dạng như sau: 185 VI.-Crystal Report 4. Báo biểu có tham số (tt) 9. Trong form frmMain, chọn menu Đặt hàng / Báo biểu để in các đơn đặt hàng trong khoảng thời gian từ ngày X đến ngày Y gom nhóm theo ngày đặt hàng, đơn đặt hàng, thông tin chi tiết là các hóa đơn của đơn đặt hàng 10. Nguồn dữ liệu CREATE PROCEDURE sp_In_DDH @from as datetime, @to as datetime AS BEGIN SELECT 'NgayDDH'=cast(day(d.NgayDH) as char(2)) + '/' + cast(month(NgayDH) as char(2)) + '/' + cast(year(NgayDH) as char(4)), d.SoDDH, d.NgayGH, kh.TenKH, 'NVDDH'=nvddh.TenNV, 'TongTienDDH'=d.TongTien, hd.SoHD, hd.LanGiao, hd.NgayHD, 'NVHD'=nvhd.TenNV, 'TongTienHD'=hd.TongTien FROM DDH d, HoaDon hd, NhanVien nvddh, KhachHang kh, NhanVien nvhd WHERE d.SoDDH=hd.SoDDH and d.MaNV=nvddh.MaNV AND d.MaKH=kh.MaKH and hd.MaNV=nvhd.MaNV 186 AND (d.NgayDH between @from and @to) END VI.-Crystal Report 4. Báo biểu có tham số (tt) 11. Thiết kế report theo mẫu sau: 187 VI.-Crystal Report 4. Báo biểu có tham số (tt) 12. Tạo form frmInThongKeDDH để xem trước báo biểu vừa tạo, gõ lệnh sau vào sự kiện Form_Load ß ß ß ß ß rptThongKeDDH rpt = new rptThongKeDDH(); rpt.SetDatabaseLogon("sa", “...", "nghiatran-pc", "qlbh"); rpt.SetParameterValue("@from", _NgayBD); rpt.SetParameterValue("@to", _NgayKT); rptViewerDDH.ReportSource = rpt; 188 VI.-Crystal Report 4. Báo biểu có tham số (tt) 13. Do báo biểu nhận dữ liệu từ stored procedure có tham số là ngày bắt đầu và ngày kết thúc, ta cần chuyển 2 giá trị này cho frmInDonDatHang để form này gán giá trị cho tham số Trong frmInDonDatHang, ta xây dựng thuộc tính sau: private Date _NgayBD; public Date NgayBD { private Date _NgayKT; public Date NgayKT { get { get { return _NgayBD; return _NgayKT; } set { } set { _NgayBD = value; _NgayKT = value; } } } } 189 VI.-Crystal Report 4. Báo biểu có tham số (tt) 14. Trong form frmMain, viết lệnh như sau cho sự kiện click trên menu Đặt Hàng / Báo biểu: Date bd, kt; String sbd=“1/5/2001”, skt=“31/5/2001”; if (Date.TryParse(sbd, out bd) = false) MessageBox.Show("Ngày sai", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error); else if (Date.TryParse(skt, out kt) = false) MessageBox.Show("Ngày sai", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error); Else { frmInThongKeDDH frm = new frmInThongKeDDH(); frm.NgayBD = bd; frm.NgayKT = kt; frm.Show(); 190 } VI.-Crystal Report 4. Báo biểu có tham số (tt) 15. Báo biểu khi in ra có dạng như sau: 191 NỘI DUNG (tt) I. II. III. IV. V. Mô hình triển khai ứng dụng ADO.NET Lưu trữ và xử lý dữ liệu Trình bày dữ liệu Xây dựng ứng dụng quản lý đặt và bán hàng VI. Crystal Report VII. Bảo mật trong ứng dụng 192 VII.- BẢO MẬT TRONG ỨNG DỤNG 1. Cung cấp cho người dùng khả năng sử dụng các chức năng trong ứng dụng tùy theo quyền hạn đã được ấn định trong CSDL 2. Ứng dụng khi khởi chạy sẽ làm mờ tất cả chức năng 3. Sau khi đăng nhập với 1 user (login) hợp lệ, các chức năng sẽ được phép sử dụng 4. Các lệnh tạo kết nối và truy xuất dữ liệu trong mỗi form sẽ được đặt trong lệnh Try...Catch để xác định người dùng hiện hành có được sử dụng form này hay không 193 VII.- BẢO MẬT TRONG ỨNG DỤNG (tt) 5. Chuỗi kết nối CSDL và thông tin về Server, User, … sẽ được lưu trong Registry 6. Mỗi form hoặc báo biểu khi cần tạo kết nối sẽ lấy những thông tin cần thiết từ Registry 7. Các thông tin này có thể được mã hóa trước khi lưu vào Registry. Tuy nhiên, để giữ tính đơn giản và dễ nắm bắt cho môn học, công việc này sẽ được bỏ qua 194 VII.- BẢO MẬT TRONG ỨNG DỤNG (tt) 8. Xây dựng form đăng nhập như sau 9. Đặt UseSystemPassword cho TextBox password là True 10. Khai báo thư viện using System.Data.SqlClient; using Microsoft.Win32; 11. Khai báo biến thành viên private String connStr = "“; private String userRoot = "HKEY_CURRENT_USER“; private String subkey = "QLBanHang”; 195 private String keyName = userRoot + "\" + subkey; VII.- BẢO MẬT TRONG ỨNG DỤNG (tt) 12. Viết các lệnh sau trong sự kiện Form_Load String strServer = Registry.GetValue(keyName, "Server", "None"); String strUser = Registry.GetValue(keyName, "User", "None"); if (strServer==null && !strServer.Equals("None“)) { txtServer.Text = strServer; txtUser.Text = strUser; txtPassword.Focus(); else txtServer.Focus(); 196 VII.- BẢO MẬT TRONG ỨNG DỤNG (tt) 13. Viết các lệnh sau trong sự kiện Click của Kết nối if (txtServer.Text.Length == 0 || txtUser.Text.Length == 0) { MessageBox.Show("Thông tin về ServerName và UserName là bắt buộc", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Hand); return; } connStr = "Data Source=" + txtServer.Text + ";Initial Catalog=qlbh;user=" + txtUser.Text + ";pwd=" + txtPassword.Text; try { SqlConnection dbConn = new SqlConnection(connStr); dbConn.Open(); dbConn.Close(); Registry.SetValue(keyName, "ConnectionString", connStr); Registry.SetValue(keyName, "Server", txtServer.Text); Registry.SetValue(keyName, "User", txtUser.Text); Registry.SetValue(keyName, "Password", txtPassword.Text); Me.DialogResult = Windows.Forms.DialogResult.OK; Close(); } catch (ArgumentException err) { MessageBox.Show(err.Message, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Hand); } catch (SqlException sqlerr) { MessageBox.Show(sqlerr.Message, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Hand); } 197 VII.- BẢO MẬT TRONG ỨNG DỤNG (tt) 14. Phần lệnh cho button Hủy bỏ chỉ đơn giản là thiết lập giá trị trả về của form là Cancel và đóng form lại ß ß this.DialogResult = Windows.Forms.DialogResult.Cancel; Close(); 198 VII.- BẢO MẬT TRONG ỨNG DỤNG (tt) 15. Trong frmMain, xây dựng 2 hàm sau: private void MoChucNang() { DanhMụcToolStripMenuItem.Enabled = true; ĐặthàngToolStripMenuItem.Enabled = true; HóaĐơnToolStripMenuItem.Enabled = true; } private void DongChucNang() { DanhMụcToolStripMenuItem.Enabled = false; ĐặthàngToolStripMenuItem.Enabled = false; HóaĐơnToolStripMenuItem.Enabled = false; } 199 VII.- BẢO MẬT TRONG ỨNG DỤNG (tt) 16. Khởi chạy, ứng dụng sẽ làm mờ tất cả chức năng, do đó, trong sự kiện Form_Load của frmMain: ß DongChucNang(); 17. Sự kiện Click của menu Đăng xuất: ß DongChucNang(); 200 VII.- BẢO MẬT TRONG ỨNG DỤNG (tt) 18. Sự kiện Click của menu Đăng nhập: frmDangNhap frm = new frmDangNhap(); if (frm.ShowDialog() == Windows.Forms.DialogResult.OK) MoChucNang(); } 201 VII.- BẢO MẬT TRONG ỨNG DỤNG (tt) 19. Trong sự kiện Form_Load của tất cả các form đã xây dựng, điều chỉnh thông tin kết nối như sau: try { connStr = Registry.GetValue( "HKEY_CURRENT_USER\QLBanHang_VB", "ConnectionString", ""); dbConn = new SqlConnection(connStr); dbConn.Open(); ... ‘ Các lệnh khác như cũ 202
- Xem thêm -

Tài liệu liên quan