QT 使用sqlite3 API 的增删改查。sqlite3_close SQLITE_BUSY问题

必须使用 sqlite3_finalize(sqlite3_stmt *pStmt);这是为sqlite3_prepare语句使用这个函数去销毁以防止内存泄露。如果不使用,则返回值为(SQLITE_BUSY)5,且下一次无法写入数据库数据,只能读

QT添加sqlite3库及头文件,在.pro文件中加入链接.so及.h文件,路径需一致。例:

unix:!macx: LIBS += -L ./ -lsqlite3
INCLUDEPATH += ./

在有则打开,无则新建数据库。用int sqlite3_open(const char *filename  ,   sqlite3 **ppDb );例:

    int       rc;
    sqlite3  *db=nullptr;
    sqlite3_stmt * pStmt = NULL;

    rc = sqlite3_open( "test.db" ,  &db);
    if( rc) {
        qDebug(" Can't  open  database :%s\n" , sqlite3_errmsg(db));
        ALOGE(" Can't  open  database :%s\n" , sqlite3_errmsg(db));
        sqlite3_close(db);
        exit(1);
    }

关闭数据库。用int  rc=sqlite3_close(sqlite3 **ppDb );例:

   int       rc=sqlite3_close(db) ;

创建表及增、删、改都用int sqlite3_exec(sqlite3*,  const char *sql,  int (*callback)(void*,int,char**,char**),  void *,  char **errmsg);

创建表-例:

     char    *zErr ;
    int       rc;
    char    *sql;

    sql="create table TestTable1(name text ,age text) ";
    rc = sqlite3_exec(db ,  sql, NULL ,  NULL , &zErr ) ;

    sql="create table TestTable2(sex text ,year text) ";
    rc = sqlite3_exec(db ,  sql, NULL ,  NULL , &zErr ) ;
  

增加内容-例:

    char    *error ;
    int       rc;
    char    *sql;
sql = "insert  into TestTable1 values ('xiaoming','12' )";
    rc = sqlite3_exec(db ,  sql, NULL ,  NULL , &error ) ;

删除加内容-例:

    char    *error ;
    int       rc;
    char    *sql;
sql = "delete from TestTable1 where name='xiaoming'";
    rc = sqlite3_exec(db ,  sql, NULL ,  NULL , &error ) ;

更改内容-例:

    char    *error ;
    int       rc;
    char    *sql;
sql = "update TestTable1 set name='zhangsan' where name='xiaoming'";
    rc = sqlite3_exec(db ,  sql, NULL ,  NULL , &error ) ;

查找,并打印数据,查找完成后,必须使用 sqlite3_finalize(sqlite3_stmt *pStmt);这是为sqlite3_prepare语句使用这个函数去销毁以防止内存泄露。如果不使用,则返回值为5,下一次无法写入数据库数据

    int       rc;
    char    *sql;
    char  buf1[20],buf2[20];
 
    sql= "select * from TestTable1 where name='xiaoming'";
    rc = sqlite3_prepare_v2(db ,  sql, -1 ,  &pStmt , NULL ) ;

    if(rc == SQLITE_OK)
        while (sqlite3_step(pStmt) == SQLITE_ROW)
        {
            qDebug()<<"name:"<<(const char*)sqlite3_column_text(pStmt, 0);
            qDebug()<<"age:"<<(const char*)sqlite3_column_text(pStmt, 1);
        }
     sqlite3_finalize(pStmt);

 

 

 

 

你可能感兴趣的:(QT,技术笔记)