//执行类似insert,update,create,drop这些不需要结果的sql语句。
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; }
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; }
下面是一个例子:
#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