sqlite講解二

sqlite 編程接口sql

  • 數據庫的打開和關閉 數據庫

     

 

    int sqlite3_open(constchar*, sqlite3**);
    int sqlite3_close(sqlite3*);編程

    
    sqlite3爲一個結構,它代指一個數據庫鏈接,以後調用的大部分API函數都須要使用它做爲其中一個參數。sqlite3_open的第一個參數爲文件名字符串。兩個函數都是成功返回SQLITE_OK,失敗返回錯誤碼。可使用sqlite3_errmsg函數得到錯誤描述:

函數

    constchar*sqlite3_errmsg(sqlite3*); 
spa

 

  • 數據庫操做-執行SQL語句指針

    

    int sqlite3_prepare(sqlite3*,constchar*,int, sqlite3_stmt**,
orm

                                                            constchar**);
    int sqlite3_finalize(sqlite3_stmt*);
    int sqlite3_reset(sqlite3_stmt*);sqlite


    sqlite3_stmt結構代指一條SQL語句,上述三個函數的功能就是建立、銷燬和重置sqlite3_stmt結構。sqlite3_prepare函數的第二個參數爲SQL語句字符串,第三個參數爲字符串長度。若是傳入的SQL語句字符串超出了一條SQL語句,則第五個參數返回SQL語句字符串中指向下一條SQL語句的char指針。SQL語句字符串能夠帶?號,它是SQL語句中的不肯定部分,須要對它另外賦值。

接口

    int sqlite3_bind_text(sqlite3_stmt*,int,constchar*,int n,                                                                        void(*)(void*));
內存


    sqlite3_bind_*系列函數有好多,這裏只對sqlite3_bind_text進行一下說明,sqlite3_bind_text的第二個參數爲序號(從1開始),第三個參數爲字符串值,第四個參數爲字符串長度。sqlite3_bind_text的第五個參數爲一個函數指針,SQLITE3執行完操做後回調此函數,一般用於釋放字符串佔用的內存。(這個函數指針參數具體怎麼使用,我如今還不清楚)。此參數有兩個常數,SQLITE_STATIC告訴sqlite3_bind_text函數字符串爲常量,能夠放心使用;而SQLITE_TRANSIENT會使得sqlite3_bind_text函數對字符串作一份拷貝。通常使用這兩個常量參數來調用sqlite3_bind_text。
    statement準備好了之後,就是操做的執行了。

    int sqlite3_step(sqlite3_stmt*);

    
    它的返回值相對有些特殊。返回SQLITE_BUSY表示暫時沒法執行操做,SQLITE_DONE表示操做執行完畢,SQLITE_ROW表示執行完畢而且有返回(執行select語句時)。當返回值爲SQLITE_ROW時,咱們須要對查詢結果進行處理,SQLITE3提供sqlite3_column_*系列函數。

    constunsignedchar*sqlite3_column_text(sqlite3_stmt*,int iCol);


    其中參數iCol爲列的序號,從0開始。若是返回值有多行,則能夠再次調用sqlite3_step函數,而後由sqlite3_column_*函數取得返回值。


    使用上述這些函數基本上能夠完成對SQLITE3數據庫的操做了(不過我這裏只針對text數據類型作了說明)。固然,sqlite3還有不少其它的接口函數,之後再慢慢摸索吧,如今只是剛開始。

    下面是一段示例代碼:


#include<stdio.h>
#include"sqlite3.h"


int main(){
     sqlite3 *db;
    char*zErrMsg =NULL;
    int rv;
    char szSql[128]={ 0 };
     sqlite3_stmt *stmt;

     rv = sqlite3_open("test.db",&db);
    if( rv ){
        fprintf(stderr,"Can't open database: %s\n", sqlite3_errmsg(db));
         sqlite3_close(db);
        return 1;
      }
     else
        fprintf(stderr,"sqlite3_open OK\n");

    //這裏查詢時,假定數據庫中存在表test,而且有一列爲COL1(text類型)

    strcpy(szSql,"SELECT COL1 FROM test where COL1=?");
     rv = sqlite3_prepare(db, szSql, 128,&stmt,NULL);
    if( rv != SQLITE_OK ){
        fprintf(stderr,"sqlite3_prepare(%d): %s\n", rv, sqlite3_errmsg(db));
        return-1;
    }
    
    rv = sqlite3_bind_text(stmt, 1, "VALUE1",strlen("VALUE1"), SQLITE_STATIC);
    if( rv != SQLITE_OK ){
        fprintf(stderr,"sqlite3_bind_text(%d): %s\n", rv, sqlite3_errmsg(db));
        return-1;
    }

     rv = sqlite3_step(stmt);
    if((rv != SQLITE_OK)&&(rv != SQLITE_DONE)&&(rv != SQLITE_ROW)){
        fprintf(stderr,"sqlite3_step(%d): %s\n", rv, sqlite3_errmsg(db));
        return-1;
    }


    while( rv == SQLITE_ROW ){
        fprintf(stderr,"result: %s\n", sqlite3_column_text(stmt,0));
         rv = sqlite3_step(stmt);
    }


    rv = sqlite3_finalize(stmt);
    if( rv != SQLITE_OK ){
        fprintf(stderr,"sqlite3_finalize(%d): %s\n", rv, sqlite3_errmsg(db));
        return-1;
    }


    sqlite3_close(db);    return 0;}

相關文章
相關標籤/搜索