• 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#

Điều hành viên: tungcan5diop, QUANITGROBEST

Hình đại diện của người dùng
alexanderdna
Guru
Guru
Bài viết: 214
Ngày tham gia: T.Ba 14/07/2009 11:13 am
Đến từ: Sài Gòn
Has thanked: 3 time
Been thanked: 15 time

Căn bản về SQLite

Gửi bàigửi bởi alexanderdna » T.Hai 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.
  1. class SQLiteDataLayer : System.IDisposable
  2. {
  3.     // biến lưu giữ kết nối
  4.     protected SQLiteConnection cnn;
  5.     // biến trạng thái kết nối
  6.     protected bool connected;
  7.     // biến thông điệp lỗi gần nhất
  8.     protected string lastError;
  9.  
  10.     // Thuộc tính cho biết trạng thái kết nối
  11.     public bool Connected
  12.     {
  13.         get { return this.connected; }
  14.     }
  15.  
  16.     // Thuộc tính cho biết thông điệp lỗi gần nhất
  17.     public string LastError
  18.     {
  19.         get { return this.lastError; }
  20.     }
  21. }


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.
  1. public SQLiteDataLayer()
  2. {
  3.     this.cnn = null;
  4.     this.connected = false;
  5.     this.lastError = string.Empty;
  6. }

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.
  1. public bool Connect(string database, string password)
  2. {
  3.     // Nếu đã kết nối rồi thì sẽ gây lỗi
  4.     if (this.connected)
  5.     {
  6.         this.lastError = "Connection already established.";
  7.         return false;
  8.     }
  9.  
  10.     // Khởi tạo kết nối
  11.     this.cnn = new SQLiteConnection(string.Concat("Data Source=", database));
  12.    
  13.     // Nếu có cho mật mã thì ấn định luôn
  14.     if (password != null)
  15.         this.cnn.SetPassword(password);
  16.  
  17.     try
  18.     {
  19.         // Mở CSDL
  20.         this.cnn.Open();
  21.     }
  22.     catch (SQLiteException ex)
  23.     {
  24.         // thường có 2 trường hợp lỗi ở đây:
  25.         // 1. Tập tin CSDL không truy cập được.
  26.         // 2. Mật mã không đúng.
  27.         this.lastError = ex.Message;
  28.         return false;
  29.     }
  30.  
  31.     // Đã kết nối
  32.     this.connected = true;
  33.  
  34.     // Không có lỗi
  35.     this.lastError = string.Empty;
  36.  
  37.     return true;
  38. }

c. Đóng kết nối
Khi dùng xong, cần đóng kết nối với phương thức sau:
  1. public bool Disconnect()
  2. {
  3.     // Nếu chưa kết nối thì cũng xem là lỗi
  4.     if (this.connected == false)
  5.     {
  6.         this.lastError = "Connection not established.";
  7.         return false;
  8.     }
  9.  
  10.     // Đóng CSDL
  11.     this.cnn.Close();
  12.     // Trả bộ nhớ
  13.     this.cnn.Dispose();
  14.     this.cnn = null;
  15.  
  16.     this.connected = false;
  17.  
  18.     this.lastError = string.Empty;
  19.     return true;
  20. }

d. Hủy đối tượng
Sau đây là phương thức của giao diện IDisposable đã nói ở trên:
  1. public void Dispose()
  2. {
  3.     this.Disconnect();
  4. }

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:
  1. CREATE TABLE tblHocSinh
  2. (
  3.     id INTEGER,
  4.     ten TEXT,
  5.     diemToan REAL,
  6.     diemVan REAL
  7. );

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.
  1. public bool FillDGV(System.Windows.Forms.DataGridView dgv)
  2. {
  3.     // Kiểm tra trạng thái
  4.     if (this.connected == false)
  5.     {
  6.         this.lastError = "Connection not established.";
  7.         return false;
  8.     }
  9.  
  10.     // Tạo bộ đọc dữ liệu
  11.     SQLiteDataAdapter da = new SQLiteDataAdapter(
  12.         "SELECT * FROM tblHocSinh;",
  13.         this.cnn);
  14.  
  15.     // Nạp dữ liệu
  16.     DataTable dt = new DataTable();
  17.     da.Fill(dt);
  18.  
  19.     // Đưa vào DataGridView
  20.     dgv.DataSource = dt;
  21.  
  22.     // Trả bộ nhớ
  23.     da.Dispose();
  24.     dt.Dispose();
  25.  
  26.     this.lastError = string.Empty;
  27.     return true;
  28. }

