CHƯƠNG II: THIẾT KẾ ĐẦU ĐỌC THẺ RFID TẦN SỐ 125kHz
3.2. Xây dựng phần mềm trên máy tính PC quản lý CSDL bệnh nhân 51 1. Phân tích thiết kế
3.3.2. Xử lý các yêu cầu và viết chương trình
Hình 3.15: Khởi tạo Project Sau khi khởi tạo Project ta đƣợc kết quả nhƣ sau:
Hình 3.16: Mã giao diện cửa sổ chính
C# hỗ trợ một Toolbox khá đầy đủ để phục vụ cho việc tạo giao diện phần mềm
Công cụ tạo Nút bấm
(LUAN.van.THAC.si).nghien.cuu.thiet.ke.dau.doc.the.cong.nghe.RFID.tan.so.125.khz.va.ung.dung.trong.linh.vuc.y.duoc.luan.van.ths.ky.thuat.co.khi.va.co.ky.thuat.605201(LUAN.van.THAC.si).nghien.cuu.thiet.ke.dau.doc.the.cong.nghe.RFID.tan.so.125.khz.va.ung.dung.trong.linh.vuc.y.duoc.luan.van.ths.ky.thuat.co.khi.va.co.ky.thuat.605201
56
Sau khi sử dụng các công cụ trong Toolbox để thiết kế giao diện kết quả thu đƣợc nhƣ sau:
Cửa sổ Quản lý Vào/ra
Hình 3.18: Giao diện cửa sổ Quản lý Vào/ra Cửa sổ này gồm các thành phần:
1. Bảng hiển thị thông tin của người vào cửa gồm số lần qua cửa N, Họ tên, Mã thẻ, Giờ vào, Ngày vào
2. Nút xoá thông tin trong bảng 1 3. Nút xuất ra Excel
4. Vùng hiển thị thông tin ngắn gọn của người qua cửa (gồm cả ảnh) 5. Vùng hiển thị thông tin qua cửa
6. Vùng lựa chọn cổng COM.( Gồm VIRTUAL COM – Lựa chọn COM ảo; REAL COM – Kết nối đầu đọc qua cổng COM1 của máy tính)
Cửa sổ Quản lý Hồ sơ
Hình 3.19: Giao diện cửa sổ Quản lý Hồ sơ Bao gồm các thành phần:
1. Vùng hiển thị Thông tin cá nhân
2. Bảng hiện thị thông tin trong Cơ sở dữ liệu 3. Ảnh
4. Các nút công cụ
Bước tiếp theo là phải kết nối chương trình với Cơ sở dữ liệu thông qua các câu lệnh lập trình.
3.3.2.2. Các xử lý với cơ sở dữ liệu a. Tạo cơ sở dữ liệu lưu hồ sơ cá nhân
Nhƣđã nói ở trên Cơ sở dữ liệu mẫu đƣợc tạo bằng Microsoft Access 2003(định dạng Access 2000) với tên “Data.mdb”
(LUAN.van.THAC.si).nghien.cuu.thiet.ke.dau.doc.the.cong.nghe.RFID.tan.so.125.khz.va.ung.dung.trong.linh.vuc.y.duoc.luan.van.ths.ky.thuat.co.khi.va.co.ky.thuat.605201(LUAN.van.THAC.si).nghien.cuu.thiet.ke.dau.doc.the.cong.nghe.RFID.tan.so.125.khz.va.ung.dung.trong.linh.vuc.y.duoc.luan.van.ths.ky.thuat.co.khi.va.co.ky.thuat.605201
58
Hình 3.20: Các bảng Cơ sở dữ liệu
Một thành phần của Cơ sở dữ liệu nữa đó là ảnh của các hồ sơ Các ảnh này được lưu trong Thư mục Pictures
Cả thư mục Pictures này và file “Data.mdb” đều được lưu trong thư mục Debug của Project “HE THONG QUAN LY BENH NHAN”.
b. Liên kết tới cơ sở dữ liệu và hiển thị lên Form
Một trong những nguyên nhân làm cho C# là một ngôn ngữ lập trình mạnh, dễ sử dụng đó là nó nhóm các lớp lệnh có cùng quan hệ vào các không gian tên (namespace) riêng biệt giúp người sử dụng dễ dàng gọi các câu lệnh trong khi viết chương trình.( ví dụ: namespace System, namespace System.Data…)
Hình 3.21: Namespace trong C#
Đối với mỗi loại Cơ sở dữ liệu thì C# cung cấp cho chúng ta một không gian tên(namespace) riêng biệt để thao tác với chúng. Để kết nối đƣợc đến cơ sở dữ liệu dạng file Access thì cần sử dụng 2 namespace sau:
• using System.Data; //Namespace cho các đối tượng Data
• using System.Data.OleDb; // Đây là namespace mà ta sẽ sử dụng cho Access
Thêm vào đó, để kết nối đƣợc với Cơ sở dữ liệu chúng ta cần có thêm chuỗi kết nối(Connection String)
String Chuoi_ket_noi = "Provider = Microsoft.Jet.OLEDB.4.0 ;" + "Data Source =" + Application.StartupPath +
@"\Data.mdb;";
Ở đây, Provider = Microsoft.Jet.OLEDB.4.0
là phương thức kết nối cơ sở dữ liệu được tạo từ ứng dụng Microsoft Office.
Application.StartupPath – là đường dẫn tuyệt đối đến thư mục Debug.
Sau khi đã kết nối đƣợc cơ sở dữ liệu chúng ta có thể hiển thị chúng lên giao diện phần mềm với các lớp đối tƣợng làm việc với cơ sở dữ liệu nhƣ :DataSet, DataReader, DataAdapter…
Ảnh của hồ sơ sẽ đƣợc tìm theo tên ảnh có trong cơ sở dữ liệu và hiển thị lên picturebox qua câu lệnh:
string tenanh = Application.StartupPath + "\\Pictures\\" + txtImage.Text;
pictureBox4.Image = Image.FromFile(tenanh);
Kết quả tải dữ liệu lên Form minh hoạ bằng hình sau:
(LUAN.van.THAC.si).nghien.cuu.thiet.ke.dau.doc.the.cong.nghe.RFID.tan.so.125.khz.va.ung.dung.trong.linh.vuc.y.duoc.luan.van.ths.ky.thuat.co.khi.va.co.ky.thuat.605201(LUAN.van.THAC.si).nghien.cuu.thiet.ke.dau.doc.the.cong.nghe.RFID.tan.so.125.khz.va.ung.dung.trong.linh.vuc.y.duoc.luan.van.ths.ky.thuat.co.khi.va.co.ky.thuat.605201
60
c. Xử lý các yêu cầu thêm mới, xóa, sửa hồ sơ
Phần mềm hỗ trợ việc thao tác với cơ sở dữ liệu thông qua các nút tác vụ nhƣ hình minh hoạ( Hình 16)
C# cung cấp cho chúng ta một lớp các lệnh(Command) để tác động đến cơ sở dữ liệu thông qua đối tƣợng DataTable.
Hình 3.23: Các tác vụ quản lý Hồ sơ
Nút Xoá TextBox
Chức năng của nút này là xoá toàn bộ thông tin trên các TextBox. Câu lệnh sử dụng cho chức năng này rất đơn giản nhƣ sau:
private void Xoadulieu() {
txtSTT.Text = "";
txtName.Text = "";
txtMathe.Text = "";
txtBirthDate.Text = "";
txtRoom.Text = "";
txtPosition.Text = "";
txtPhone.Text = "";
txtAddress.Text = "";
txtEmail.Text = "";
txtImage.Text = "";
pictureBox4.Image = null;
}
Nút Thêm Hồ sơ mới
Để thực hiện chức năng này C# cung cấp cho chúng ta các câu lệnh(Command) để chèn dữ liệu vào bảng thông qua đối tƣợng DataTable.
DataTable là một bảng ảo đƣợc C# tạo ra để chứa cơ sở dữ liệu khi thao tác.
Hình 3.24: Liên hệ giữa dữ liệu gốc và chương trình Câu lệnh thực hiện nhƣ sau:
private void subInsertByAdapter() {
//Tạo kết nối tới file Access subCreateConnect();
//Nạp dữ liệu vào DataTable
objDataTable2 = new DataTable("Abc");
//Tạo đối tƣợng Adapter và Fill vào DataTable
OleDbDataAdapter objAdapter = new OleDbDataAdapter("Select
* from DanhsachNV", objConnect);
objAdapter.Fill(objDataTable2);
(LUAN.van.THAC.si).nghien.cuu.thiet.ke.dau.doc.the.cong.nghe.RFID.tan.so.125.khz.va.ung.dung.trong.linh.vuc.y.duoc.luan.van.ths.ky.thuat.co.khi.va.co.ky.thuat.605201(LUAN.van.THAC.si).nghien.cuu.thiet.ke.dau.doc.the.cong.nghe.RFID.tan.so.125.khz.va.ung.dung.trong.linh.vuc.y.duoc.luan.van.ths.ky.thuat.co.khi.va.co.ky.thuat.605201
62
objDataTable2.Rows.Add(objRow);
//Tạo đối tƣợng Command
OleDbCommand objCommand = new OleDbCommand();
objCommand.Connection = objConnect;
objCommand.CommandType = CommandType.Text;
objCommand.CommandText = "Insert into DanhsachNV values(@STT,@Name,@Mathe,@BirthDate,@Room,@Position,@Phone,@Ad dress,@Email,@Image)";
objCommand.Parameters.Add("@STT", OleDbType.Integer, 30,
"STT");
objCommand.Parameters.Add("@Name", OleDbType.VarChar, 100, "Name");
//Insert dữ liệu vào nguồn
objAdapter.InsertCommand = objCommand;
objAdapter.Update(objDataTable2);
}
Nút Update Hồ sơ
Cho phép người quản lý cập nhật thêm hoặc sửa thông tin cá nhân của hồ sơ bất kì.Tương tự như thêm mới hồ sơ, muốn sửa hồ sơ trước tiên ta sửa trên bảng DataTable, sau đó cập nhật sửa đổi đó vào cơ sở dữ liệu gốc thông qua việc viết command update.
Nút Xoá Hồ sơ
Nhiệm vụ là phải lọc đƣợc ra dữ liệu cần xoá trong DataTable và xoá nó, sau đó cập nhật vào cơ sở dữ liệu gốc.
private void Xoa_du_lieu() {
//Tạo kết nối
subCreateConnect();
//Tạo Adpater
OleDbDataAdapter objAdapter = new OleDbDataAdapter("select * from DanhsachNV", objConnect);
objDataTable2 = new DataTable();
objAdapter.Fill(objDataTable2);
//Xây dựng commandBuilder
new OleDbCommandBuilder(objAdapter);
//Delete Record cần delete trong datatable
DataRow[] objRow = objDataTable2.Select("STT=" + Convert.ToInt32(txtSTT.Text));
objRow[0].Delete();
//Delete dữ liệu nguồn
objAdapter.Update(objDataTable2);
}
Nút Thêm ảnh
Để thêm ảnh cho Hồ sơ. C# cung cấp hai hộp thoại OpenDialog và SaveDialog
Các bước lưu ảnh hồ sơđược thực hiện như sau:
Hình 3.25: Các bước lưu ảnh cho hồ sơ //a. Khởi tạo hàm Mở Dialog tìm ảnh
private void SearchImage() {
(LUAN.van.THAC.si).nghien.cuu.thiet.ke.dau.doc.the.cong.nghe.RFID.tan.so.125.khz.va.ung.dung.trong.linh.vuc.y.duoc.luan.van.ths.ky.thuat.co.khi.va.co.ky.thuat.605201(LUAN.van.THAC.si).nghien.cuu.thiet.ke.dau.doc.the.cong.nghe.RFID.tan.so.125.khz.va.ung.dung.trong.linh.vuc.y.duoc.luan.van.ths.ky.thuat.co.khi.va.co.ky.thuat.605201
64
openFileDialog1.ShowDialog();// Hiện cửa sổ if (openFileDialog1.FileName != "")
{
…// Thêm câu lệnh
System.IO.Directory.SetCurrentDirectory(System.Windows.Forms.Application.
StartupPath + "/Pictures");//Đường dẫn chứa file ảnh khi lưu.
} }
//b. Khởi tạo hàm Save ảnh private void SaveImage() {
saveFileDialog1.FileName = txtImage.Text;
if (saveFileDialog1.FileName != "") {
System.IO.FileStreamfs=
(System.IO.FileStream)saveFileDialog1.OpenFile();
switch (saveFileDialog1.FilterIndex) {
case 1:
this.pictureBox4.Image.Save(fs,
System.Drawing.Imaging.ImageFormat.Jpeg);
break;
case 2:
this.pictureBox4.Image.Save(fs,
System.Drawing.Imaging.ImageFormat.Bmp);
break;
case 3:
this.pictureBox4.Image.Save(fs,
System.Drawing.Imaging.ImageFormat.Gif);
break;
}
fs.Close();
} }
Tên ảnh đƣợc chọn sẽ đƣợc cập nhật vào ô “File” và hiển thị lên picturebox thông qua câu lệnh:
txtImage.Text = System.IO.Path.GetFileName(openFileDialog1.FileName);//
Hiển thị tên ảnh lên Textbox
pictureBox4.Image= Image.FromFile(openFileDialog1.FileName);//Hiện ảnh lên Picturebox.
Như vậy, sau khi đãđiền thông tin vào các ô và lưu ảnh thì để lưu hồ sơ ta chỉ cần chọn nút “Thêm Hồ sơ mới”.
d. Xử lý dữ liệu gửi lên máy tính từ đầu đọc
Đầu đọc thẻ sau khi đọc thông tin chứa trong thẻ sẽ gửi lên máy tính thông qua cổng COM. Thông tin này là mã thẻ đƣợc quét. Nó là một chuỗi 10 chữ số có dạng “2556296901”. Nhiệm vụ của phần mềm là phải xác minh thông tin mã thẻ này, so sánh với các mã thẻ trong cơ sở dữ liệu và hiển thị thông tin cá nhân của người có mã thẻ này. Đồng thời gửi lệnh mở cửa cho cơ cấu chấp hành. Để thực hiện đƣợc nhiệm vụ trên chúng ta phải thực hiện các công việc sau:
Tạo kết nối với cổng COM
C# cung cấp cho chúng ta lớp SerialPort để có thể tạo các kết nối và đặt các thông số kết nối tới cổng COM. Để sử dụng lớp này, cần khai báo hai namespace sau:
using System.IO;
(LUAN.van.THAC.si).nghien.cuu.thiet.ke.dau.doc.the.cong.nghe.RFID.tan.so.125.khz.va.ung.dung.trong.linh.vuc.y.duoc.luan.van.ths.ky.thuat.co.khi.va.co.ky.thuat.605201(LUAN.van.THAC.si).nghien.cuu.thiet.ke.dau.doc.the.cong.nghe.RFID.tan.so.125.khz.va.ung.dung.trong.linh.vuc.y.duoc.luan.van.ths.ky.thuat.co.khi.va.co.ky.thuat.605201
66
- Tốc độ: “9600”
- Phương thức truyền: “Parity.None”
- Số bit dữ liệu mỗi lần truyền: 8 - Số bit dừng: One
Các thông số trên có thể thay đổi tuỳ vào mục đích người sử dụng.
Ngoài ra chúng ta cũng có thể tạo kết nối nhờ Toolbox : Phần mềm có chức năng lựa chọn cổng COM với mục đích.
- Kết nối với cổng COM ảo để chạy thử nghiệm trên máy tính - Kết nối với cổng COM1 của máy tính để nhận dữ liệu từ đầu đọc
Hình 3.26: Chức năng lựa chọn cổng COM
Giao diện Form gửi dữ liệu qua cổng COM ảo đƣợc thiết kế nhƣ sau:
Hình 3.27: Giao diện mô phỏng truyền dữ liệu qua cổng COM ảo Sau khi tạo đƣợc kết nối vấn đề tiếp theo đó là xử lý sự kiện khi có dữ liệu truyền từ đầu đọc lên cổng COM.
Xử lý sự kiện có dữ liệu đến
Hình 3.28: Vùng hiển thị thông tin Mã thẻ gửi lên từ đầu đọc Dữ liệu từ đầu đọc đƣợc gửi lên sẽ đƣợc hiển thị trong Textbox “Mã thẻ”(có tên “docMathe”).
Việc hiển thị này nhờ vào câu lệnh khi có sự kiện thay đổi dữ liệu ở cổng COM nhƣ sau:
docMathe.Text = receive;
private void ComPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
receive = ComPort.ReadLine();
}
Sau đó, dữ liệu ở ô Mã thẻ sẽ đƣợc so sánh với dữ liệu trong Cơ sở dữ liệu và xử lý theo sơđồ sau:
(LUAN.van.THAC.si).nghien.cuu.thiet.ke.dau.doc.the.cong.nghe.RFID.tan.so.125.khz.va.ung.dung.trong.linh.vuc.y.duoc.luan.van.ths.ky.thuat.co.khi.va.co.ky.thuat.605201(LUAN.van.THAC.si).nghien.cuu.thiet.ke.dau.doc.the.cong.nghe.RFID.tan.so.125.khz.va.ung.dung.trong.linh.vuc.y.duoc.luan.van.ths.ky.thuat.co.khi.va.co.ky.thuat.605201
68
{
CurrentDateTime();
for (int i = 0; i < DGView2.Rows.Count; i++) {
if ((string)DGView2.Rows[i].Cells[2].Value == docMathe.Text) {
// Hien thi Ho so theo ma the nhan duoc try
{
Chứa các câu lệnh hiển thị Hồ sơ theo Mã thẻ nhận được Và lưu vào file cơ sở dữ liệu “Thongtinvaora.mdb”
}
catch { } } }
Thời gian vào cửa sẽ đƣợc lấy là thời gian của hệ thống máy tính quản lý qua hàmCurrentDateTime().
private void CurrentDateTime() {
DateTime Thoigian = DateTime.Now;
txtTime.Text = Thoigian.ToLongTimeString();
txtDate.Text = Thoigian.ToShortDateString();
}
Kết quả nhƣ sau:
Hình 3.30: Xử lý Mã thẻ gửi đến có trong Cơ sở dữ liệu
Trường hợp Mã thẻ gửi đến không giống Mã thẻ trong Cơ sở dữ liệu Khi đó phần mềm sẽ đƣa ra cảnh báo:
Hình 3.31: Cửa sổ cảnh báo lựa chọn xử lý mã thẻ mới Câu lệnh xử lý nhƣ sau:
DialogResult Choice = MessageBox.Show("Mã thẻ không có trong CSDL, Bạn có muốn thêm Hồ sơ cho Mã thẻ này không?", "Xu ly Ma the
(LUAN.van.THAC.si).nghien.cuu.thiet.ke.dau.doc.the.cong.nghe.RFID.tan.so.125.khz.va.ung.dung.trong.linh.vuc.y.duoc.luan.van.ths.ky.thuat.co.khi.va.co.ky.thuat.605201(LUAN.van.THAC.si).nghien.cuu.thiet.ke.dau.doc.the.cong.nghe.RFID.tan.so.125.khz.va.ung.dung.trong.linh.vuc.y.duoc.luan.van.ths.ky.thuat.co.khi.va.co.ky.thuat.605201
70
Cửa sổ Quản lý Hồ sơ sẽ xuất hiện và mã thẻ mới này đƣợc copy sang ô Mã thẻ nhờ câu lệnh: txtMathe.Text = docMathe.Text, cho phép người quản lý nhập thông tin cho mã thẻ mới này.
e. Các câu lệnh xử lý cho các tác vụ khác
Ngoài các chức năng đã nêu trên, phần mềm còn có một số tác vụ khác nhƣ: in form, xuất thông tin vào/ra ra file Excel.
In form giao diện
C# hỗ trợ các Toolbox giúp cho việc in ấn dễ dàng là printDialog và printDoc
Chức năng in form này cho phép người quản lý in ra thông tin cá nhân của người được lựa chọn trong cơ sở dữ liệu.
Xuất dữ liệu ra Excel
Với mục đích tính toán thời gian làm việc cho từng người trong ngày hoặc trong tháng. Phần mềm có thêm chức năng xuất dữ liệu vào/ra đã lưu trong file
“Thongtinvaora.mdb” ra file excel.
Các bước thực hiện việc này như sau:
Bước 1: Thêm các lớp hỗ trợ liên kết với Exel bằng cách Add reference
“Microsoft Office 11.0 Object Library” vào chương trình. (Đối với Office 2003) Bước 2: Tạo ứng dụng với Excel
Excel.ApplicationClassExcelApp= new Excel.ApplicationClass();
Bước 3: Tạo một file Excel mới // Tạo một WorkBook mới
ExcelApp.Application.Workbooks.Add(Type.Missing);
Bước 4: Sao chép nội dung của bảng chứa thông tin vào ra sang file Excel nhờ các lệnh:
for (int i = 0; i < DGView1.Rows.Count; i++) {
DataGridViewRow row = DGView1.Rows[i];
for (int j = 0; j < row.Cells.Count; j++)
{
ExcelApp.Cells[i + 1, j + 1] = row.Cells[j];
} }
Bước 5: Lưu wookbook
ExcelApp.ActiveWorkbook.SaveCopyAs("Thongtinvaora.xls");
ExcelApp.ActiveWorkbook.Saved = true;
Bước 6: Giải phóng ứng dụng ExcelApp.Quit();
Kết quả file Thongtinbenhnhan.xls đƣợc xuất ra thƣ mục My Documents
Hình 3.32: Kết quả xuất ra Excel
(LUAN.van.THAC.si).nghien.cuu.thiet.ke.dau.doc.the.cong.nghe.RFID.tan.so.125.khz.va.ung.dung.trong.linh.vuc.y.duoc.luan.van.ths.ky.thuat.co.khi.va.co.ky.thuat.605201(LUAN.van.THAC.si).nghien.cuu.thiet.ke.dau.doc.the.cong.nghe.RFID.tan.so.125.khz.va.ung.dung.trong.linh.vuc.y.duoc.luan.van.ths.ky.thuat.co.khi.va.co.ky.thuat.605201
72