SQLite - C / C ++
Trong chương này, bạn sẽ học cách sử dụng SQLite trong các chương trình C / C ++.
Cài đặt
Trước khi bắt đầu sử dụng SQLite trong các chương trình C / C ++ của chúng tôi, bạn cần đảm bảo rằng bạn đã thiết lập thư viện SQLite trên máy. Bạn có thể xem chương Cài đặt SQLite để hiểu quá trình cài đặt.
API giao diện C / C ++
Sau đây là các quy trình giao diện C / C ++ SQLite quan trọng, có thể đáp ứng yêu cầu của bạn để làm việc với cơ sở dữ liệu SQLite từ chương trình C / C ++ của bạn. Nếu bạn đang tìm kiếm một ứng dụng phức tạp hơn, thì bạn có thể xem tài liệu chính thức của SQLite.
Sr.No. | API & Mô tả |
---|---|
1 | sqlite3_open(const char *filename, sqlite3 **ppDb) Quy trình này mở một kết nối đến tệp cơ sở dữ liệu SQLite và trả về đối tượng kết nối cơ sở dữ liệu sẽ được sử dụng bởi các quy trình SQLite khác. Nếu đối số tên tệp là NULL hoặc ': memory:', sqlite3_open () sẽ tạo cơ sở dữ liệu trong bộ nhớ trong RAM chỉ kéo dài trong khoảng thời gian của phiên. Nếu tên tệp không phải là NULL, sqlite3_open () cố gắng mở tệp cơ sở dữ liệu bằng cách sử dụng giá trị của nó. Nếu không có tệp nào có tên đó tồn tại, sqlite3_open () sẽ mở tệp cơ sở dữ liệu mới có tên đó. |
2 | sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg) Quy trình này cung cấp một cách nhanh chóng, dễ dàng để thực thi các lệnh SQL được cung cấp bởi đối số sql có thể bao gồm nhiều hơn một lệnh SQL. Ở đây, đối số đầu tiên sqlite3 là một đối tượng cơ sở dữ liệu mở, sqlite_callback là một lệnh gọi lại cho dữ liệu nào là đối số đầu tiên và errmsg sẽ được trả về để ghi lại bất kỳ lỗi nào do quy trình đưa ra. Quy trình SQLite3_exec () phân tích cú pháp và thực thi mọi lệnh được đưa ra trong sql đối số cho đến khi nó đến cuối chuỗi hoặc gặp lỗi. |
3 | sqlite3_close(sqlite3*) Quy trình này đóng một kết nối cơ sở dữ liệu đã mở trước đó bằng một cuộc gọi tới sqlite3_open (). Tất cả các tuyên bố đã chuẩn bị liên quan đến kết nối phải được hoàn thiện trước khi đóng kết nối. Nếu bất kỳ truy vấn nào vẫn chưa được hoàn thành, sqlite3_close () sẽ trả về SQLITE_BUSY với thông báo lỗi Không thể đóng do các câu lệnh chưa hoàn thành. |
Kết nối với cơ sở dữ liệu
Sau đoạn mã C cho thấy cách kết nối với cơ sở dữ liệu hiện có. Nếu cơ sở dữ liệu không tồn tại, thì nó sẽ được tạo và cuối cùng một đối tượng cơ sở dữ liệu sẽ được trả về.
#include <stdio.h>
#include <sqlite3.h>
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));
return(0);
} else {
fprintf(stderr, "Opened database successfully\n");
}
sqlite3_close(db);
}
Bây giờ, hãy biên dịch và chạy chương trình trên để tạo cơ sở dữ liệu của chúng tôi test.dbtrong thư mục hiện tại. Bạn có thể thay đổi đường dẫn của mình theo yêu cầu của bạn.
$gcc test.c -l sqlite3
$./a.out
Opened database successfully
Nếu bạn định sử dụng mã nguồn C ++, thì bạn có thể biên dịch mã của mình như sau:
$g++ test.c -l sqlite3
Ở đây, chúng tôi đang liên kết chương trình của mình với thư viện sqlite3 để cung cấp các chức năng cần thiết cho chương trình C. Thao tác này sẽ tạo tệp cơ sở dữ liệu test.db trong thư mục của bạn 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 bảng
Đoạn mã C sau sẽ được sử dụng để tạo một bảng trong cơ sở dữ liệu đã tạo trước đó -
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
static int callback(void *NotUsed, int argc, char **argv, char **azColName) {
int i;
for(i = 0; i<argc; i++) {
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}
int main(int argc, char* argv[]) {
sqlite3 *db;
char *zErrMsg = 0;
int rc;
char *sql;
/* Open database */
rc = sqlite3_open("test.db", &db);
if( rc ) {
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
return(0);
} else {
fprintf(stdout, "Opened database successfully\n");
}
/* Create SQL statement */
sql = "CREATE TABLE COMPANY(" \
"ID INT PRIMARY KEY NOT NULL," \
"NAME TEXT NOT NULL," \
"AGE INT NOT NULL," \
"ADDRESS CHAR(50)," \
"SALARY REAL );";
/* Execute SQL statement */
rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
if( rc != SQLITE_OK ){
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "Table created successfully\n");
}
sqlite3_close(db);
return 0;
}
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 của bạn và danh sách cuối cùng của tệp sẽ 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
INSERT hoạt động
Đoạn mã C sau đây cho thấy cách bạn có thể tạo bản ghi trong bảng COMPANY được tạo trong ví dụ trên -
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
static int callback(void *NotUsed, int argc, char **argv, char **azColName) {
int i;
for(i = 0; i<argc; i++) {
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}
int main(int argc, char* argv[]) {
sqlite3 *db;
char *zErrMsg = 0;
int rc;
char *sql;
/* Open database */
rc = sqlite3_open("test.db", &db);
if( rc ) {
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
return(0);
} else {
fprintf(stderr, "Opened database successfully\n");
}
/* Create SQL statement */
sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " \
"VALUES (1, 'Paul', 32, 'California', 20000.00 ); " \
"INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " \
"VALUES (2, 'Allen', 25, 'Texas', 15000.00 ); " \
"INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \
"VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );" \
"INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \
"VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );";
/* Execute SQL statement */
rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
if( rc != SQLITE_OK ){
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "Records created successfully\n");
}
sqlite3_close(db);
return 0;
}
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
CHỌN hoạt động
Trước khi tiếp tục với ví dụ thực tế để tìm nạp các bản ghi, chúng ta hãy xem xét một số chi tiết về hàm gọi lại, mà chúng ta đang sử dụng trong các ví dụ của mình. Lệnh gọi lại này cung cấp một cách để lấy kết quả từ các câu 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 gọi lại ở trên được cung cấp trong quy trình sqlite_exec () làm đối số thứ ba, SQLite sẽ gọi hàm gọi lại này cho mỗi bản ghi được xử lý trong mỗi câu lệnh SELECT được thực thi trong đối số SQL.
Đoạn mã C sau đây cho thấy cách bạn có thể tìm nạp và hiển thị các bản ghi từ bảng COMPANY được tạo trong ví dụ trên -
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
static int callback(void *data, int argc, char **argv, char **azColName){
int i;
fprintf(stderr, "%s: ", (const char*)data);
for(i = 0; i<argc; i++){
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}
int main(int argc, char* argv[]) {
sqlite3 *db;
char *zErrMsg = 0;
int rc;
char *sql;
const char* data = "Callback function called";
/* Open database */
rc = sqlite3_open("test.db", &db);
if( rc ) {
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
return(0);
} else {
fprintf(stderr, "Opened database successfully\n");
}
/* Create SQL statement */
sql = "SELECT * from COMPANY";
/* Execute SQL statement */
rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
if( rc != SQLITE_OK ) {
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "Operation done successfully\n");
}
sqlite3_close(db);
return 0;
}
Khi chương trình trên được biên dịch và thực thi, nó sẽ cho ra kết quả như sau.
Opened database successfully
Callback function called: ID = 1
NAME = Paul
AGE = 32
ADDRESS = California
SALARY = 20000.0
Callback function called: ID = 2
NAME = Allen
AGE = 25
ADDRESS = Texas
SALARY = 15000.0
Callback function called: ID = 3
NAME = Teddy
AGE = 23
ADDRESS = Norway
SALARY = 20000.0
Callback function called: ID = 4
NAME = Mark
AGE = 25
ADDRESS = Rich-Mond
SALARY = 65000.0
Operation done successfully
CẬP NHẬT hoạt động
Đoạn mã sau C cho thấy cách chúng ta có thể sử dụng câu lệnh UPDATE để cập nhật bất kỳ bản ghi nào, sau đó tìm nạp và hiển thị các bản ghi đã cập nhật từ bảng COMPANY.
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
static int callback(void *data, int argc, char **argv, char **azColName){
int i;
fprintf(stderr, "%s: ", (const char*)data);
for(i = 0; i<argc; i++) {
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}
int main(int argc, char* argv[]) {
sqlite3 *db;
char *zErrMsg = 0;
int rc;
char *sql;
const char* data = "Callback function called";
/* Open database */
rc = sqlite3_open("test.db", &db);
if( rc ) {
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
return(0);
} else {
fprintf(stderr, "Opened database successfully\n");
}
/* Create merged SQL statement */
sql = "UPDATE COMPANY set SALARY = 25000.00 where ID=1; " \
"SELECT * from COMPANY";
/* Execute SQL statement */
rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
if( rc != SQLITE_OK ) {
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "Operation done successfully\n");
}
sqlite3_close(db);
return 0;
}
Khi chương trình trên được biên dịch và thực thi, nó sẽ cho ra kết quả như sau.
Opened database successfully
Callback function called: ID = 1
NAME = Paul
AGE = 32
ADDRESS = California
SALARY = 25000.0
Callback function called: ID = 2
NAME = Allen
AGE = 25
ADDRESS = Texas
SALARY = 15000.0
Callback function called: ID = 3
NAME = Teddy
AGE = 23
ADDRESS = Norway
SALARY = 20000.0
Callback function called: ID = 4
NAME = Mark
AGE = 25
ADDRESS = Rich-Mond
SALARY = 65000.0
Operation done successfully
Thao tác DELETE
Đoạn mã C sau đây cho thấy cách bạn có thể sử dụng câu lệnh DELETE để xóa bất kỳ bản ghi nào, sau đó tìm nạp và hiển thị các bản ghi còn lại từ bảng COMPANY.
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
static int callback(void *data, int argc, char **argv, char **azColName) {
int i;
fprintf(stderr, "%s: ", (const char*)data);
for(i = 0; i<argc; i++) {
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}
int main(int argc, char* argv[]) {
sqlite3 *db;
char *zErrMsg = 0;
int rc;
char *sql;
const char* data = "Callback function called";
/* Open database */
rc = sqlite3_open("test.db", &db);
if( rc ) {
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
return(0);
} else {
fprintf(stderr, "Opened database successfully\n");
}
/* Create merged SQL statement */
sql = "DELETE from COMPANY where ID=2; " \
"SELECT * from COMPANY";
/* Execute SQL statement */
rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
if( rc != SQLITE_OK ) {
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "Operation done successfully\n");
}
sqlite3_close(db);
return 0;
}
Khi chương trình trên được biên dịch và thực thi, nó sẽ cho ra kết quả như sau.
Opened database successfully
Callback function called: ID = 1
NAME = Paul
AGE = 32
ADDRESS = California
SALARY = 20000.0
Callback function called: ID = 3
NAME = Teddy
AGE = 23
ADDRESS = Norway
SALARY = 20000.0
Callback function called: ID = 4
NAME = Mark
AGE = 25
ADDRESS = Rich-Mond
SALARY = 65000.0
Operation done successfully