C语言封装sqlite3_API
2016-04-26 15:12
381 查看
//执行类似insert,update,create,drop这些不需要结果的sql语句。
//执行select查询语句
调用规则:
executeNoQuery:
只需传入数据库连接,和想要执行的sql语句
executeWithQuery:除了需要传入数据库连接,以及最后一个参数sql语句,还需要传入char **array,和int ncol的地址
下面是一个例子:
注意:
调用完executeWithQuery之后,记得释放array
int executeNoQuery(sqlite3 *db,const char *sql) { sqlite3_stmt *pstmt = NULL; if(sqlite3_prepare_v2(db,sql,strlen(sql),&pstmt,NULL) != SQLITE_OK) { if(pstmt != NULL) sqlite3_finalize(pstmt); fprintf(stderr,"%s\n",sqlite3_errmsg(db)); return -1; } if(sqlite3_step(pstmt) != SQLITE_DONE) { sqlite3_finalize(pstmt); fprintf(stderr,"%s\n",sqlite3_errmsg(db)); return -1; } if(pstmt != NULL) sqlite3_finalize(pstmt); return 0; }
//执行select查询语句
void executeWithQuery(sqlite3 *db,char ***result,int *col,const char *sql) { int ret,row; char *errMsg; ret = sqlite3_get_table(db,sql,result,&row,col,&errMsg); if(ret != SQLITE_OK) { fprintf(stderr,"%s\n",errMsg); sqlite3_free(errMsg); return; } (*result)[(row+1)*(*col)] = NULL; return; }
调用规则:
executeNoQuery:
只需传入数据库连接,和想要执行的sql语句
executeWithQuery:除了需要传入数据库连接,以及最后一个参数sql语句,还需要传入char **array,和int ncol的地址
下面是一个例子:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sqlite3.h> #define PRINTERROR(str) \ do{ \ perror(str);\ exit(EXIT_FAILURE); \ }while(0) const char *createSQL = "create table if not exists T_Students\ (S_id integer PRIMARY KEY NOT NULL,\ S_name varchar(128),S_age integer,\ Time TimeStamp NOT NULL DEFAULT (datetime('now','localtime')));"; const char *deleteSQL = "delete from T_Students where S_name='sagarfan';"; const char *updateSQL = "update T_Students set S_age=25 where S_name='sagarfan';"; const char *insertSQL = "insert into T_Students (S_name,S_age) values('sagarfan',23);"; const char *selectSQL = "select S_name,S_age from T_Students;"; int executeNoQuery(sqlite3 *db,const char *sql); int executeWithQuery(sqlite3 *db,char ***result,int *col,const char *sql); int main() { sqlite3 *conn = NULL; int i,ret,ncol;char sql[1024]={0}; char **array; ret = sqlite3_open("stu.sqlite",&conn); if(ret != SQLITE_OK) PRINTERROR(sqlite3_errmsg(conn)); //create table ret = executeNoQuery(conn,createSQL); if(ret == -1) PRINTERROR(sqlite3_errmsg(conn)); ret = executeNoQuery(conn,insertSQL); if(ret == -1) PRINTERROR(sqlite3_errmsg(conn)); ret = executeWithQuery(conn,&array,&ncol,selectSQL); if(ret == -1) PRINTERROR(sqlite3_errmsg(conn)); i=0; while(array[i+ncol] != NULL) { printf("Name=%s\n",array[i+ncol]); printf("Age=%s\n",array[i+1+ncol]); i+=ncol; } sqlite3_free_table(array); ret = executeNoQuery(conn,updateSQL); if(ret == -1) PRINTERROR(sqlite3_errmsg(conn)); if(conn != NULL) sqlite3_close(conn); return 0; } int executeNoQuery(sqlite3 *db,const char *sql) { sqlite3_stmt *pstmt = NULL; if(sqlite3_prepare_v2(db,sql,strlen(sql),&pstmt,NULL) != SQLITE_OK) { if(pstmt != NULL) sqlite3_finalize(pstmt); return -1; } if(sqlite3_step(pstmt) != SQLITE_DONE) { sqlite3_finalize(pstmt); return -1; } sqlite3_finalize(pstmt); return 0; } int executeWithQuery(sqlite3 *db,char ***result,int *col,const char *sql) { int ret,row; ret = sqlite3_get_table(db,sql,result,&row,col,NULL); if(ret != SQLITE_OK) { return -1; } (*result)[(row+1)*(*col)] = NULL; return 0; }
注意:
调用完executeWithQuery之后,记得释放array
相关文章推荐
- C/C++复习:分数减法(结构体)
- C++字符串
- 链表实现队列 C++实现
- C/C++复习:学生信息排序(结构体)
- Windows下pip安装包报错:Microsoft Visual C++ 9.0 is required Unable to find vcvarsall.bat
- 大数乘法 - 大数作为字符串的C语言操作
- c++第四次上级实验——分数求和
- C++使用Sqlite3,使用CppSQLite3的封装
- c语言中const关键字详解
- c++ 趣味小程序
- C 语言中指针、字符串与数组的一些关系
- c语言 #define 中的UL
- extern "C" c++如何实现函数的重载
- C++多态性
- C++封装继承多态总结
- C++多维数组
- 1054. 求平均值 (20)
- C/C++中的sizeof
- C++数组
- js to c++!鼠标点击事件!