Sử dụng SQLite với C/C++



Cài đặt

Trước khi sử dụng SQLite trong các chương trình C/C++, bạn cần đảm bảo rằng đã có SQLite Library được cài đặt trên máy tính. Bạn có thể kiểm tra chương Cài đặt SQLite để biết tiến trình cài đặt, nếu cần.

C/C++ Interface APIs

Dưới đây là một số chương trình C&C++ / SQLite Interface đủ để đáp ứng yêu cầu của bạn khi làm việc với SQLite Database từ chương trình C/C++ của bạn. Nếu bạn muốn tìm một ứng dụng tinh vi hơn, bạn có thể tìm nó trong SQLite Documentation.

STTAPI & Miêu tả
1sqlite3_open(const char *filename, sqlite3 **ppDb)

Chương trình con này mở một kết nối tới một SQLite database file và trả về một đối tượng database connection để được sử dụng bởi các chương trình con SQLite khác

Nếu tham số filename là NULL hoặc ':memory:', sqlite3_open() sẽ tạo một in-memory database trong RAM mà chỉ tồn tại trong suốt phiên đó.

Nếu filename không là NULL, sqlite3_open() cố gắng mở một database file bởi sử dụng giá trị của nó. Nếu không có file nào tồn tại với tên đó, hàm sqlite3_open() sẽ mở một database file mới bởi tên đó

2sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg)

Chương trình con này cung cấp một cách thức nhanh và dễ dàng để thực thi các lệnh SQL được cung cấp bởi tham số sql mà có thể bao gồm nhiều hơn một lệnh SQL

Ở đây, tham số đầu tiên sqlite3 là đối tượng open database, sqlite_callback là một callback từ đó data là tham số đầu tiên và errmsg sẽ được trả về để bắt bất kỳ lỗi nào được tạo ra bởi chương trình con đó

Chương trình con sqlite3_exec() phân tích và thực thi mỗi lệnh đã cho trong tham số sql tới khi nó tiến tới phần cuối của chuỗi hoặc bắt gặp một lỗi

3sqlite3_close(sqlite3*)

Chương trình con này đóng một database connection đã được mở trước đó bởi lời gọi tới hàm sqlite3_open(). Tất cả các lệnh đã chuẩn bị mà được gắn kết với connection nên bị kết thúc trước khi đóng connection đó.

Nếu còn tồn tại bất kỳ truy vấn nào chưa được kết thúc, sqlite3_close() sẽ trả về SQLITE_BUSY với một thông báo lỗi là Unable to close due to unfinalized statements

Kết nối tới Database

Chương trình C sau minh họa cách kết nối tới Database đang tồn tại. Nếu Database đó không tồn tại, thì nó sẽ được tạo, và cuối cùng một đối tượng Database sẽ được trả về.

#include 
#include  int main(int argc, char* argv[])
{
   sqlite3 *db;
   char *zErrMsg = 0;
   int rc;   rc = sqlite3_open("test.db", &db);   if( rc ){
      fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
      exit(0);
   }else{
      fprintf(stderr, "Opened database successfully\n");
   }
   sqlite3_close(db);
}

Bây giờ, biên dịch và chạy chương trình trên để tạo cơ sở dữ liệu test.db trong thư mục hiện tại. Bạn có thể thay đổi Path tùy theo yêu cầu của mình.

$gcc test.c -l sqlite3
$./a.out
Opened database successfully

Nếu bạn đang sử dụng C++ source code, thì bạn có thể biên dịch chương trình này như sau:

$g++ test.c -l sqlite3

Ở đây, chúng ra đang liên kết chương trình của chúng ta với SQLite3 Library để cung cấp các hàm cần thiết cho chương trình C. Việc này sẽ tạo một Database file là test.db trong thư mục và bạn sẽ có kết quả sau:

-rwxr-xr-x. 1 root root 7383 May  8 02:06 a.out
-rw-r--r--. 1 root root  323 May  8 02:05 test.c
-rw-r--r--. 1 root root    0 May  8 02:06 test.db

Tạo một bảng

Chương trình C sau sẽ được sử dụng để tạo một bảng trong Database đã được tạo trước đó.

#include 
#include 
#include  static int callback(void *NotUsed, int argc, char **argv, char **azColName){
   int i;
   for(i=0; i

Khi chương trình trên được biên dịch và thực thi, nó sẽ tạo bảng COMPANY trong test.db và sau đó liệt kê file như sau:

-rwxr-xr-x. 1 root root 9567 May  8 02:31 a.out
-rw-r--r--. 1 root root 1207 May  8 02:31 test.c
-rw-r--r--. 1 root root 3072 May  8 02:31 test.db

Hoạt động INSERT

Chương trình C sau minh họa cách chúng ta tạo các bản ghi trong bảng COMPANY đã tạo ở ví dụ trên:

#include 
#include 
#include  static int callback(void *NotUsed, int argc, char **argv, char **azColName){
   int i;
   for(i=0; i

Khi chương trình trên được biên dịch và thực thi, nó sẽ tạo các bản ghi đã cho trong bảng COMPANY và sẽ hiển thị hai dòng sau:

Opened database successfully
Records created successfully

Hoạt động SELECT

Trước khi đi vào ví dụ thực sự để lấy các bản ghi, đầu tiên mình sẽ giới thiệu chi tiết cho bạn về hàm callback, sẽ được sử dụng trong các ví dụ. Hàm callback này cung cấp một cách thức để lấy các kết quả từ các lệnh SELECT. Nó có khai báo sau:

typedef int (*sqlite3_callback)(
void*,    /* Data provided in the 4th argument of sqlite3_exec() */
int,      /* The number of columns in row */
char**,   /* An array of strings representing fields in the row */
char**    /* An array of strings representing column names */
);

Nếu hàm callback trên được cung cấp trong chương trình con sqlite_exec() như là tham số thứ ba, SQLite sẽ gọi hàm callback này cho mỗi bản ghi được xử lý trong mỗi lệnh SELECT được thực thi bên trong tham số SQL.

Chương trình C sau minh họa cách chúng ta lấy và hiển thị các bản ghi từ bảng COMPANY được tạo trong ví dụ trên:

#include 
#include 
#include  static int callback(void *data, int argc, char **argv, char **azColName){
   int i;
   fprintf(stderr, "%s: ", (const char*)data);
   for(i=0; i

Khi chương trình trên được biên dịch và thực thi, kết quả là:

Opened database successfully
Callback function called: ID = 1
NAME = Paul
AGE = 32
ADDRESS = California
SALARY = 20000.0Callback function called: ID = 2
NAME = Allen
AGE = 25
ADDRESS = Texas
SALARY = 15000.0Callback function called: ID = 3
NAME = Teddy
AGE = 23
ADDRESS = Norway
SALARY = 20000.0Callback function called: ID = 4
NAME = Mark
AGE = 25
ADDRESS = Rich-Mond
SALARY = 65000.0Operation done successfully

Hoạt động UPDATE

Chương trình C sau minh họa cách chúng ta sử dụng các lệnh UPDATE để cập nhật bất kỳ bản ghi nào và sau đó lấy và hiển thị các bản ghi đã được cập nhật từ bảng COMPANY:

#include 
#include 
#include  static int callback(void *data, int argc, char **argv, char **azColName){
   int i;
   fprintf(stderr, "%s: ", (const char*)data);
   for(i=0; i

Khi chương trình trên được biên dịch và thực thi, kết quả là:

Opened database successfully
Callback function called: ID = 1
NAME = Paul
AGE = 32
ADDRESS = California
SALARY = 25000.0Callback function called: ID = 2
NAME = Allen
AGE = 25
ADDRESS = Texas
SALARY = 15000.0Callback function called: ID = 3
NAME = Teddy
AGE = 23
ADDRESS = Norway
SALARY = 20000.0Callback function called: ID = 4
NAME = Mark
AGE = 25
ADDRESS = Rich-Mond
SALARY = 65000.0Operation done successfully

Hoạt động DELETE

Chương trình C sau minh họa cách chúng ta sử dụng các lệnh DELETE để xóa bất kỳ bản ghi nào và sau đó lấy và hiển thị các bản ghi còn lại từ bảng COMPANY:

#include 
#include 
#include  static int callback(void *data, int argc, char **argv, char **azColName){
   int i;
   fprintf(stderr, "%s: ", (const char*)data);
   for(i=0; i

Khi chương trình trên được biên dịch và thực thi, kết quả là:

Opened database successfully
Callback function called: ID = 1
NAME = Paul
AGE = 32
ADDRESS = California
SALARY = 20000.0Callback function called: ID = 3
NAME = Teddy
AGE = 23
ADDRESS = Norway
SALARY = 20000.0Callback function called: ID = 4
NAME = Mark
AGE = 25
ADDRESS = Rich-Mond
SALARY = 65000.0Operation done successfully

Các bài học SQLite phổ biến khác tại VietJack: