Using ADO.NET
I.Introduction :
-Kiến trúc 3 tầng chắc hẳn rất quen thuộc với Developer bao gồm
Presentation Layer:tầng Giao diện
Business Layer : Tầng nghiệp vụ, xử lý các tao tác thêm xóa sửa, xem.
Data Privider : Tầng Dữ liệu, thực thi các thao tác, trả về kết quả.
– Các tầng bổ sung cho nhau giúp ứng dụng có thể phát triển một cách nhanh chóng, tiết kiệm chi phí thời gian, và sử dụng lại được nhiều lần.
-Về mặt quan niệm:
- Tầng giao diện giữ nhiệm vụ tương tác với người dùng thông qua giao diện đồ họa.
- Tầng Nghiệp vụ: nhận thông điệp từ giao diện gửi về, và xử lý các thông điệp đó, gửi đến tầng dữ liệu để thực thi.
- Tầng dữ liệu : thực thi các lệnh xử lý mà tầng nghiệp vụ gửi về, từ đó trả về kết quả cho tầng nghiêp vụ –> giao diện sẽ trình diễn kết quả này.
II.Coding :
-Ở phần Code này chúng ta sẽ xây dựng một ứng dụng đơn giản để môt phỏng cách làm việc của kiến trúc 3 lớp. trước tiên chúng ta cần có một Cơ Sở dữ liệu , ở đây mình dùng Cơ Sở Dữ Liệu SQL Server tên Student, với một bảng là SinhVien :
Data Provider:
Bây giờ chúng ta bắt đầu xây dựng tầng dữ liệu, các bạn Mở Visual Studio (2005->2010) lên và tạo mới ClassLibrary Project, đặt tên là DataProvider :
-Trong Project này chúng ta tạo một lớp đặt tên là Data_Table làm nhiệm vụ xử lý các thao tác cho thực thể dữ liệu (xử lý bảng):
1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Text;
5: using System.Data;
6: using System.Data.SqlClient;
7: namespace DataProvider
8: {
9: public class Data_Table
10: {
11: private string[] _ParameterCollection;
12: public string[] ParameterCollection
13: {
14: get { return _ParameterCollection; }
15: set { _ParameterCollection = value; }
16: }
17: private object[] _ValuesCollection;
18: public object[] ValuesCollection
19: {
20: get { return _ValuesCollection; }
21: set { _ValuesCollection = value; }
22: }
23: private string _CommandText;
24: public string CommandText
25: {
26: get { return _CommandText; }
27: set { _CommandText = value; }
28: }
29: private CommandType _Commandtype;
30: public CommandType Commandtype
31: {
32: get { return _Commandtype; }
33: set { _Commandtype = value; }
34: }
35: private int _ErrorCode;
36: public int ErrorCode
37: {
38: get { return _ErrorCode; }
39: set { _ErrorCode = value; }
40: }
41: private string _ErrorMessage;
42: public string ErrorMessage
43: {
44: get { return _ErrorMessage; }
45: set { _ErrorMessage = value; }
46: }
47: private string _ConnectionString;
48: public string ConnectionString
49: {
50: get { return _ConnectionString; }
51: set { _ConnectionString = value; }
52: }
53: private SqlDataAdapter Adapter;
54: private SqlConnection Connection;
55: private SqlCommand sqlCommand;
56: public DataTable GetDataTable()
57: {
58: DataTable dt = new DataTable();
59: try
60: {
61: ExecuteNonQuery();
62: OpenConnection();
63: Adapter = new SqlDataAdapter(sqlCommand);
64: Adapter.Fill(dt);
65: CloseConnection();
66: }
67: catch (Exception ex)
68: {
69: ErrorMessage = ex.Message;
70: }
71: return dt;
72: }
73: public int ExecuteNonQuery()
74: {
75: int row = 0;
76: try
77: {
78: OpenConnection();
79: sqlCommand = new SqlCommand();
80: sqlCommand.Connection = Connection;
81: sqlCommand.CommandText = _CommandText;
82: sqlCommand.CommandType = _Commandtype;
83: if (ParameterCollection != null)
84: AddWithValues(sqlCommand);
85: row = sqlCommand.ExecuteNonQuery();
86: }
87: catch (Exception ex)
88: {
89: ErrorMessage = ex.Message;
90: }
91: finally
92: {
93: sqlCommand.Dispose();
94: }
95: return row;
96: }
97:
98: private void AddWithValues(SqlCommand _sqlCommand)
99: {
100: for (int i = 0; i < ParameterCollection.Length; i++)
101: _sqlCommand.Parameters.AddWithValue(_ParameterCollection[i], _ValuesCollection[i]);
102: }
103: private void OpenConnection()
104: {
105: Connection = new SqlConnection();
106: try
107: {
108: if (Connection.State == ConnectionState.Closed)
109: {
110: Connection.ConnectionString = _ConnectionString;
111: Connection.Open();
112: }
113: }
114: catch (SqlException ex)
115: {
116: ErrorMessage = ex.Message;
117: ErrorCode = ex.ErrorCode;
118: }
119: catch (Exception ex)
120: {
121: ErrorMessage = ex.Message;
122: }
123: }
124: private void CloseConnection()
125: {
126: try
127: {
128: if (Connection.State == ConnectionState.Open)
129: {
130: Connection.Close();
131: }
132: }
133: catch (SqlException ex)
134: {
135: ErrorMessage = ex.Message;
136: ErrorCode = ex.ErrorCode;
137: }
138: catch (Exception ex)
139: {
140: ErrorMessage = ex.Message;
141: }
142: }
143: }
144: }
-Khi chúng ta Built chương trình sẽ sinh ra một file : “Ten_namespace.dll”, và trong trường hợp này là DataProvider.dll
-Tượng tự vậy với Lớp BusinessLayer, chúng ta cũng tạo Project ClassLibrary, sau đó Add thư viên DataProvider vào :
BusinessLayer:
-Ở lớp BusinessLayer sẽ xử lý các thao tác trên đối tượng(thêm, sửa, xóa…..), và tham chiếu về Database.
-Chúng ta tạo một lớp Student và xử lý các thao tác cho Sinh Viên :
1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Text;
5: using System.Data;
6: using DataProvider;
7: namespace BusinessLayer
8: {
9: public class Student:Data_Table
10: {
11: private string _MSSV;
12: public string MSSV
13: {
14: get { return _MSSV; }
15: set { _MSSV = value; }
16: }
17: private DateTime _NgaySinh;
18: public DateTime NgaySinh
19: {
20: get { return _NgaySinh; }
21: set { _NgaySinh = value; }
22: }
23: private string _DienThoai;
24: public string DienThoai
25: {
26: get { return _DienThoai; }
27: set { _DienThoai = value; }
28: }
29: private string _HoTen;
30: public string HoTen
31: {
32: get { return _HoTen; }
33: set { _HoTen = value; }
34: }
35: public DataTable GetData()
36: {
37: CommandText = "Select * from SinhVien";
38: Commandtype = CommandType.Text;
39: return GetDataTable();
40: }
41: public int Insert()
42: {
43: CommandText = "Insert Into SinhVien(MSSV,HoTen,NgaySinh,DienThoai) values (@MSSV,@Hoten,@NgaySinh,@DienThoai)";
44: Commandtype = CommandType.Text;
45: ParaValues();
46: return ExecuteNonQuery();
47: }
48: public int Update()
49: {
50: CommandText = "Update SinhVien Set HoTen = @HoTen, NgaySinh = @NgaySinh, DienThoai = @DienThoai where MSSV = @MSSV";
51: Commandtype = CommandType.Text;
52: ParaValues();
53: return ExecuteNonQuery();
54: }
55: public int Delete()
56: {
57: CommandText = "Delete from SinhVien where MSSV = @MSSV";
58: Commandtype = CommandType.Text;
59: ParameterCollection = new string[1] { "@MSSV"};
60: ValuesCollection = new object[1] { _MSSV };
61: return ExecuteNonQuery();
62: }
63: private void ParaValues()
64: {
65: ParameterCollection = new string[4] { "@MSSV", "@Hoten", "@NgaySinh", "@DienThoai" };
66: ValuesCollection = new object[4] { _MSSV, _HoTen, _NgaySinh, _DienThoai };
67: }
68: }
69: }
Lưu Ý:
– ở BusinessLayer, chúng ta phải khai báo using DataProvider.
– Đồng thời cho Student kế thừa từ Data_Table, xin giải thích một chút ở chổ kế thừa này, theo tư duy hướng đối tượng thì một Student trong Database chính là Một Data_Table do đó chúng ta có thể kế thừa các thuộc tính của nó. Tùy theo một số người, có người thì không kế thừa nhưng tạo đối tượng trực tiếp từ Data_Table. Về mặt sử dụng thì các cách sử dụng có lẽ hơi khác nhau, nhưng kết quả thì hoàn toàn giống nhau, và về Quan Niệm thì vẫn như nhau.
Presentation Layer:
-Khi thực thi và tạo ra được những thư viện DLL (DataProvider, BusinessLayer) chúng ta chỉ việc Add vào Project giao diện, và gọi nó sử dụng.
-Ở đây mình Demo bằng môt giao diện đơn giản với tính năng thêm sửa xóa và load dữ liệu:
Cụ thể cách sử dụng Thư viện mà chúng ta vừa tạo ra, có lẽ các bạn sẽ hiểu rõ hơn ở đoạn code giao diện sau :
1: using System;
2: using System.Collections.Generic;
3: using System.ComponentModel;
4: using System.Data;
5: using System.Drawing;
6: using System.Linq;
7: using System.Text;
8: using System.Windows.Forms;
9: using DataProvider;
10: using BusinessLayer;
11:
12: namespace WindowsForm
13: {
14: public partial class Form1 : Form
15: {
16: Student clss_Student;
17: public Form1()
18: {
19: clss_Student = new Student();
20: InitializeComponent();
21: this.Load += new EventHandler(Form1_Load);
22: this.gv_SV.SelectionChanged += new EventHandler(gv_SV_SelectionChanged);
23: this.gv_SV.Resize += new EventHandler(gv_SV_Resize);
24: }
25:
26: void gv_SV_Resize(object sender, EventArgs e)
27: {
28: SetGridView();
29: }
30:
31: void gv_SV_SelectionChanged(object sender, EventArgs e)
32: {
33: try
34: {
35: txt_MS.Text = gv_SV.CurrentRow.Cells[0].Value.ToString();
36: txt_HoTen.Text = gv_SV.CurrentRow.Cells[1].Value.ToString();
37: txt_dienthoai.Text = gv_SV.CurrentRow.Cells[3].Value.ToString();
38: date_NgaySinh.Value = DateTime.Parse(gv_SV.CurrentRow.Cells[2].Value.ToString());
39: }
40: catch (Exception)
41: {
42:
43: ;
44: }
45: }
46:
47: void Form1_Load(object sender, EventArgs e)
48: {
49: LoadData();
50: }
51:
52: private void LoadData()
53: {
54: try
55: {
56: clss_Student.ConnectionString = Program.ConnectionString;
57: BindingSource bs = new BindingSource();
58: bs.DataSource = clss_Student.GetData();
59: bn_SV.BindingSource = bs;
60: gv_SV.DataSource = bn_SV.BindingSource;
61: SetGridView();
62: }
63: catch (Exception)
64: {
65:
66: ;
67: }
68: }
69:
70: private void SetGridView()
71: {
72: gv_SV.Columns[0].HeaderText = "Mã Số Sinh Viên";
73: gv_SV.Columns[0].Width = gv_SV.Width / 4;
74: gv_SV.Columns[1].HeaderText = "Họ Tên";
75: gv_SV.Columns[1].Width = gv_SV.Width / 4;
76: gv_SV.Columns[2].HeaderText = "Điện Thoại";
77: gv_SV.Columns[2].Width = gv_SV.Width / 4;
78: gv_SV.Columns[3].HeaderText = "Sinh Nhật";
79: gv_SV.Columns[3].Width = gv_SV.Width / 4;
80: }
81:
82: private void btn_Them_Click(object sender, EventArgs e)
83: {
84: clss_Student.ConnectionString = Program.ConnectionString;
85: clss_Student.MSSV = txt_MS.Text;
86: clss_Student.HoTen = txt_HoTen.Text;
87: clss_Student.NgaySinh = date_NgaySinh.Value;
88: clss_Student.DienThoai = txt_dienthoai.Text;
89: if (clss_Student.Insert() != 0)
90: {
91: MessageBox.Show("Thêm Thành Công");
92: LoadData();
93: }
94: else MessageBox.Show("Thêm Không Thành Công, Có Thể Dữ Liệu Đã Tồn Tại");
95: }
96:
97: private void btn_Sua_Click(object sender, EventArgs e)
98: {
99: clss_Student.ConnectionString = Program.ConnectionString;
100: clss_Student.MSSV = txt_MS.Text;
101: clss_Student.HoTen = txt_HoTen.Text;
102: clss_Student.NgaySinh = date_NgaySinh.Value;
103: clss_Student.DienThoai = txt_dienthoai.Text;
104: if (clss_Student.Update() != 0)
105: {
106: MessageBox.Show("Sửa Thành Công");
107: LoadData();
108: }
109: }
110:
111: private void btn_Xoa_Click(object sender, EventArgs e)
112: {
113: if ((MessageBox.Show("Bạn Có Chắc Chắn Là Muốn Xóa", "Thông Báo", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning)) == DialogResult.OK)
114: {
115: clss_Student.ConnectionString = Program.ConnectionString;
116: clss_Student.MSSV = txt_MS.Text;
117: if (clss_Student.Delete() != 0)
118: {
119: MessageBox.Show("Xóa Thành Công");
120: LoadData();
121: }
122: }
123: }
124:
125: private void btn_Thoat_Click(object sender, EventArgs e)
126: {
127: this.Dispose();
128: }
129: }
130: }