
Thêm, đọc, sửa, xóa (CRUD) cơ sở dữ liệu SQL Server trong C#
Thêm, đọc, sửa, xóa (Create-Read-Update-Delete) CRUD là thao tác cơ bản nhất trong lập trình với cơ sở dữ liệu (CSDL). Có nhiều cách để bạn có thể thực hiện các thao tác này trong ngôn ngữ C# với CSDL SQL Server. Trong bài viết này mình sẽ chia sẻ với bạn một trong những cách tốt nhất để bạn có thể làm việc này một cách dễ dàng hơn.
Tạo CSDL SQL Server cơ bản
Trong bài này mình không hướng dẫn chi tiết việc tạo CSDL SQL Server. Bạn có thể tự tạo CSDL riêng của mình. Ở đây mình sử dụng một database test chỉ có 1 bảng duy nhất với 2 trường là id và ten thôi.

Tạo CSDL cơ bản
- Ở CSDL trên mình thiết đặt cho trường id có thuộc tính Identity là 1. Tức là nó sẽ tự tăng khi được Insert dữ liệu. Vì thế trường này mình sẽ không đưa trường này vào lệnh thêm dữ liệu.
Tạo Project C# và lớp kết nối database
Mình sẽ viết trên winform sử dụng ngôn ngữ C#. Sau khi tạo xong Project, bạn tạo một class có tên cla_crud như sau:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CRUD
{
public class cla_crud
{
}
}
- Tiếp theo hãy using lớp Data.SqlClient và lớp Data.
using System.Data.SqlClient;
using System.Data;
- Bây giờ chúng ta tạo một biến connection như sau
SqlConnection con = new SqlConnection("Chuỗi kết nối của bạn");
Để lấy chuỗi kết nối đầy đủ bạn có thể vào Tool > Connect To Database. Trong bảng này bạn điền tên hoặc IP Server, Có 2 xác thực cho bạn lựa chọn là xác thực windows (Use Windows Authentication) và xác thực máy chủ SQL (Use SQL Server Authentication). Tiếp theo bạn chọn CSDL của bạn. Sau đó có thể nhấn Test Connection để thử kết nối. Nếu thành công bạn nhấn vào nút Advanced… và copy cái dòng cuối cùng.
- Khi làm việc với máy chủ database bạn cần mở kết nối đến chúng bằng phương thức Open() và bạn cần phải đóng kết nối bằng close() sau khi thực hiện xong một thao tác nào đó. Mình sẽ cần viết hai hàm sau.
private void openconnect()
{
if (con.State == ConnectionState.Closed)
{
con.Open();
}
}
private void closeconnect()
{
if (con.State == ConnectionState.Open)
{
con.Close();
}
}
Thật ra bạn chỉ cần sử dụng Open và Close thôi không cần viết ra hai hàm như trên. Tuy nhiên theo kinh nghiệm của mình thì khi bạn viết một dự án lớn, nhiều khi bạn sẽ không kiểm soát được việc đóng mở kết nối nên thường dễ sinh ra lỗi. Để khắc phục được điều này mình thường đưa chúng vào hàm và dùng lệnh kiểm tra trạng thái của kết nối đó rồi mới dưa ra lựa chọn mở hoặc đóng.
Tạo hàm thực thi dữ liệu (CUD) vào database
Thông thường bạn sẽ viết đi viết lại các hàm này trong form, nhưng mình khuyên bạn không nên làm điều đó. Code của bạn có thể dài ra, rối trong việc chỉnh sửa sau này. Trong hướng dẫn này mình viết tất cả trên 1 class và 3 chức năng trong 1 hàm luôn. Mình sẽ hướng dẫn bạn cách gọi chúng trong form ở cuối bài.
Bây giờ chúng ta sẽ tạo ra một hàm như sau nhé.
public Boolean exedata(string cmd)
{
openconnect();
Boolean check = false;
try
{
SqlCommand sc = new SqlCommand(cmd, con);
sc.ExecuteNonQuery();
check = true;
}
catch (Exception)
{
check = false;
}
closeconnect();
return check;
}
Mình sẽ giải thích hàm trên như sau:
- Hàm mình tạo là làm
Boolean
, sẽ trả về giá trịTrue
hoặcFalse
. Mình sẽ cho phép truyền vào một chuỗi lệnh cmd để sử dụng trong hàm. openconnect()
là lời gọi làm mở kết nối mình đã viết ở trên.check
là một biếtboolean
mình tạo ra để trả về sau này. Mặc định mình sẽ cho nó nhận giá trịFalse
.try .... catch
là một khối xử lý ngoại lệ, các đoạn code thực thi trong phầntry
nếu bị lỗi sẽ đưa xuống phầncatch
để xử lý tiếp.SqlCommand sc = new SqlCommand(cmd, con);
là đoạn khai báo một lệnh SQL. Ở đây cần đưa vào 2 thông số đó là câu lệnh (cmd
: lệnh được truyền vào) vàcon
là biến SqlConnection.sc.ExecuteNonQuery();
sẽ tiến hành thực thi đoạn lệnh trên.check = true
: mình sẽ gán giá trị true cho biến check đã tạo ở trên vì lúc này lệnh đã thực thi thành công.check = false
: mình sẽ gán giá trịfalse
cho biếncheck
khi lệnh thực thi ở trên không thể thực hiện được.closeconnect()
là lời gọi hàm để đóng kết nối mình đã viết ở trên.return check
; là giá trị trả về của hàm này. Mình sẽ trả về giá trị mà biếncheck
đang mang.
Đọc dữ liệu từ database
Để dễ dàng xử lý sau này, các dữ liệu mình đọc về sẽ được lưu về một biến datatable. Hàm xử lý như sau.
public DataTable readdata(string cmd)
{
openconnect();
DataTable da = new DataTable();
try
{
SqlCommand sc = new SqlCommand(cmd, con);
SqlDataAdapter sda = new SqlDataAdapter(sc);
sda.Fill(da);
}
catch (Exception)
{
da = null;
}
closeconnect();
return da;
}
- Tương tự với hàm thực thi. Tuy nhiên ở đây ta sẽ không thực thi mà sử dụng sqldatadapter để chuyển đổi dữ liệu từ lệnh cmd trả về. Sau đó thì dùng Fill để đổ dữ liệu từ adapter vào datatable và cuối cùng là trả về một bảng chứa dữ liệu đã truy vấn.
Cách gọi các hàm từ class vào form
Trước tiên mình sẽ thiết kế một giao diện bao gồm 4 nút button là thêm (btn_them
), đọc (btn_doc
), xóa (btn_xoa
), sửa (btn_sua
), 1 textbox (txt_name
), và 1 DataGridView (grv_data
). Đầu tiên ở trong Form, bạn khai báo một đối tượng class đã viết ở trên như sau.
cla_crud connect = new cla_crud();
Bây giờ chúng ta bắt đầu thực hiện từng chức năng.
Thêm, xóa, sửa dữ liệu
3 chức năng này mình chỉ viết demo 1 chức năng thêm, còn lại 2 chức năng kia tương tự chỉ khác câu truy vấn thôi nhé.
private void btn_them_Click(object sender, EventArgs e)
{
if(connect.exedata("INSERT INTO tbl_test (ten) VALUES (N'"+txt_name.Text+"')") == true)
{
MessageBox.Show("Đã thêm dữ liệu");
}
else
{
MessageBox.Show("Không thể thêm dữ liệu");
}
}
- Vì hàm
exedata()
trong class đã viết trả về giá trịtrue
,false
nên chúng ta sẽ sử dụng hàmif
để kiểm tra xem nó có hoàn thành được thao tác hay không. Bây giờ bạn có thể chạy và test thử. - Chữ N trước
txt_name
sẽ giúp insert ký tự có dấu vào CSDL nhé. Các đoạn SQL này bạn có thể thử ở SQL Management trước khi đưa vào để tránh bị lỗi.
Đọc dữ liệu lên datagridview
Mình sẽ viết ra một hàm có tên loaddata
và thực hiện code như sau.
private void loaddata()
{
DataTable dt = connect.readdata("SELECT * FROM tbl_test");
if(dt != null)
{
grv_data.DataSource = dt;
}
}
- Mình sẽ tạo ra một biến DataTable đặt tên là dt để lưu cái datatable trả về từ hàm
readdata
với câu lệnh truyền vào. Sau đó sử dụng hàm if để kiểm tra. Nếu dữ liệu khôngnull
thì sẽ đưa dữ liệu này vào GridView để hiển thị. - Bạn có thể sử dụng hàm này trong form load để tải dữ liệu lên khi form khởi động hoặc ở dưới các hàm thực thi để tải dữ liệu lại sau khi đã thực thi thành công.
Với Class CRUD đã viết bạn có thể sử dụng trong nhiều Project khác của bạn mà không cần phải chỉnh sửa nhiều. Bên trên là một bài hướng dẫn cơ bản về việc thêm đọc xóa sửa cơ sở dữ liệu SQL Server bằng ngôn ngữ lập trình C#.
Chúc bạn thành công.