• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Căn bản về SQLite

Các bài viết hướng dẫn về Visual Basic .NET và C#

Moderators: tungcan5diop, QUANITGROBEST

User avatar
alexanderdna
Guru
Guru
Posts: 214
Joined: Tue 14/07/2009 11:13 am
Location: Sài Gòn
Has thanked: 3 times
Been thanked: 15 times

Căn bản về SQLite

Postby alexanderdna » Mon 11/04/2011 11:35 am

Tên bài viết: Căn bản về SQLite
Tác giả: Đặng Nhật Anh khởi thảo, AFOL Group giữ bản quyền
Cấp độ bài viết: Trung cấp
Tóm tắt: 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:
  1. using System.Data;
  2. 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.
[csharp]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; }
}
}[/csharp]

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.
[csharp]public SQLiteDataLayer()
{
this.cnn = null;
this.connected = false;
this.lastError = string.Empty;
}[/csharp]
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.
[csharp]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;
}[/csharp]
c. Đóng kết nối
Khi dùng xong, cần đóng kết nối với phương thức sau:
[csharp]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;
}[/csharp]
d. Hủy đối tượng
Sau đây là phương thức của giao diện IDisposable đã nói ở trên:
[csharp]public void Dispose()
{
this.Disconnect();
}[/csharp]
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:
[sql]CREATE TABLE tblHocSinh
(
id INTEGER,
ten TEXT,
diemToan REAL,
diemVan REAL
);[/sql]
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.
[csharp]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;
}[/csharp]
c. Thêm bản ghi
[csharp]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;
}[/csharp]
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.
[csharp]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;
}[/csharp]
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 ý.
[csharp]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;
}[/csharp]
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.
[csharp]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);
}[/csharp]

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):
[csharp]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;
}[/csharp]
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
Trang mạng của thư viện System.Data.SQLite: http://sqlite.phxsoftware.com/
Trang mạng của chương trình tạo vào chỉnh sửa CSDL SQLite một cách trực quan: http://sqlitebrowser.sourceforge.net/

Cuối bài có đính kèm chương trình minh họa với các chức năng đã trình bày trong SQLiteDataLayer.
Tập tin CSDL là hocsinh.db3, đặt trong thư mục Debug.

--------------
GHI CHÚ:
Tài liệu này thuộc bản quyền của AFOL Group.
Mọi cá nhân có quyền tái phân phối nguyên dạng với điều kiện là phải giữ nguyên phần ghi chú này.
Attachments
SQLiteDemo.zip
Minh họa SQLite
(493.13 KiB) Downloaded 1328 times



User avatar
alexanderdna
Guru
Guru
Posts: 214
Joined: Tue 14/07/2009 11:13 am
Location: Sài Gòn
Has thanked: 3 times
Been thanked: 15 times

Re: Căn bản về SQLite

Postby alexanderdna » Tue 12/04/2011 9:23 am

Bổ sung lớp SQLiteDataLayer bằng VB.NET:
  1. Class SQLiteDataLayer
  2.  
  3.     Protected cnn As SQLiteConnection
  4.  
  5.     Protected _connected As Boolean
  6.  
  7.     Protected _lastError As String
  8.  
  9.     Public ReadOnly Property Connected() As Boolean
  10.         Get
  11.             Return Me._connected
  12.         End Get
  13.     End Property
  14.  
  15.     Public ReadOnly Property LastError() As String
  16.         Get
  17.             Return Me._lastError
  18.         End Get
  19.     End Property
  20.  
  21.     Public Sub New()
  22.         Me.cnn = Nothing
  23.         Me._connected = False
  24.         Me._lastError = String.Empty
  25.     End Sub
  26.  
  27.     Public Function Connect(ByVal database As String, ByVal password As String) As Boolean
  28.         If Me._connected Then
  29.             Me._lastError = "Connection already established."
  30.             Return False
  31.         End If
  32.  
  33.         Me.cnn = New SQLiteConnection(String.Concat("Data Source=", database, "; FailIfMissing=False"))
  34.  
  35.         If password <> Nothing Then
  36.             Me.cnn.SetPassword(password)
  37.         End If
  38.  
  39.         Try
  40.             Me.cnn.Open()
  41.         Catch ex As SQLiteException
  42.             Me._lastError = ex.Message
  43.             Me.cnn.Dispose()
  44.             Me.cnn = Nothing
  45.             Return False
  46.         End Try
  47.  
  48.         Me._connected = True
  49.  
  50.         Me._lastError = String.Empty
  51.         Return True
  52.     End Function
  53.  
  54.     Public Function Disconnect() As Boolean
  55.         If Not Me._connected Then
  56.             Me._lastError = "Connection not established."
  57.             Return False
  58.         End If
  59.  
  60.         Me.cnn.Close()
  61.         Me.cnn.Dispose()
  62.         Me.cnn = Nothing
  63.  
  64.         Me._lastError = String.Empty
  65.         Return True
  66.     End Function
  67.  
  68.     Public Function FillDGV(ByVal dgv As System.Windows.Forms.DataGridView) As Boolean
  69.         If Not Me._connected Then
  70.             Me._lastError = "Connection not established."
  71.             Return False
  72.         End If
  73.  
  74.         Dim da As New SQLiteDataAdapter("SELECT * FROM tblHocSinh;", Me.cnn)
  75.  
  76.         Dim dt As New DataTable
  77.         da.Fill(dt)
  78.  
  79.         dgv.DataSource = dt
  80.  
  81.         da.Dispose()
  82.         dt.Dispose()
  83.  
  84.         Me._lastError = String.Empty
  85.         Return True
  86.     End Function
  87.  
  88.     Public Function Add(ByVal id As Integer, ByVal ten As String, ByVal diemToan As Double, ByVal diemVan As Double) As Boolean
  89.         If Not Me._connected Then
  90.             Me._lastError = "Connection not established."
  91.             Return False
  92.         End If
  93.  
  94.         Dim cmd As New SQLiteCommand("INSERT INTO tblHocSinh VALUES (@id, @ten, @diemToan, @diemVan);", Me.cnn)
  95.  
  96.         cmd.Parameters.Add(New SQLiteParameter("@id", id))
  97.         cmd.Parameters.Add(New SQLiteParameter("@ten", ten))
  98.         cmd.Parameters.Add(New SQLiteParameter("@diemToan", diemToan))
  99.         cmd.Parameters.Add(New SQLiteParameter("@diemVan", diemVan))
  100.  
  101.         cmd.ExecuteNonQuery()
  102.  
  103.         Me._lastError = String.Empty
  104.         Return True
  105.     End Function
  106.  
  107.     Public Function Update(ByVal id As Integer, ByVal ten As String, ByVal diemToan As Double, ByVal diemVan As Double) As Boolean
  108.         If Not Me._connected Then
  109.             Me._lastError = "Connection not established."
  110.             Return False
  111.         End If
  112.  
  113.         Dim cmd As New SQLiteCommand("UPDATE tblHocSinh SET ten=@ten, diemToan=@diemToan, diemVan=@diemVan WHERE id=@id;", Me.cnn)
  114.  
  115.         cmd.Parameters.Add(New SQLiteParameter("@id", id))
  116.         cmd.Parameters.Add(New SQLiteParameter("@ten", ten))
  117.         cmd.Parameters.Add(New SQLiteParameter("@diemToan", diemToan))
  118.         cmd.Parameters.Add(New SQLiteParameter("@diemVan", diemVan))
  119.  
  120.         cmd.ExecuteNonQuery()
  121.  
  122.         Me._lastError = String.Empty
  123.         Return True
  124.     End Function
  125.  
  126.     Public Function Delete(ByVal ten As String) As Boolean
  127.         If Not Me._connected Then
  128.             Me._lastError = "Connection not established."
  129.             Return False
  130.         End If
  131.  
  132.         Dim cmd As New SQLiteCommand("DELETE FROM tblHocSinh WHERE ten=@ten;", Me.cnn)
  133.  
  134.         cmd.Parameters.Add(New SQLiteParameter("@ten", ten))
  135.  
  136.         cmd.ExecuteNonQuery()
  137.  
  138.         Me._lastError = String.Empty
  139.         Return True
  140.     End Function
  141.  
  142.     Public Function Exists(ByVal ten As String) As Boolean
  143.         Dim cmd As New SQLiteCommand("SELECT ten FROM tblHocSinh WHERE ten=@ten;", Me.cnn)
  144.  
  145.         cmd.Parameters.Add(New SQLiteParameter("@ten", ten))
  146.  
  147.         Return (cmd.ExecuteScalar() <> Nothing)
  148.     End Function
  149.  
  150. End Class


-----
Tập tin SQLiteDemo.zip có một lỗi nhỏ. Bản cập nhật đã upload ở bài đầu.

User avatar
alexanderdna
Guru
Guru
Posts: 214
Joined: Tue 14/07/2009 11:13 am
Location: Sài Gòn
Has thanked: 3 times
Been thanked: 15 times

Re: Căn bản về SQLite

Postby alexanderdna » Tue 12/04/2011 9:37 am

Việc thay đổi mật mã cho CSDL SQLite bằng cách dùng code tỏ ra khá bất tiện trong một số trường hợp.
Do vậy, để tạo thêm sự thuận lợi cho người lập trình, AFOL Group cung cấp ứng dụng nhỏ sau đây.
SQLite DB Password Changer


Chức năng của nó là thay đổi mật mã của một CSDL SQLite.
Ngoài ra, nếu tập tin được cung cấp chưa tồn tại thì một tập tin mới sẽ được tạo ra.
SQLitePWChanger.png
SQLitePWChanger.png (10.69 KiB) Viewed 9453 times
Attachments
SQLitePWChanger.zip
(454.52 KiB) Downloaded 780 times

Lam Tieu Tuong
Thành viên tích cực
Thành viên tích cực
Posts: 195
Joined: Sun 30/03/2008 8:46 pm
Been thanked: 18 times

Re: Căn bản về SQLite

Postby Lam Tieu Tuong » Tue 19/04/2011 8:28 pm

Cái SQLite này dùng nhanh hơn hẳn cái local database của .NET. Có điều những tool để design của nó làm rất chậm và khó chịu.
Bạn có thể dùng SQL Server Management tool để design một cái database trước rồi sau đó convert qua SQLite thì thoải mái hơn.
Cái tool dùng để convert đây này:
http://www.codeproject.com/KB/database/ ... qlite.aspx

User avatar
dazzlingvit
Guru
Guru
Posts: 960
Joined: Tue 18/01/2011 10:21 am
Location: Sinh ra từ hư vô, sống trong thế giới ảo...
Has thanked: 7 times
Been thanked: 112 times
Contact:

Re: Căn bản về SQLite

Postby dazzlingvit » Sat 29/10/2011 2:15 am

Công cụ thiết kế CSDL Sqlite mình nghĩ dùng cái SQLite Expert, bản dành cho cá nhân (miễn phí) là đủ.

User avatar
bangnhatquang68
Guru
Guru
Posts: 791
Joined: Tue 26/01/2010 12:44 pm
Location: Vĩ tuyến 17
Has thanked: 20 times
Been thanked: 38 times
Contact:

Re: Căn bản về SQLite

Postby bangnhatquang68 » Sat 29/10/2011 5:20 pm

sqllite tưởng hay nhưng rất dở.
-dữ liệu dạng file txt nên phơi bụng hết
- hoạt động nhiều làm tăng dụng lượng file, trong khi acess lại có thể làm giảm được
Mời anh em lên facebook giao lưu nào!
http://www.facebook.com/groups/145823032176611/

User avatar
dazzlingvit
Guru
Guru
Posts: 960
Joined: Tue 18/01/2011 10:21 am
Location: Sinh ra từ hư vô, sống trong thế giới ảo...
Has thanked: 7 times
Been thanked: 112 times
Contact:

Re: Căn bản về SQLite

Postby dazzlingvit » Sun 30/10/2011 11:04 am

1. Một khi dữ liệu đã rơi vào tay người dùng thì nói chung các biện pháp mã hoá là một rào cản không đáng kể. Không biết Access mới bây giờ thế nào chứ (máy cùi), Access 2003 trở về trước dùng mấy phần mềm lấy mật khẩu một phát ra luôn.
Sqlite có cái hay là mình có thể tạo một file CSDL mới bằng cách trỏ đường dẫn đến một file không tồn tại. Cái này giúp chương trình có thể tạo/xoá file CSDL linh hoạt (Thực ra mình cũng không biết Access có làm đc như vậy không :D).
(http://www.sqlite.org/fileformat2.html)
Muốn giảm dung lượng Sqlite sau một thời gian INSERT/DELETE nhiều thì dùng lệnh VACUUM.
Còn nếu muốn nó tự động tối ưu dung lượng thì dùng auto_vacuum=FULL
(http://www.sqlite.org/lang%5Fvacuum.html)

Nht2007
Thành viên chính thức
Thành viên chính thức
Posts: 29
Joined: Sun 19/04/2009 8:30 am

Re: Căn bản về SQLite

Postby Nht2007 » Wed 29/08/2012 12:58 pm

Chào bạn!
Cho mình hỏi, mình đang định làm 1 chương trình quản lý nhỏ.
Cho nên chuyển từ sql server qua sqlite.
Nhưng vướng ở phần Tiếng Việt.
Theo mình biết thì SQLITE hỗ trợ UTF-8, ko hỗ trợ Unicode. Cho nên nếu làm thì phải chuyển đổi qua lại Unicode <-> UTF-8.
Có bạn nào có ý kiến hay hơn về ngôn ngữ tiếng việt trong sqlite ko :(

tindl88
Thành viên tâm huyết
Thành viên tâm huyết
Posts: 363
Joined: Sat 26/04/2008 6:10 pm
Has thanked: 16 times
Been thanked: 10 times

Re: Căn bản về SQLite

Postby tindl88 » Tue 26/02/2013 11:59 am

Thêm một ví dụ nữa về SQLite.
Sử dụng .NET 4.0.
Áp dụng bài viết Virtual Listview của anhtuyenbk

Tên chương trình: Codelib
Ngôn ngữ lập trình: C#
Tác giả: tindl88
Chức năng: Lưu trự code mẫu đã viết để sử dụng lại cho lần sau

Attachments
Codelib2.rar
Sourcecode
(1.25 MiB) Downloaded 404 times
view.png
Screenshot


Return to “[.NET] Bài viết hướng dẫn”

Who is online

Users browsing this forum: No registered users and 0 guests