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