Tạo form đăng nhập với SQL Server trong C# Winforms
Trong bài viết này mình sẽ hướng dẫn các bạn tạo Form đăng nhập với CSDL SQL Server trong C# Winforms. Đây là một bước rất quan trọng trong các ứng dụng, vì sự bảo mật và an toàn của ứng dụng.
Để hiểu được bài này các bạn cần nắm vững kiến thức trong Winforms và SQL Server, còn bây giờ hãy cùng mình thực hành thôi nào.
1. Tạo form đăng nhập trong C# Winforms
Việc đầu tiên chúng ta sẽ tạo giao diện form đăng nhập với các control như hình dưới đây.
Hai TextBox "Tài khoản" và "Mật khẩu" được dùng để người dùng nhập vào tài khoản và mật khẩu của họ.
Bài viết này được đăng tại [free tuts .net]
RadioButton "Hiển thị mật khẩu" được dùng để hiển thị mật khẩu nếu người dùng chọn.
Button "Đăng nhập" sẽ kiểm tra xem thông tin được nhập bởi người dùng có trùng khớp với dữ liệu trong database hay không. Nếu có thì cho đăng nhập vào đồng thời cho biết đăng nhập với quyền admin hay user.
Button "Thoát", khi người dùng chọn button này thì hộp thoại thông báo hiện ra và hỏi người dùng có muốn thoát hay không. Nếu chọn OK thì thoát khỏi chương trình, nếu chọn Cancel thì hủy bỏ lệnh thoát.
2. Tạo database và kết nối từ C# Winforms
Sau khi tạo được giao diện form đăng nhập, bây giờ ta thực hiện tạo database với các dữ liệu cần thiết để kết nối từ C# winforms. Các bạn có thể xem cách tạo database trong SQL, ở đây mình có một đoạn code tạo database sẵn.
Create database [QLNhanVien] GO USE [QLNhanVien] GO /****** Object: Table [dbo].[NhanVien] Script Date: 8/13/2021 5:44:21 PM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[NhanVien]( [MaNV] [int] IDENTITY(1,1) NOT NULL, [TaiKhoan] [nvarchar](50) NOT NULL, [MatKhau] [nvarchar](50) NOT NULL, [IDPer] [int] NOT NULL, CONSTRAINT [PK_NhanVien] PRIMARY KEY CLUSTERED ( [MaNV] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO
Sau khi tạo database QLNhanVien các bạn hãy thêm một vài dữ liệu, có thể nhập bằng giao diện hoặc lệnh T-SQL nhé.
Như vậy là chúng ta đã có database, bây giờ sẽ kết nối tới database trong SQL Server từ C# winforms. Ở đây mình sử dụng file App.config để kết nối tới SQL Server, đây là một cách thông dụng và an toàn.
App.config
<?xml version="1.0" encoding="utf-8" ?> <configuration> <connectionStrings> <add name="connStr" connectionString="Server=DESKTOP-PQMLT59\VANQUYEN;Database=QLNhanVien;Integrated Security=True" /> </connectionStrings> </configuration>
Code kết nối tới SQL Server
SqlConnection conn = new SqlConnection(); conn.ConnectionString = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
Bây giờ chỉ cần các bạn sử dụng phương thức Open() để mở chuỗi kết nối tới SQL Server và thao tác với database.
3. Xử lý các sự kiện trên form đăng nhập
Khi giao diện form đăng nhập và database đã được chuẩn bị cũng như kết nối tới SQL Server thành công. Bây giờ ta bắt đầu xử lý sự kiện cho từng control trong giao diện vừa tạo.
Xử lý sự kiện cho TextBox "Mật khẩu".
Vì tính bảo mật thì thông thường mật khẩu khi được nhập bởi người dùng sẽ bị ẩn đi. Để làm được điều này các bạn có thể tùy chỉnh nó bằng giao diện trong phần Properties của TextBox "Mật khẩu".
Hoặc có thể tùy chỉnh bằng câu lệnh.
txtPass.PasswordChar = '*';
Xử lý sự kiện cho RadioButton "Hiển thị mật khẩu".
Để đảm bảo rằng người dùng nhập mật khẩu đúng, chúng ta sẽ tạo một Radio Button "Hiển thị mật khẩu". Cho phép người dùng khi chọn vào sẽ hiển thị mật khẩu và sẽ ẩn đi nếu không chọn vào mục này.
private void chkShow_CheckedChanged(object sender, EventArgs e) { if (chkShow.Checked) { txtPass.PasswordChar = (char)0; } else { txtPass.PasswordChar = '*'; } }
Xử lý sự kiện cho Button "Đăng nhập".
Trước khi xử lý sự kiện cho button này, các bạn nên biết rằng để đăng nhập thành công thì thông tin người dùng nhập vào phải trùng với dữ liệu trong database.
Vì vậy ta sẽ tạo một Stored Procedure để kiểm tra đăng nhập. Nếu tài khoản đăng nhập là admin thì trả về 1 ngược lại nếu là user thì trả về 0. Trường hợp tài khoản đăng nhập sai hoặc không tồn tại thì trả về 2 và 3.
Stored Procedure
create proc [dbo].[SP_AuthoLogin] @Username nvarchar(20), @Password nvarchar(20) as begin if exists (select * from NhanVien where TaiKhoan = @Username and MatKhau = @Password and IDPer = 1) select 1 as code else if exists (select * from NhanVien where TaiKhoan = @Username and MatKhau = @Password and IDPer = 0) select 0 as code else if exists(select * from NhanVien where TaiKhoan = @Username and MatKhau != @Password) select 2 as code else select 3 as code end
Mình sẽ sử dụng phương thức ExecuteScalar trong class SqlCommand để lấy kết quả trả về từ SQL Server.
object kq = cmd.ExecuteScalar();
Các bạn có thể xem cách sử dụng Stored Procedure để thao tác với SQL Server trong C# tại đây.
Ở đây mình có hai param đó là "@Username" và "@Password" tương ứng với thông tin mà người dùng nhập vào. Mình sẽ truyền hai tham số này vào Proc "SP_AuthoLogin", sau đó dùng phương thức ExecuteScalar để lấy kết quả trả về.
SqlCommand cmd = new SqlCommand(); cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "SP_AuthoLogin"; cmd.Parameters.AddWithValue("@UserName", txtUser.Text); cmd.Parameters.AddWithValue("@Password", txtPass.Text); cmd.Connection = conn;
Bây giờ chỉ cần so sánh kết quả trả về, nếu bằng 1 (admin) hoặc 0 (user) thì đăng nhập thành công. Ngược lại bằng 2 hoặc 3 thì đăng nhập không thành công.
if (code == 0) { MessageBox.Show("Chào mừng User đăng nhập", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); } else if (code == 1) { MessageBox.Show("Chào mừng Admin đăng nhập", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); } else if (code == 2) { MessageBox.Show("Tài khoản hoặc mật khẩu không đúng !!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); txtPass.Text = ""; txtUser.Text = ""; txtUser.Focus(); } else { MessageBox.Show("Tài khoản không tồn tại !!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); txtPass.Text = ""; txtUser.Text = ""; txtUser.Focus(); }
Xử lý sự kiện cho Button "Thoát".
Ta sử dụng DialogResult và MessageBox để hiển thị một hộp thoại thông báo cho người dùng có muốn thoát khỏi chương trình khi hay không. Nếu người dùng chọn Yes thì gọi lệnh Application.Exit()
để thoát chương trình, ngược lại thì hủy bỏ lệnh.
private void btnCancel_Click(object sender, EventArgs e) { DialogResult dg = MessageBox.Show("Bạn có muốn thoát ?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if(dg == DialogResult.Yes) Application.Exit(); }
4. Code hoàn chỉnh tạo form đăng nhập với SQL Server trong C# Winforms
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Data.SqlClient; using System.Configuration; namespace MyProject { public partial class Login : Form { public static string UserName = ""; public Login() { InitializeComponent(); } private void btnCancel_Click(object sender, EventArgs e) { DialogResult dg = MessageBox.Show("Bạn có muốn thoát ?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if(dg == DialogResult.Yes) Application.Exit(); } private void chkShow_CheckedChanged(object sender, EventArgs e) { if (chkShow.Checked) { txtPass.PasswordChar = (char)0; } else { txtPass.PasswordChar = '*'; } } private void btnLogin_Click(object sender, EventArgs e) { SqlConnection conn = new SqlConnection(); try { conn.ConnectionString = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString; conn.Open(); SqlCommand cmd = new SqlCommand(); cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "SP_AuthoLogin"; cmd.Parameters.AddWithValue("@UserName", txtUser.Text); cmd.Parameters.AddWithValue("@Password", txtPass.Text); cmd.Connection = conn; UserName = txtUser.Text; object kq = cmd.ExecuteScalar(); int code = Convert.ToInt32(kq); if (code == 0) { MessageBox.Show("Chào mừng User đăng nhập", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); } else if (code == 1) { MessageBox.Show("Chào mừng Admin đăng nhập","Thông báo",MessageBoxButtons.OK,MessageBoxIcon.Information); } else if(code == 2) { MessageBox.Show("Tài khoản hoặc mật khẩu không đúng !!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); txtPass.Text = ""; txtUser.Text = ""; txtUser.Focus(); } else { MessageBox.Show("Tài khoản không tồn tại !!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); txtPass.Text = ""; txtUser.Text = ""; txtUser.Focus(); } conn.Close(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void txtUser_MouseClick(object sender, MouseEventArgs e) { txtUser.SelectAll(); } private void txtPass_MouseClick(object sender, MouseEventArgs e) { txtPass.SelectAll(); } private void Login_Load(object sender, EventArgs e) { } } }
Kết quả: Khi tài khoản đăng nhập là admin hoặc user sẽ thông báo. Trong thực tế sẽ phân quyền cụ thể hơn ví dụ admin có thể thêm sửa xóa, user chỉ có thể hiển thị.
Như vậy là chúng ta đã tạo xong form đăng nhập với SQL Server trong C# Winforms. Đây là các bài tập rất thực tế trong các ứng dụng, vậy nên hãy luyện tập thật nhiều để thành thạo nhé. Ngoài cách mình hướng dẫn trên còn một số cách khác, các bạn hãy thử làm nhé. Chúc các bạn thành công !!!