目录
3.2.2 使用sqlite3_exec()函数向表中插入数据
一、sqlite3支持的语言与框架
Python:通过Python的标准库sqlite3,可以在Python中访问SQLite3数据库;
Java:使用Java JDBC接口或者第三方库JDBC SQLite,可以在Java中访问SQLite3数据库;
C++:使用C++的SQLite3 API,可以在C++中访问SQLite3数据库;
.NET:通过ADO.NET提供的SQLite3数据提供程序,可以在.NET平台上访问SQLite3数据库;
Ruby:通过Ruby的sqlite3 gem,可以在Ruby中访问SQLite3数据库;
PHP:使用PHP内置的PDO SQLite类或SQLite扩展,可以在PHP中访问SQLite3数据库;
Node.js:通过node-sqlite3库,在Node.js中访问SQLite3数据库。
以下进行C语言的接口介绍
二、数据库的打开和关闭
2.1 数据库的打开(sqlite3_open函数)
sqlite3_open() 函数用于打开一个 SQLite 数据库文件的函数,函数原型如下:
int sqlite3_open(const char *filename, sqlite3 **ppDb);
- 第一个参数为数据库文件的文件名,如果为":memory",则表示创建内存中的数据库
- 第二个参数是一个二级指针,它存储一个指向打开的数据库连接的指针,这个指针在后续地SQLite操作中使用
这个函数使用指定的数据库文件名(或 :memory:
)打开一个新的数据库连接,并且把连接句柄返回给调用者如果连接成功,将会返回 SQLITE_OK
编码(0),否则将会返回其他错误代码。
需要注意的是,SQLite 数据库文件不存在时将会自动创建。如果 filename
参数为 NULL
,该函数返回 SQLITE_MISUSE
(错用 SQLite 调用)错误。
例如,以下是在 C 语言中打开一个 SQLite 数据库的示例代码:
#include <stdio.h>
#include <sqlite3.h>
int main() {
sqlite3 *db;
/*打开数据库*/
int rc = sqlite3_open("test.db", &db);
if (rc == SQLITE_OK) {
printf("已成功打开数据库\n");
sqlite3_close(db); // 关闭数据库连接
} else {
fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return 1;
}
return 0;
}
2.2 数据库的关闭(sqlite3_close函数)
sqlite3_close()
函数用于关闭指定数据库连接的函数。函数原型如下:
int sqlite3_close(sqlite3*);
该函数接收一个被打开的数据库连接指针,如果成功关闭返回 SQLITE_OK
编码(0),否则返回其他错误代码。
在使用完SQLite数据库连接之后,应该释放它以避免资源泄漏和内存占用。调用 sqlite3_close()
函数将关闭数据库连接,并释放所有相关的资源,包括已编译的语句等。如果在关闭连接之前还有未完成的事务,则会自动回滚这些事务。
例如,以下是在 C 语言中关闭 SQLite 数据库连接的示例代码:
#include <sqlite3.h>
int main() {
sqlite3 *db;
int rc = sqlite3_open("test.db", &db);
// 执行一些数据库操作
// ...
rc = sqlite3_close(db);
if (rc == SQLITE_OK) {
printf("Closed database successfully\n");
} else {
fprintf(stderr, "Can't close database: %s\n", sqlite3_errmsg(db));
}
return 0;
}
三、执行SQL语句(sqlite3_exec函数)
3.1 sqlite3_exec函数介绍
sqlite3_exec()
函数用于在 SQLite 数据库连接上执行一条或多条 SQL 语句,并调用一个回调函数处理执行结果。该函数的原型如下:
int sqlite3_exec(
sqlite3*, /* 执行 SQL 命令的数据库连接 */
const char *sql, /* 待执行的 SQL 命令 */
int (*callback)(void*,int,char**,char**), /* 在执行命令时的回调函数 */
void *, /* 作为第一个参数传递给回调函数的指针 */
char **errmsg /* 用于存储错误消息的指针 */
);
该函数接收一个打开的数据库连接 sqlite3*
,
待执行的 SQL 命令 sql
,
以及一个回调函数 callback
,
回调函数的参数列表决定了该函数在被调用时应接收哪些参数,并指定了它们的数据类型和顺序。
回调函数必须符合以下格式:
int (*callback)(void*, int, char**, char**);
- 第一个参数
void*
,是使用者传递给sqlite3_exec()
调用的void*
参数。 - 第二个参数
int
,是查询结果所返回的列数。 - 第三个参数
char**
,是包含每个结果集元素值的字符串数组。 - 第四个参数
char**
,是包含每个结果集元素的列名称的字符串数组。这通常会在 SELECT 语句中返回。
回调函数的返回值应为整数,并且通常全部返回0表示执行成功。如果需要提前终止查询或在回调函数过程中发现错误,可以返回非零值。errmsg
是用于保存 sqlite3_exec()
返回的错误消息的指针。
当函数成功执行 SQL 命令时,将会返回 SQLITE_OK
编码(0),否则将会返回其他错误代码。如果在执行命令时发生错误,则 errmsg
将被设置为一个非空值,其中包含有关错误的详细信息。如果 errmsg
未被设置,则表示该函数执行成功。
3.2 sqlite3_exec()函数应用
3.2.1 使用sqlite3_exec()函数创建表
以下是一个使用 sqlite3_exec()
函数执行 SQL 命令的示例代码:
#include <sqlite3.h>
#include <stdio.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));
sqlite3_close(db);
return 1;
} else {
fprintf(stdout, "Opened database successfully\n");
}
/*创建表的SQL语句*/
char *sql = "CREATE TABLE COMPANY("
"ID INT PRIMARY KEY NOT NULL,"
"NAME TEXT NOT NULL,"
"AGE INT NOT NULL);";
/*执行SQL语句*/
rc = sqlite3_exec(db, sql, 0, 0, &zErrMsg);
if (rc != SQLITE_OK) {
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
printf("Table created successfully\n");
}
/*关闭数据库文件*/
sqlite3_close(db);
return 0;
}
编译命令
gcc -o CreateTable CreateTable.c -lsqlite3
测试
3.2.2 使用sqlite3_exec()函数向表中插入数据
创建好表格以后我们就可以向其添加数据了:
#include <sqlite3.h>
#include <stdio.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));
sqlite3_close(db);
return 1;
} else {
fprintf(stdout, "Opened database successfully\n");
}
/*创建表的SQL语句*/
char *sql = "INSERT INTO COMPANY (ID,NAME,AGE) VALUES (1, '张三', 32);"
"INSERT INTO COMPANY (ID,NAME,AGE) VALUES (2, '李四', 33);"
"INSERT INTO COMPANY (ID,NAME,AGE) VALUES (3, '王五', 30);"
"INSERT INTO COMPANY (ID,NAME,AGE) VALUES (4, '王博', 32);"
"INSERT INTO COMPANY (ID,NAME,AGE) VALUES (5, '李为', 33);"
"INSERT INTO COMPANY (ID,NAME,AGE) VALUES (6, '赵倩', 30);";
/*执行SQL语句*/
rc = sqlite3_exec(db, sql, 0, 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;
}
在上述代码中,需要先调用sqlite3_open()函数打开数据库连接。然后,使用INSERT INTO语句将一条记录插入到"COMPANY"表格中。该记录包含三个字段,分别是"id"、"name"和"age",对应的值分别为1、'张三'和32。最后,通过sqlite3_exec()函数执行SQL语句,并根据返回值判断操作是否成功。
编译命令
gcc -o InsertTable InsertTable.c -lsqlite3
测试
3.2.3 使用sqlite3_exec()函数查询数据
#include <sqlite3.h>
#include <stdio.h>
// 回调函数
int callback(void *data, int argc, char **argv, char **azColName) {
int i;
printf("callback:\n");
for(i = 0; i < argc; i++) {
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}
int main () {
sqlite3 *db;
char *zErrMsg = 0; // 存储错误消息的指针
int rc;
rc = sqlite3_open("test.db", &db);
if (rc != SQLITE_OK) {
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return 1;
}
const char* sql = "SELECT * from COMPANY";
rc = sqlite3_exec(db, sql, callback, NULL, &zErrMsg);
if (rc != SQLITE_OK) {
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
printf("Operation done successfully\n");
}
sqlite3_close(db);
return rc;
}
在此示例中,我们定义了一个回调函数 callback()
,该函数用于处理 sqlite3_exec()
执行结果。
接下来,我们打开一个名为 "test.db" 的 SQLite 数据库连接,并执行 SELECT 命令。
最后,我们通过检查 rc
和 zErrMsg
的返回值,判断查询是否成功并处理执行结果。
编译命令
gcc -o SearchTable SearchTable.c -lsqlite3
测试
3.2.4 void *data的作用是什么?
void *data是sqlite3_exec()函数的第四个参数,它是一个用户定义的指针类型,提供了一个通用的方法来传递额外的数据给回调函数。sqlite3_exec()函数的高级用法
示例代码:
#include <sqlite3.h>
#include <stdio.h>
// 回调函数
int callback(void *data, int argc, char **argv, char **azColName) {
int i;
if(argv[0][0] == '1')
printf("%s\n", (char *)data);
for(i = 0; i < argc; i++) {
printf("%s\t", argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}
int main () {
sqlite3 *db;
char *zErrMsg = 0; // 存储错误消息的指针
int rc;
rc = sqlite3_open("test.db", &db);
if (rc != SQLITE_OK) {
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return 1;
}
char *str = "ID\t名字\t年龄";
char *sql = "SELECT * from COMPANY";
rc = sqlite3_exec(db, sql, callback, str, &zErrMsg);
if (rc != SQLITE_OK) {
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
printf("Operation done successfully\n");
}
sqlite3_close(db);
return rc;
}
编译命令
gcc -o SearchTable2 SearchTable2.c -lsqlite3
测试
四、总结
本文介绍了SQLite3地相关接口并进行了函数示例。