一、SQLite编程接口
1、sqlite3_open
int sqlite3_open(char *path, sqlite **db)
功能:打开sqlite数据库.
参数:
path 数据库文件路径.
db 数据库操作句柄.
返回值:成功返回0,失败返回错误码(非零值).
2、sqlite_close
int sqlite_close(sqlite3 *db);
功能:关闭sqlite数据库.
参数:
db 数据库操作句柄.
返回值:成功返回0,失败返回错误码(非零值)
3、sqlite3_errmsg
const char *sqlite3_errmsg(sqlite3 *db);
功能:通过db句柄得到数据库操作的错误信息.
参数:
db 数据库操作句柄.
返回值:错误信息的首地址.
4、sqlite3_exec
int sqlite3_exec(sqlite3 *db, const char *sql, int (*callback)(void *, int, char **, char **), void *arg, char **errmsg);
功能:执行一条sql语句.
参数:
db 数据库操作句柄.
sql 一条sql语句.
callback 回调函数,只有sql为查询语句时才执行此语句.
arg 传递给回调函数的参数.
errmsg 错误信息.
返回值:错误信息的首地址.
5、callback
typedef int (*callback)(void *para, int f_num, char **f_value, char **f_name);
功能:每找到一条记录自动执行一次回调函数.
参数:
para 传递给回调函数的参数.
f_num 记录中包含的字段数目.
f_value 包含每个字段值的指针数组.
f_name 包含每个字段名称的指针数组.
返回值:成功返回0,失败返回-1.
6、sqlite3_get_table
int sqlite3_get_table(sqlite3 *db, const char *sql, char ***resultp, int *nrow, int *ncolumn, char **errmsg);
功能:每找到一条记录自动执行一次回调函数.
参数:
db 数据库句柄.
sql SQL语句.
resultp 用来指向sql执行结果的指针.
nrow 满足条件的记录的数目.
ncolumn 每条记录包含的字段数目.
errmsg 错误信息指针的地址.
返回值:成功返回0,失败返回错误码.
二、例程
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
#define DATABASE "stu.db"
/**
* @brief 插入一条记录.
* @param db 数据库操作句柄.
* @return 成功返回0,失败返回-1.
*/
int do_insert(sqlite3 *db)
{
int id;
char name[32] = {};
int score;
char sql[128] = {};
char *errmsg;
printf ("input id:");
scanf ("%d",&id);
getchar ();
printf ("input name:");
scanf ("%s",name);
getchar ();
printf ("input score:");
scanf ("%d",&score);
getchar ();
sprintf (sql, "insert into stu values(%d, '%s', %d)", id, name, score);
if (sqlite3_exec (db, sql, NULL, NULL, &errmsg) != SQLITE_OK) {
printf ("%s\n", errmsg);
return -1;
} else {
printf ("insert done.\n");
}
return 0;
}
/**
* @brief 删除一条记录.
* @param db 数据库操作句柄.
* @return 成功返回0,失败返回-1.
*/
int do_delete(sqlite3 *db)
{
int id;
char sql[128] = {};
char *errmsg;
printf ("input id:");
scanf ("%d",&id);
getchar ();
sprintf (sql, "delete from stu where id=%d",id);
if (sqlite3_exec (db, sql, NULL, NULL, &errmsg) != SQLITE_OK) {
printf ("%s\n", errmsg);
return -1;
} else {
printf ("delete done.\n");
}
return 0;
}
/**
* @brief 更新分数.
* @param db 数据库操作句柄.
* @return 成功返回0,失败返回-1.
*/
int do_update(sqlite3 *db)
{
int id;
int score;
char sql[128] = {};
char *errmsg;
printf ("input id:");
scanf ("%d",&id);
getchar ();
printf ("input score:");
scanf ("%d",&score);
getchar ();
sprintf (sql, "update stu set score=%d where id=%d",score,id);
if (sqlite3_exec (db, sql, NULL, NULL, &errmsg) != SQLITE_OK) {
printf ("%s\n", errmsg);
return -1;
} else {
printf ("update done.\n");
}
return 0;
}
/**
* @brief 每找到一条记录自动执行一次回调函数.
* @param para 传递给回调函数的参数.
* @param f_num 记录中包含的字段数目.
* @param f_value 包含每个字段值的指针数组.
* @param f_name 包含每个字段名称的指针数组.
* @return 成功返回0,失败返回-1.
*/
int callback(void *para, int f_num, char **f_value, char **f_name)
{
int i;
int *arg = (int*)para;
if (*arg == 0) {
for (i=0; i<f_num; i++) {
printf ("%-11s ", f_name[i]);
}
(*arg)++;
}
putchar(10);
for (i=0; i<f_num; i++) {
printf ("%-11s ", f_value[i]);
}
putchar (10);
return 0;
}
/**
* @brief 查询整个表.
* @param db 数据库操作句柄.
* @return 成功返回0,失败返回-1.
*/
int do_query(sqlite3 *db)
{
char sql[128] = {};
char *errmsg;
int arg = 0;
sprintf (sql, "select * from stu");
if (sqlite3_exec (db, sql, callback, &arg, &errmsg) != SQLITE_OK) {
printf ("%s\n", errmsg);
return -1;
} else {
printf ("query done.\n");
}
return 0;
}
/**
* @brief 查询整个表.
* @param db 数据库操作句柄.
* @return 成功返回0,失败返回-1.
*/
int do_query1(sqlite3 *db)
{
char sql[128] = {};
char *errmsg;
char **resultp;
int nrow;
int ncolumn;
int i;
int j;
int index = 0;
sprintf (sql, "select * from stu");
if (sqlite3_get_table (db, sql, &resultp, &nrow, &ncolumn, &errmsg) != SQLITE_OK) {
printf("%s\n",errmsg);
return -1;
} else {
for (i=0; i<=nrow; i++) {
for (j=0; j<ncolumn; j++) {
printf ("%-11s ", resultp[index++]);
}
putchar (10);
}
printf ("query done.\n");
}
return 0;
}
/**
* @brief 主函数.
* @return 成功返回0,失败返回-1.
*/
int main()
{
sqlite3 * db;
char *errmsg;
if (sqlite3_open (DATABASE, &db)) {
printf ("%s\n",sqlite3_errmsg(db));
exit (-1);
} else {
printf ("open %s success.\n", DATABASE);
}
if (sqlite3_exec (db, "create table stu(id Integer, name char, score Integet)", NULL, NULL, &errmsg) != SQLITE_OK) {
printf ("%s\n", errmsg);
} else {
printf ("create table success.\n");
}
int cmd;
while (1) {
printf ("******************************************************\n");
printf ("1:insert 2:delete 3:query 4:update 5:quit.\n");
printf ("******************************************************\n");
scanf ("%d",&cmd);
switch (cmd) {
case 1:
do_insert(db);
break;
case 2:
do_delete(db);
break;
case 3:
//do_query(db);
do_query1(db);
break;
case 4:
do_update(db);
break;
case 5:
sqlite3_close(db);
exit(0);
break;
default:
printf("error cmd.\n");
}
}
return 0;
}