Làm việc với CSDL SQLite trong môi trường .NET, qua ngôn ngữ C#.
I. Giới thiệu
SQLite là một hệ quản trị cơ sở dữ liệu (CSDL) không lệ thuộc máy chủ. CSDL SQLite được chứa trong một tập tin mà thôi.
Với tính chất gọn nhẹ này, SQLite rất phù hợp với các chương trình vừa hoặc nhỏ. Khi phân phối sản phẩm, nhà phát triển không cần phải cài đặt hệ quản trị CSDL lên máy người sử dụng, mà chỉ việc mang tập tin CSDL theo cùng chương trình.
II. Cài đặt
Để sử dụng SQLite trong môi trường Microsoft .NET, bạn chỉ cần tải thư viện System.Data.SQLite về và dẫn tham chiếu vào chương trình.
Các bước như sau:
a. Truy cập theo đường dẫn sau đây để tải về bộ thư viện mới nhất:
b. Chọn phiên bản mới nhất.
c. Tải gói binaries về.
d. Giải nén để có hai thư mục bin và Doc.
Thư viện System.Data.SQLite có các bản dịch cho từng nền tảng như 32-bit, 64-bit, Itanium. Bản 32-bit được đặt ở thư mục bin, các bản khác nằm trong các thư mục con của bin.
f. Trong project của chương trình, bạn đưa tham chiếu đến thư viện thích hợp cho máy. Khi phân phối, tùy theo máy người dùng chạy ở nền nào mà họ sẽ tải về phiên bản thích hợp. Bạn nên cung cấp các phiên bản phổ biến như 32-bit và 64-bit. Đơn giản chỉ là thay đổi tập tin System.Data.SQLite.dll cho phù hợp.
III. Tạo một lớp xử lý SQLite
Để dễ dàng làm việc với CSDL SQLite, chúng ta sẽ tạo một lớp gọi là SQLiteDataLayer đảm trách giao tiếp với CSDL.
Trước hết cần nhập các không gian tên thường dùng:
using System.Data;
using System.Data.SQLite;
using System.Data.SQLite;
1. Các trường
Lưu ý: chúng ta cài đặt giao diện IDisposable vào lớp này để nó trả bộ nhớ khi không còn được sử dụng.
Lưu ý: chúng ta cài đặt giao diện IDisposable vào lớp này để nó trả bộ nhớ khi không còn được sử dụng.
class SQLiteDataLayer : System.IDisposable
{
// biến lưu giữ kết nối
protected SQLiteConnection cnn;
// biến trạng thái kết nối
protected bool connected;
// biến thông điệp lỗi gần nhất
protected string lastError;
// Thuộc tính cho biết trạng thái kết nối
public bool Connected
{
get { return this.connected; }
}
// Thuộc tính cho biết thông điệp lỗi gần nhất
public string LastError
{
get { return this.lastError; }
}
}
{
// biến lưu giữ kết nối
protected SQLiteConnection cnn;
// biến trạng thái kết nối
protected bool connected;
// biến thông điệp lỗi gần nhất
protected string lastError;
// Thuộc tính cho biết trạng thái kết nối
public bool Connected
{
get { return this.connected; }
}
// Thuộc tính cho biết thông điệp lỗi gần nhất
public string LastError
{
get { return this.lastError; }
}
}
2. Các phương thức căn bản
a. Khởi tạo
Phương thức khởi tạo không làm gì nhiều và không nhận tham số nào.
a. Khởi tạo
Phương thức khởi tạo không làm gì nhiều và không nhận tham số nào.
public SQLiteDataLayer()
{
this.cnn = null;
this.connected = false;
this.lastError = string.Empty;
}
{
this.cnn = null;
this.connected = false;
this.lastError = string.Empty;
}
b. Kết nối
Ta thiết kế một phương thức kết nối nhận hai tham số là tên tập tin CSDL và mật mã truy cập. Cần lưu ý rằng nếu tham số mật mã bằng null thì có nghĩa mật mã không được cung cấp.
Sau khi kết nối thì ta cũng mở sẵn CSDL luôn.
Ta thiết kế một phương thức kết nối nhận hai tham số là tên tập tin CSDL và mật mã truy cập. Cần lưu ý rằng nếu tham số mật mã bằng null thì có nghĩa mật mã không được cung cấp.
Sau khi kết nối thì ta cũng mở sẵn CSDL luôn.
public bool Connect(string database, string password)
{
// Nếu đã kết nối rồi thì sẽ gây lỗi
if (this.connected)
{
this.lastError = "Connection already established.";
return false;
}
// Khởi tạo kết nối
this.cnn = new SQLiteConnection(string.Concat("Data Source=", database));
// Nếu có cho mật mã thì ấn định luôn
if (password != null)
this.cnn.SetPassword(password);
try
{
// Mở CSDL
this.cnn.Open();
}
catch (SQLiteException ex)
{
// thường có 2 trường hợp lỗi ở đây:
// 1. Tập tin CSDL không truy cập được.
// 2. Mật mã không đúng.
this.lastError = ex.Message;
return false;
}
// Đã kết nối
this.connected = true;
// Không có lỗi
this.lastError = string.Empty;
return true;
}
{
// Nếu đã kết nối rồi thì sẽ gây lỗi
if (this.connected)
{
this.lastError = "Connection already established.";
return false;
}
// Khởi tạo kết nối
this.cnn = new SQLiteConnection(string.Concat("Data Source=", database));
// Nếu có cho mật mã thì ấn định luôn
if (password != null)
this.cnn.SetPassword(password);
try
{
// Mở CSDL
this.cnn.Open();
}
catch (SQLiteException ex)
{
// thường có 2 trường hợp lỗi ở đây:
// 1. Tập tin CSDL không truy cập được.
// 2. Mật mã không đúng.
this.lastError = ex.Message;
return false;
}
// Đã kết nối
this.connected = true;
// Không có lỗi
this.lastError = string.Empty;
return true;
}
c. Đóng kết nối
Khi dùng xong, cần đóng kết nối với phương thức sau:
Khi dùng xong, cần đóng kết nối với phương thức sau:
public bool Disconnect()
{
// Nếu chưa kết nối thì cũng xem là lỗi
if (this.connected == false)
{
this.lastError = "Connection not established.";
return false;
}
// Đóng CSDL
this.cnn.Close();
// Trả bộ nhớ
this.cnn.Dispose();
this.cnn = null;
this.connected = false;
this.lastError = string.Empty;
return true;
}
{
// Nếu chưa kết nối thì cũng xem là lỗi
if (this.connected == false)
{
this.lastError = "Connection not established.";
return false;
}
// Đóng CSDL
this.cnn.Close();
// Trả bộ nhớ
this.cnn.Dispose();
this.cnn = null;
this.connected = false;
this.lastError = string.Empty;
return true;
}
d. Hủy đối tượng
Sau đây là phương thức của giao diện IDisposable đã nói ở trên:
Sau đây là phương thức của giao diện IDisposable đã nói ở trên:
public void Dispose()
{
this.Disconnect();
}
{
this.Disconnect();
}
3. Các thao tác trên CSDL
a. Quy ước
Ở đây đặt ra giả định là chúng ta có CSDL với một bảng tên là tblHocSinh với lệnh tạo như sau:
a. Quy ước
Ở đây đặt ra giả định là chúng ta có CSDL với một bảng tên là tblHocSinh với lệnh tạo như sau:
CREATE TABLE tblHocSinh
(
id INTEGER,
ten TEXT,
diemToan REAL,
diemVan REAL
);
(
id INTEGER,
ten TEXT,
diemToan REAL,
diemVan REAL
);
Từ giờ chúng ta sẽ làm việc với bảng này và các chức năng trong lớp SQLiteDataLayer sẽ được thiết kế cho công việc đó.
b. Nạp dữ liệu vào DataGridView
Vẫn là câu lệnh SQL SELECT quen thuộc mà thôi.
b. Nạp dữ liệu vào DataGridView
Vẫn là câu lệnh SQL SELECT quen thuộc mà thôi.
public bool FillDGV(System.Windows.Forms.DataGridView dgv)
{
// Kiểm tra trạng thái
if (this.connected == false)
{
this.lastError = "Connection not established.";
return false;
}
// Tạo bộ đọc dữ liệu
SQLiteDataAdapter da = new SQLiteDataAdapter(
"SELECT * FROM tblHocSinh;",
this.cnn);
// Nạp dữ liệu
DataTable dt = new DataTable();
da.Fill(dt);
// Đưa vào DataGridView
dgv.DataSource = dt;
// Trả bộ nhớ
da.Dispose();
dt.Dispose();
this.lastError = string.Empty;
return true;
}
{
// Kiểm tra trạng thái
if (this.connected == false)
{
this.lastError = "Connection not established.";
return false;
}
// Tạo bộ đọc dữ liệu
SQLiteDataAdapter da = new SQLiteDataAdapter(
"SELECT * FROM tblHocSinh;",
this.cnn);
// Nạp dữ liệu
DataTable dt = new DataTable();
da.Fill(dt);
// Đưa vào DataGridView
dgv.DataSource = dt;
// Trả bộ nhớ
da.Dispose();
dt.Dispose();
this.lastError = string.Empty;
return true;
}
c. Thêm bản ghi
public bool Add(int id, string ten, double diemToan, double diemVan)
{
// Kiểm tra trạng thái
if (this.connected == false)
{
this.lastError = "Connection not established.";
return false;
}
// Tạo lệnh SQL
SQLiteCommand cmd = new SQLiteCommand(
"INSERT INTO tblHocSinh VALUES (@id, @ten, @diemToan, @diemVan);",
this.cnn);
// Ấn định tham số
cmd.Parameters.Add(new SQLiteParameter("@id", id));
cmd.Parameters.Add(new SQLiteParameter("@ten", ten));
cmd.Parameters.Add(new SQLiteParameter("@diemToan", diemToan));
cmd.Parameters.Add(new SQLiteParameter("@diemVan", diemVan));
// Thi hành
cmd.ExecuteNonQuery();
this.lastError = string.Empty;
return true;
}
{
// Kiểm tra trạng thái
if (this.connected == false)
{
this.lastError = "Connection not established.";
return false;
}
// Tạo lệnh SQL
SQLiteCommand cmd = new SQLiteCommand(
"INSERT INTO tblHocSinh VALUES (@id, @ten, @diemToan, @diemVan);",
this.cnn);
// Ấn định tham số
cmd.Parameters.Add(new SQLiteParameter("@id", id));
cmd.Parameters.Add(new SQLiteParameter("@ten", ten));
cmd.Parameters.Add(new SQLiteParameter("@diemToan", diemToan));
cmd.Parameters.Add(new SQLiteParameter("@diemVan", diemVan));
// Thi hành
cmd.ExecuteNonQuery();
this.lastError = string.Empty;
return true;
}
d. Sửa bản ghi
Ở đây tôi cho phương thức Update nhận tất cả các cột. Tùy theo yêu cầu thực tế mà việc này có thể khác đi.
Ở đây tôi cho phương thức Update nhận tất cả các cột. Tùy theo yêu cầu thực tế mà việc này có thể khác đi.
public bool Update(int id, string ten, double diemToan, double diemVan)
{
// Kiểm tra trạng thái
if (this.connected == false)
{
this.lastError = "Connection not established.";
return false;
}
// Tạo lệnh SQL
SQLiteCommand cmd = new SQLiteCommand(
"UPDATE tblHocSinh SET ten=@ten, diemToan=@diemToan, diemVan=@diemVan WHERE id=@id;",
this.cnn);
// Ấn định tham số
cmd.Parameters.Add(new SQLiteParameter("@id", id));
cmd.Parameters.Add(new SQLiteParameter("@ten", ten));
cmd.Parameters.Add(new SQLiteParameter("@diemToan", diemToan));
cmd.Parameters.Add(new SQLiteParameter("@diemVan", diemVan));
// Thi hành
cmd.ExecuteNonQuery();
this.lastError = string.Empty;
return true;
}
{
// Kiểm tra trạng thái
if (this.connected == false)
{
this.lastError = "Connection not established.";
return false;
}
// Tạo lệnh SQL
SQLiteCommand cmd = new SQLiteCommand(
"UPDATE tblHocSinh SET ten=@ten, diemToan=@diemToan, diemVan=@diemVan WHERE id=@id;",
this.cnn);
// Ấn định tham số
cmd.Parameters.Add(new SQLiteParameter("@id", id));
cmd.Parameters.Add(new SQLiteParameter("@ten", ten));
cmd.Parameters.Add(new SQLiteParameter("@diemToan", diemToan));
cmd.Parameters.Add(new SQLiteParameter("@diemVan", diemVan));
// Thi hành
cmd.ExecuteNonQuery();
this.lastError = string.Empty;
return true;
}
e. Xóa bản ghi
Trong phương thức này tôi dùng cột ten để làm điều kiện. Nếu cần thì bạn hãy thay bằng điều kiện khác tùy ý.
Trong phương thức này tôi dùng cột ten để làm điều kiện. Nếu cần thì bạn hãy thay bằng điều kiện khác tùy ý.
public bool Delete(string ten)
{
// Kiểm tra trạng thái
if (this.connected == false)
{
this.lastError = "Connection not established.";
return false;
}
// Tạo lệnh SQL
SQLiteCommand cmd = new SQLiteCommand(
"DELETE FROM tblHocSinh WHERE ten=@ten;",
this.cnn);
// Ấn định tham số
cmd.Parameters.Add(new SQLiteParameter("@ten", ten));
// Thi hành
cmd.ExecuteNonQuery();
this.lastError = string.Empty;
return true;
}
{
// Kiểm tra trạng thái
if (this.connected == false)
{
this.lastError = "Connection not established.";
return false;
}
// Tạo lệnh SQL
SQLiteCommand cmd = new SQLiteCommand(
"DELETE FROM tblHocSinh WHERE ten=@ten;",
this.cnn);
// Ấn định tham số
cmd.Parameters.Add(new SQLiteParameter("@ten", ten));
// Thi hành
cmd.ExecuteNonQuery();
this.lastError = string.Empty;
return true;
}
f. Kiểm tra xem bản ghi có tồn tại hay không
Ở đây phương thức Exists ngầm định là đang có kết nối với CSDL. Do đó người dùng có thể cần kiểm tra trước bằng thuộc tính Connected.
Ở đây phương thức Exists ngầm định là đang có kết nối với CSDL. Do đó người dùng có thể cần kiểm tra trước bằng thuộc tính Connected.
public bool Exists(string ten)
{
SQLiteCommand cmd = new SQLiteCommand(
"SELECT ten FROM tblHocSinh WHERE ten=@ten;",
this.cnn);
cmd.Parameters.Add(new SQLiteParameter("@ten", ten));
// Nếu select được một cái gì đó != null thì
// xem như bản ghi hiện hữu
return (cmd.ExecuteScalar() != null);
}
{
SQLiteCommand cmd = new SQLiteCommand(
"SELECT ten FROM tblHocSinh WHERE ten=@ten;",
this.cnn);
cmd.Parameters.Add(new SQLiteParameter("@ten", ten));
// Nếu select được một cái gì đó != null thì
// xem như bản ghi hiện hữu
return (cmd.ExecuteScalar() != null);
}
IV. Bảo mật
CSDL SQLite nguyên thủy không có cơ chế bảo mật bằng mật mã. Nhưng thư viện System.Data.SQLite đã cung cấp thêm chức năng này.
Việc thiết lập mật mã cho CSDL được thực hiện với phương thức sau (trong lớp SQLiteDataLayer):
CSDL SQLite nguyên thủy không có cơ chế bảo mật bằng mật mã. Nhưng thư viện System.Data.SQLite đã cung cấp thêm chức năng này.
Việc thiết lập mật mã cho CSDL được thực hiện với phương thức sau (trong lớp SQLiteDataLayer):
public bool ChangePassword(string newPassword)
{
if (this.connected == false)
{
this.lastError = "Connection not established.";
return false;
}
this.cnn.ChangePassword(newPassword);
this.lastError = string.Empty;
return true;
}
{
if (this.connected == false)
{
this.lastError = "Connection not established.";
return false;
}
this.cnn.ChangePassword(newPassword);
this.lastError = string.Empty;
return true;
}
Lưu ý rằng việc đổi mật mã chỉ có thể thực hiện được khi CSDL đang mở, thông qua phương thức Open của SQLiteConnection.
V. Tham khảo
Trang mạng của SQLite: http://www.sqlite.org
V. Tham khảo
Trang mạng của SQLite: http://www.sqlite.org
AngelsIT


Thanks anh! :)
Trả lờiXóa