Bài 13: Kết nối SQLite với C# (.NET) – Xây dựng ứng dụng Desktop
I. Mục đích (Objectives)
Sau bài học này, người đọc sẽ:
- Biết cách cài đặt thư viện System.Data.SQLite thông qua NuGet Package Manager trong Visual Studio.
- Hiểu mô hình ADO.NET cơ bản: Connection, Command, DataReader và DataTable.
- Thực hiện được việc đổ dữ liệu từ SQLite lên giao diện DataGridView.
- Nắm vững cách xử lý đường dẫn file database (Relative Path) để ứng dụng chạy được trên mọi máy.
II. Yêu cầu (Prerequisites)
- Đã cài đặt Visual Studio (phiên bản 2019 hoặc 2022).
- Có kiến thức cơ bản về C# và WinForms (hoặc WPF).
- File QuanLyLopHoc.db (từ các bài trước).
III. Nội dung chi tiết (Detailed Content)
1. Cài đặt thư viện (Setup)
Mặc định .NET Framework không hiểu SQLite là gì. Ta cần cài một “người phiên dịch”.
- Bước 1: Tạo một Project mới (Windows Forms App .NET Framework hoặc .NET Core).
- Bước 2: Chuột phải vào tên Project trong Solution Explorer -> Chọn Manage NuGet Packages…
- Bước 3: Chuyển sang tab Browse, gõ từ khóa: System.Data.SQLite.
- Bước 4: Chọn gói của tác giả “SQLite Development Team” và nhấn Install.
2. Chuỗi kết nối (Connection String) và Vị trí file
Đây là phần các bạn hay gặp lỗi nhất (“File not found”).
- Chuỗi kết nối chuẩn: Data Source=TenFile.db;Version=3;
-
Vị trí đặt file:
- Để đơn giản cho việc học, hãy copy file QuanLyLopHoc.db vào thư mục bin\Debug (nơi sinh ra file .exe khi chạy).
- Lúc này, trong code chỉ cần gọi tên file, không cần đường dẫn dài dòng C:\Users\….
3. Đọc dữ liệu và hiển thị lên DataGridView
Mô hình phổ biến nhất trong các ứng dụng quản lý là: Lấy dữ liệu -> Đổ vào DataTable -> Gán vào DataGridView.
Code mẫu (trong sự kiện Form_Load hoặc Button_Click):
using System;
using System.Data;
using System.Windows.Forms;
using System.Data.SQLite; // Đừng quên dòng này
namespace DemoSQLite
{
public partial class Form1 : Form
{
// Chuỗi kết nối (File db nằm cùng cấp với file .exe)
string strKetNoi = "Data Source=QuanLyLopHoc.db;Version=3;";
public Form1()
{
InitializeComponent();
}
private void btnTaiDuLieu_Click(object sender, EventArgs e)
{
// Sử dụng 'using' để tự động đóng kết nối và giải phóng bộ nhớ
using (SQLiteConnection conn = new SQLiteConnection(strKetNoi))
{
try
{
conn.Open();
// Câu lệnh SQL
string sql = "SELECT * FROM HocSinh";
// Tạo adapter để đổ dữ liệu (Cầu nối)
SQLiteDataAdapter da = new SQLiteDataAdapter(sql, conn);
DataTable dt = new DataTable();
// Đổ dữ liệu vào DataTable
da.Fill(dt);
// Hiển thị lên DataGridView
dataGridView1.DataSource = dt;
}
catch (Exception ex)
{
MessageBox.Show("Lỗi: " + ex.Message);
}
}
// Kết thúc khối using, conn sẽ tự động Close()
}
}
}
4. Thêm dữ liệu an toàn (INSERT với Parameter)
Cũng giống như bài Python, trong C# chúng ta tuyệt đối không cộng chuỗi. Hãy dùng Parameters.AddWithValue.
private void btnThem_Click(object sender, EventArgs e)
{
using (SQLiteConnection conn = new SQLiteConnection(strKetNoi))
{
try
{
conn.Open();
string sql = "INSERT INTO HocSinh (ho_ten, diem_tb, ma_lop_id) VALUES (@ten, @diem, @malop)";
using (SQLiteCommand cmd = new SQLiteCommand(sql, conn))
{
// Truyền tham số an toàn
cmd.Parameters.AddWithValue("@ten", txtHoTen.Text);
cmd.Parameters.AddWithValue("@diem", double.Parse(txtDiem.Text));
cmd.Parameters.AddWithValue("@malop", int.Parse(txtMaLop.Text));
// Thực thi lệnh (ExecuteNonQuery dùng cho INSERT, UPDATE, DELETE)
cmd.ExecuteNonQuery();
}
MessageBox.Show("Thêm thành công!");
// Gọi lại hàm tải dữ liệu để cập nhật lưới
btnTaiDuLieu_Click(null, null);
}
catch (Exception ex)
{
MessageBox.Show("Lỗi thêm: " + ex.Message);
}
}
}
5. Sự khác biệt giữa ExecuteNonQuery, ExecuteScalar và ExecuteReader
Trong C# (ADO.NET), bạn cần chọn đúng công cụ cho đúng việc:
- ExecuteNonQuery(): Dùng cho INSERT, UPDATE, DELETE. Trả về số dòng bị ảnh hưởng (int).
- ExecuteScalar(): Dùng khi chỉ lấy 1 giá trị duy nhất (ví dụ: SELECT COUNT(*), SELECT MAX(…)).
- **ExecuteReader()“**: Dùng cho SELECT lấy nhiều dòng (nhưng nếu dùngDataAdapter` như mục 3 thì không cần cái này).
IV. Tổng kết (Summary)
Chúng ta đã hoàn thành việc tích hợp SQLite vào môi trường .NET:
- Cài đặt thư viện qua NuGet.
- Kết nối và đổ dữ liệu lên DataGridView (thao tác phổ biến nhất).
- Thực hiện thêm dữ liệu an toàn với Parameter.
Với kiến thức này, bạn hoàn toàn có thể làm các đồ án môn học như: Quản lý thư viện, Quản lý quán Cafe, Phần mềm trắc nghiệm… chạy offline nhẹ nhàng mà không cần cài SQL Server nặng nề.
Ở bài tiếp theo, bài cuối cùng của series, chúng ta sẽ tổng kết lại toàn bộ kiến thức và thực hiện một Project thực tế tổng hợp. Hẹn gặp lại các bạn trong Bài 14: Project thực tế – Xây dựng Ứng dụng Quản lý Chi tiêu cá nhân.
