VC++、MFC Sqlite3數據庫的使用


SQLite數據庫是一種本地的輕型數據庫,在存儲一些本地的數據的時候,或者不需要用到Oracle,SQL2008之類的大型數據庫的時候,Sqlite的優勢就能夠得到發揮。程序需要采集數據存儲起來,可以使用這個數據庫。或者覺得ini文件,txt文件在存儲的過程中,數據的組織比較困難可以使用這個數據庫。

同時如果是涉及嵌入式系統,SQLite的便捷性能夠得到更好的體現。他將所有的方法都包含在了三個文件中:

sqlite3.h

sqlite3.c

sqlite3ext.h

附下載地址:鏈接:http://pan.baidu.com/s/1qYawfFY 密碼:l7fq

地址失效可以私信。

在使用的過程中,最簡單的辦法是,你可以直接將三個文件全部添加到相應的工程中,在引用頭文件之后,你就可以使用其中的方法了。

其中的增刪改查可以參考如下代碼使用:但是要注意自己應該添加和完善一些功能

sqlite3 *db=NULL;

    char *zErrMsg = 0;

    int rc;
    //打開指定的數據庫文件,如果不存在將創建一個同名的數據庫文件
    rc = sqlite3_open("zsl.db", &db);

    if( rc )

    {
        CString temp1;
        temp1.Format(_T("Can’t open database: %s\n"), sqlite3_errmsg(db));
        TRACE(temp1);
        //fprintf(stderr, "Can’t open database: %s\n", sqlite3_errmsg(db));

        sqlite3_close(db);

        return (1);

    }

    else

        TRACE("You have opened a sqlite3 database named zsl.db successfully!\n");



    //創建一個表,如果該表存在,則不創建,

    //並給出提示信息,存儲在zErrMsg 中

    char *sql = " CREATE TABLE test(ID INTEGER PRIMARY KEY,AGE INTEGER,LEVEL INTEGER,NAME VARCHAR(12),SALARY REAL);" ;

    sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );



    //插入數據

    sql = "INSERT INTO \"test\" VALUES(NULL , 1 , 1 , '200605011206', 18.9 );" ;

    sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );

    int nrow = 0, ncolumn = 0; //查詢結果集的行數、列數

    char **azResult; //二維數組存放結果



    //查詢數據

    sql = "SELECT * FROM test ";

    sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );

    int i = 0 ;

    printf( "row:%d column=%d \n" , nrow , ncolumn );

    printf( "\nThe result of querying is : \n" );

    for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ )

        printf( "azResult[%d] = %s\n", i , azResult[i] );



    //刪除數據

    sql = "DELETE FROM test WHERE AGE = 1 ;" ;

    sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );

    //釋放掉azResult 的內存空間

    sqlite3_free_table( azResult );

    sqlite3_close(db); //關閉數據庫

    int c=getchar();
    return 0;
}

值得注意的地方,在於在使用sqlite3 的時候,你會發現存儲的過程中會出現中文的亂碼,那是因為,SQLite3數據庫默認的編碼格式為UTF-8,所以在使用之前,需要對你的格式進行轉換。

以VC++ MFC為例,如果你的程序使用的是默認Unicode編碼,那么只需要Unicode->UTF-8的轉換,如果你是使用的多字節字符集,那么系統默認的編碼格式應該是Ansi,這時候,你需要將編碼從Ansi轉換到Unicode,然后從Unicode轉換到UTF-8。

因為我的工程中使用的多字節,所以我這里先貼出一個Ansi轉換為UTF-8的代碼:

//Ansi To Utf-8 Utf-8 To Ansi
char* *****::AnsiToUtf8(char* stransi)
{
    //Ansi to Unicode
    int wcsLen = ::MultiByteToWideChar(CP_ACP,NULL,stransi,strlen(stransi),NULL,0);
    wchar_t* strunicode = new wchar_t[wcsLen+1];
    ::MultiByteToWideChar(CP_ACP,NULL,stransi,strlen(stransi),strunicode,wcsLen);
    strunicode[wcsLen] = '\0';
    //Unicode To UTF-8
    int utf8len = ::WideCharToMultiByte(CP_UTF8,NULL,strunicode,wcslen(strunicode),NULL,0,NULL,NULL);
    char* strutf8 = new char[utf8len+1];
    ::WideCharToMultiByte(CP_UTF8,NULL,strunicode,wcslen(strunicode),strutf8,utf8len,NULL,NULL);
    strutf8[utf8len] = '\0';
    
    delete [] strunicode;
    strunicode = NULL;
    return strutf8;

}
char* ***::Utf8ToAnsi(char* strutf8)
{
    //UTF-8 To Unicode
    
    int wlen = ::MultiByteToWideChar(CP_UTF8,NULL,strutf8,strlen(strutf8),NULL,0);
    wchar_t* strunicode = new wchar_t[wlen+1];
    ::MultiByteToWideChar(CP_UTF8,NULL,strutf8,strlen(strutf8),strunicode,wlen);
    strunicode[wlen] = '\0';
    
    //Unicode To Ansi
    int    ansilen = ::WideCharToMultiByte(CP_ACP,NULL,strunicode,wcslen(strunicode),NULL,0,NULL,NULL);
    char* szAnsi = new char[ansilen+1];
    ::WideCharToMultiByte(CP_ACP,NULL,strunicode,wcslen(strunicode),szAnsi,ansilen,NULL,NULL);
    szAnsi[ansilen] = '\0';
    delete [] strunicode;
    strunicode = NULL;
    return szAnsi;
}

注意這段代碼中,使用了2個new,但是只delete了一個,這里需要你在使用完成轉換后的字符串,進行手動delete,否則可能造成內存泄漏。。

 

轉換完成之后的顯示,中文就不是亂碼。

最后附上一個工具,用來查看sqlite的數據庫的內容,但是因為我的電腦上的安裝包沒有了,所以這里只留下一個名字好了,等到之后有機會再補上鏈接。

名字:Navicat premium 以及他的補丁

圖標是這樣的:

打開之后就可以查看你創建的SQLite數據庫的文件,很方便可以檢查你代碼的正確或者錯誤

連接補完計划:

鏈接:http://pan.baidu.com/s/1pKELaSb 密碼:icay

失效私信我,或者郵箱452875117@qq.com

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM