使用C++将sqlite3数据库封装
时间: 2023-10-25 22:09:07 浏览: 115
以下是一个简单的示例,展示如何使用C语言将SQLite3数据库进行封装:
首先,需要包含SQLite3的头文件和一些常量定义:
```c
#include <sqlite3.h>
#define MAX_QUERY_LENGTH 1000
#define MAX_COLUMN_COUNT 50
```
接着,定义一个结构体来表示数据库连接:
```c
typedef struct {
sqlite3* db;
char* error_message;
} Database;
```
其中,`db`是一个指向SQLite3数据库的指针,`error_message`用于存储错误信息。
然后,可以定义一些函数来实现数据库操作,比如连接数据库、执行查询语句、关闭数据库等:
```c
int connect_to_database(Database* db, const char* db_name) {
int rc = sqlite3_open(db_name, &(db->db));
if (rc != SQLITE_OK) {
db->error_message = sqlite3_errmsg(db->db);
return 0;
}
return 1;
}
int execute_query(Database* db, const char* query, char*** results, int* rows, int* cols) {
sqlite3_stmt* stmt;
int rc = sqlite3_prepare_v2(db->db, query, -1, &stmt, NULL);
if (rc != SQLITE_OK) {
db->error_message = sqlite3_errmsg(db->db);
return 0;
}
int col_count = sqlite3_column_count(stmt);
if (col_count > MAX_COLUMN_COUNT) {
db->error_message = "Too many columns returned by query";
return 0;
}
char** result_rows = malloc(sizeof(char*) * MAX_COLUMN_COUNT * MAX_QUERY_LENGTH);
int row_count = 0;
while ((rc = sqlite3_step(stmt)) == SQLITE_ROW) {
for (int i = 0; i < col_count; ++i) {
const char* value = (const char*) sqlite3_column_text(stmt, i);
char* copy = malloc(strlen(value) + 1);
strcpy(copy, value);
result_rows[row_count * col_count + i] = copy;
}
++row_count;
}
sqlite3_finalize(stmt);
if (rc != SQLITE_DONE) {
db->error_message = sqlite3_errmsg(db->db);
return 0;
}
*results = result_rows;
*rows = row_count;
*cols = col_count;
return 1;
}
void close_database(Database* db) {
sqlite3_close(db->db);
db->db = NULL;
}
```
其中,`connect_to_database`函数用于连接指定的数据库,`execute_query`函数用于执行查询语句并返回结果,`close_database`函数用于关闭数据库连接。
最后,可以编写一个简单的测试程序来使用这些函数:
```c
int main() {
Database db;
if (!connect_to_database(&db, "test.db")) {
printf("Error connecting to database: %s\n", db.error_message);
return 1;
}
char* query = "SELECT * FROM my_table";
char** results;
int rows, cols;
if (!execute_query(&db, query, &results, &rows, &cols)) {
printf("Error executing query: %s\n", db.error_message);
close_database(&db);
return 1;
}
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
printf("%s ", results[i * cols + j]);
}
printf("\n");
}
close_database(&db);
return 0;
}
```
这是一个简单的示例,实际使用中可能需要更多的错误处理和参数检查来保证程序的健壮性。