c. Thêm bản ghi
  1. public bool Add(int id, string ten, double diemToan, double diemVan)
  2. {
  3.     // Kiểm tra trạng thái
  4.     if (this.connected == false)
  5.     {
  6.         this.lastError = "Connection not established.";
  7.         return false;
  8.     }
  9.  
  10.     // Tạo lệnh SQL
  11.     SQLiteCommand cmd = new SQLiteCommand(
  12.         "INSERT INTO tblHocSinh VALUES (@id, @ten, @diemToan, @diemVan);",
  13.         this.cnn);
  14.  
  15.     // Ấn định tham số
  16.     cmd.Parameters.Add(new SQLiteParameter("@id", id));
  17.     cmd.Parameters.Add(new SQLiteParameter("@ten", ten));
  18.     cmd.Parameters.Add(new SQLiteParameter("@diemToan", diemToan));
  19.     cmd.Parameters.Add(new SQLiteParameter("@diemVan", diemVan));
  20.  
  21.     // Thi hành
  22.     cmd.ExecuteNonQuery();
  23.  
  24.     this.lastError = string.Empty;
  25.     return true;
  26. }

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.
  1. public bool Update(int id, string ten, double diemToan, double diemVan)
  2. {
  3.     // Kiểm tra trạng thái
  4.     if (this.connected == false)
  5.     {
  6.         this.lastError = "Connection not established.";
  7.         return false;
  8.     }
  9.  
  10.     // Tạo lệnh SQL
  11.     SQLiteCommand cmd = new SQLiteCommand(
  12.         "UPDATE tblHocSinh SET ten=@ten, diemToan=@diemToan, diemVan=@diemVan WHERE id=@id;",
  13.         this.cnn);
  14.  
  15.     // Ấn định tham số
  16.     cmd.Parameters.Add(new SQLiteParameter("@id", id));
  17.     cmd.Parameters.Add(new SQLiteParameter("@ten", ten));
  18.     cmd.Parameters.Add(new SQLiteParameter("@diemToan", diemToan));
  19.     cmd.Parameters.Add(new SQLiteParameter("@diemVan", diemVan));
  20.  
  21.     // Thi hành
  22.     cmd.ExecuteNonQuery();
  23.  
  24.     this.lastError = string.Empty;
  25.     return true;
  26. }

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 ý.
  1. public bool Delete(string ten)
  2. {
  3.     // Kiểm tra trạng thái
  4.     if (this.connected == false)
  5.     {
  6.         this.lastError = "Connection not established.";
  7.         return false;
  8.     }
  9.  
  10.     // Tạo lệnh SQL
  11.     SQLiteCommand cmd = new SQLiteCommand(
  12.         "DELETE FROM tblHocSinh WHERE ten=@ten;",
  13.         this.cnn);
  14.  
  15.     // Ấn định tham số
  16.     cmd.Parameters.Add(new SQLiteParameter("@ten", ten));
  17.  
  18.     // Thi hành
  19.     cmd.ExecuteNonQuery();
  20.  
  21.     this.lastError = string.Empty;
  22.     return true;
  23. }

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.
  1. public bool Exists(string ten)
  2. {
  3.     SQLiteCommand cmd = new SQLiteCommand(
  4.         "SELECT ten FROM tblHocSinh WHERE ten=@ten;",
  5.         this.cnn);
  6.  
  7.     cmd.Parameters.Add(new SQLiteParameter("@ten", ten));
  8.  
  9.     // Nếu select được một cái gì đó != null thì
  10.     // xem như bản ghi hiện hữu
  11.     return (cmd.ExecuteScalar() != null);
  12. }


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):
  1. public bool ChangePassword(string newPassword)
  2. {
  3.     if (this.connected == false)
  4.     {
  5.         this.lastError = "Connection not established.";
  6.         return false;
  7.     }
  8.  
  9.     this.cnn.ChangePassword(newPassword);
  10.  
  11.     this.lastError = string.Empty;
  12.     return true;
  13. }

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.
Tập tin đính kèm
SQLiteDemo.zip
Minh họa SQLite
(493.13 KiB) Đã tải 1278 lần



Hình đại diện của người dùng
alexanderdna
Guru
Guru
Bài viết: 214
Ngày tham gia: T.Ba 14/07/2009 11:13 am
Đến từ: Sài Gòn
Has thanked: 3 time
Been thanked: 15 time

Re: Căn bản về SQLite

Gửi bàigửi bởi alexanderdna » T.Ba 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.

Hình đại diện của người dùng
alexanderdna
Guru
Guru
Bài viết: 214
Ngày tham gia: T.Ba 14/07/2009 11:13 am
Đến từ: Sài Gòn
Has thanked: 3 time
Been thanked: 15 time

Re: Căn bản về SQLite

Gửi bàigửi bởi alexanderdna » T.Ba 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) Đã xem 8451 lần
Tập tin đính kèm
SQLitePWChanger.zip
(454.52 KiB) Đã tải 733 lần

Lam Tieu Tuong
Thành viên tích cực
Thành viên tích cực
Bài viết: 195
Ngày tham gia: CN 30/03/2008 8:46 pm
Been thanked: 18 time

Re: Căn bản về SQLite

Gửi bàigửi bởi Lam Tieu Tuong » T.Ba 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

Hình đại diện của người dùng
dazzlingvit
Guru
Guru
Bài viết: 960
Ngày tham gia: T.Ba 18/01/2011 10:21 am
Đến từ: Sinh ra từ hư vô, sống trong thế giới ảo...
Has thanked: 7 time
Been thanked: 112 time
Liên hệ:

Re: Căn bản về SQLite

Gửi bàigửi bởi dazzlingvit » T.Bảy 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à đủ.

Hình đại diện của người dùng
bangnhatquang68
Guru
Guru
Bài viết: 791
Ngày tham gia: T.Ba 26/01/2010 12:44 pm
Đến từ: Vĩ tuyến 17
Has thanked: 20 time
Been thanked: 38 time
Liên hệ:

Re: Căn bản về SQLite

Gửi bàigửi bởi bangnhatquang68 » T.Bảy 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/

Hình đại diện của người dùng
dazzlingvit
Guru
Guru
Bài viết: 960
Ngày tham gia: T.Ba 18/01/2011 10:21 am
Đến từ: Sinh ra từ hư vô, sống trong thế giới ảo...
Has thanked: 7 time
Been thanked: 112 time
Liên hệ:

Re: Căn bản về SQLite

Gửi bàigửi bởi dazzlingvit » CN 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
Bài viết: 29
Ngày tham gia: CN 19/04/2009 8:30 am

Re: Căn bản về SQLite

Gửi bàigửi bởi Nht2007 » T.Tư 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
Bài viết: 363
Ngày tham gia: T.Bảy 26/04/2008 6:10 pm
Has thanked: 16 time
Been thanked: 10 time

Re: Căn bản về SQLite

Gửi bàigửi bởi tindl88 » T.Ba 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

Tập tin đính kèm
Codelib2.rar
Sourcecode
(1.25 MiB) Đã tải 359 lần
view.png
Screenshot


Quay về “[.NET] Bài viết hướng dẫn”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.0 khách