生活随笔
收集整理的這篇文章主要介紹了
C++操作SQLite数据库
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
準備工作
在使用C++操作SQLite之前,需要獲得sqlite3.h,sqlite3.lib,sqlite3.dll,大家可以在這里下載。并將這3個文件導入VC++工程中。其中sqlite3.dll文件放到Debug文件夾里。
SQLite API介紹
int sqlite3_open(char *path,sqlite3 **db)
這個函數打開數據庫,第一個參數為sqlite文件的地址,第二個參數是sqlite3的指針的指針,也就是二級指針。
返回值為SQLITE_OK則成功打開數據庫。
sqlite3_close(sqlite3 *db)
這個函數關閉數據庫,參數是sqlite3的指針。
sqlite3_exec(sqlite3 *db,char *sql,int l,int m,int n)
這個函數執行SQL語句,如果我們不需要返回的結果就用這個函數執行SQL語句。第一個參數是sqlite3的指針,第二個參數為執行的SQL語句,后面3個參數我們不用關心,都設為0。
sqlite3_get_table(sqlite *db,char *sql,char ***result,int *row,int *column,int k);
這個函數執行查詢語句,返回我們所需要的信息。第一個參數是sqlite的指針,第二個參數是SQL語句,第三個參數是返回的信息。row是返回的行數,column是返回的列數,最后一個參數設為0就行了。
因為我們使用的是GB2312,而SQLite使用的是utf-8,所以在使用中會出現中文亂碼,為了解決這個問題,我介紹兩個有用的函數
utf-8轉換到GB3212
[cpp]?view plaincopy
<span?style="font-size:18px;">char*?U2G(const?char*?utf8)?? {?? ?int?len?=?MultiByteToWideChar(CP_UTF8,?0,?utf8,?-1,?NULL,?0);?? ?wchar_t*?wstr?=?new?wchar_t[len+1];?? ?memset(wstr,?0,?len+1);?? ?MultiByteToWideChar(CP_UTF8,?0,?utf8,?-1,?wstr,?len);?? ?len?=?WideCharToMultiByte(CP_ACP,?0,?wstr,?-1,?NULL,?0,?NULL,?NULL);?? ?char*?str?=?new?char[len+1];?? ?memset(str,?0,?len+1);?? ?WideCharToMultiByte(CP_ACP,?0,?wstr,?-1,?str,?len,?NULL,?NULL);?? ?if(wstr)?delete[]?wstr;?? ?return?str;?? }</span>?? GB2312到UTF-8的轉換
[cpp]?view plaincopy
<span?style="font-size:18px;">char*?G2U(const?char*?gb2312)?? {?? ?int?len?=?MultiByteToWideChar(CP_ACP,?0,?gb2312,?-1,?NULL,?0);?? ?wchar_t*?wstr?=?new?wchar_t[len+1];?? ?memset(wstr,?0,?len+1);?? ?MultiByteToWideChar(CP_ACP,?0,?gb2312,?-1,?wstr,?len);?? ?len?=?WideCharToMultiByte(CP_UTF8,?0,?wstr,?-1,?NULL,?0,?NULL,?NULL);?? ?char*?str?=?new?char[len+1];?? ?memset(str,?0,?len+1);?? ?WideCharToMultiByte(CP_UTF8,?0,?wstr,?-1,?str,?len,?NULL,?NULL);?? ?if(wstr)?delete[]?wstr;?? ?return?str;?? }</span>?? 這兩個函數會用就行,需要引入windows.h頭文件
我做的一個實戰工程
在我的工程中,我將API封裝了一下,便于操作。 我新建了一個叫做SQLiteHelper類 ?頭文件如下 [cpp]?view plaincopy
<span?style="font-size:18px;">#if?!defined(AFX_SQLITEHELPER_H__59F8C44E_0D98_4422_AEB1_2FD927EE8902__INCLUDED_)?? #define?AFX_SQLITEHELPER_H__59F8C44E_0D98_4422_AEB1_2FD927EE8902__INCLUDED_?? ?? #if?_MSC_VER?>?1000?? #pragma?once?? #endif?//?_MSC_VER?>?1000?? #include?"sqlite3.h"?? #include?<windows.h>?? class?SQLiteHelper???? {?? public:?? ????SQLiteHelper();?? ????virtual?~SQLiteHelper();?? ????sqlite3?*db;?? ????void?execSQL(char?*sql);?? ????char**rawQuery(char?*sql,int?*row,int?*column,char?**result);?? ????void?openDB(char?*path);?? ????void?closeDB();?? ?? ?????? ?????? ?? ?? };?? ?? #endif?//?!defined(AFX_SQLITEHELPER_H__59F8C44E_0D98_4422_AEB1_2FD927EE8902__INCLUDED_)?? </span>??
源文件如下 [cpp]?view plaincopy
<span?style="font-size:18px;">#include?"SQLiteHelper.h"?? #include?<iostream.h>?? ?? ?? ?? ?? ?? SQLiteHelper::SQLiteHelper()?? {?? ?????? }?? ?? SQLiteHelper::~SQLiteHelper()?? {?? ?? }?? void?SQLiteHelper::execSQL(char?*sql)?? {?? ????sqlite3_exec(db,sql,0,0,0);?? }?? char?**SQLiteHelper::rawQuery(char?*sql,int?*row,int?*column,char?**result)?? {?? ????sqlite3_get_table(db,sql,&result,row,column,0);?? ????return?result;?? }?? void?SQLiteHelper::openDB(char?*path)?? {?? ????int?last=sqlite3_open(path,&db);?? ????if(SQLITE_OK!=last)?? ????{?? ????????cout<<"打開數據庫出錯"<<endl;?? ????????return;?? ????????PostQuitMessage(0);?? ????}?? }?? void?SQLiteHelper::closeDB()?? {?? ????sqlite3_close(db);?? }?? </span>??
我的主函數類如下 [cpp]?view plaincopy
<span?style="font-size:18px;">include?<iostream.h>?? #include?<windows.h>?? #include?"sqlite3.h"?? #include?"SQLiteHelper.h"?? #pragma?comment(lib,"sqlite3.lib")?? ?? char*?U2G(const?char*?utf8)?? {?? ?int?len?=?MultiByteToWideChar(CP_UTF8,?0,?utf8,?-1,?NULL,?0);?? ?wchar_t*?wstr?=?new?wchar_t[len+1];?? ?memset(wstr,?0,?len+1);?? ?MultiByteToWideChar(CP_UTF8,?0,?utf8,?-1,?wstr,?len);?? ?len?=?WideCharToMultiByte(CP_ACP,?0,?wstr,?-1,?NULL,?0,?NULL,?NULL);?? ?char*?str?=?new?char[len+1];?? ?memset(str,?0,?len+1);?? ?WideCharToMultiByte(CP_ACP,?0,?wstr,?-1,?str,?len,?NULL,?NULL);?? ?if(wstr)?delete[]?wstr;?? ?return?str;?? }?? ?? char*?G2U(const?char*?gb2312)?? {?? ?int?len?=?MultiByteToWideChar(CP_ACP,?0,?gb2312,?-1,?NULL,?0);?? ?wchar_t*?wstr?=?new?wchar_t[len+1];?? ?memset(wstr,?0,?len+1);?? ?MultiByteToWideChar(CP_ACP,?0,?gb2312,?-1,?wstr,?len);?? ?len?=?WideCharToMultiByte(CP_UTF8,?0,?wstr,?-1,?NULL,?0,?NULL,?NULL);?? ?char*?str?=?new?char[len+1];?? ?memset(str,?0,?len+1);?? ?WideCharToMultiByte(CP_UTF8,?0,?wstr,?-1,?str,?len,?NULL,?NULL);?? ?if(wstr)?delete[]?wstr;?? ?return?str;?? }?? ?? ?? ?? void?main()?? {?? ?? ????SQLiteHelper?*help=new?SQLiteHelper();?? ????help->openDB("d:\\zhycheng.db3");?? ????char?*sql="insert?into?dota?values(6,'zhycheng')";?? ????help->execSQL(sql);?? ????char?*sql2="select?*?from?dota";?? ????int?row,col;?? ????char?*eee="i";?? ????char?**result=&eee;?? ????char?**re=help->rawQuery(sql2,&row,&col,result);?? ????char?*ll=U2G(re[(2+1)*col+1]);?? ????cout<<ll<<endl;?? ????help->closeDB();?? ?? }</span>?? 這里我講解一下re[(2+1)*col+1] re是指向數組的指針。(2+1)為第3行,1表示第2列。
從中可以看出,我將“張譯成”這個字符串讀出了。大家注意,在寫入的時候,如果要寫入中文的話,就要將中文從GB2312轉換到utf-8再寫入,大家根據自己項目的需要,函數我已經給出了。
from: http://blog.csdn.net/zhy_cheng/article/details/7667734
總結
以上是生活随笔為你收集整理的C++操作SQLite数据库的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。