C++操作SQLite資料庫

來源:互聯網
上載者:User
準備工作在使用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
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;}

GB2312到UTF-8的轉換

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;}

這兩個函數會用就行,需要引入windows.h標頭檔我做的一個實戰工程在我的工程中,我將API封裝了一下,便於操作。我建立了一個叫做SQLiteHelper類  標頭檔如下

#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_)


源檔案如下

#include "SQLiteHelper.h"#include <iostream.h>//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////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);}


我的主函數類如下

include <iostream.h>#include <windows.h>#include "sqlite3.h"#include "SQLiteHelper.h"#pragma comment(lib,"sqlite3.lib")//utf-8轉換到GB3212char* 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;}//GB2312到UTF-8的轉換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();}

這裡我講解一下re[(2+1)*col+1]re是指向數組的指標。(2+1)為第3行,1表示第2列。
從中可以看出,我將“張譯成”這個字串讀出了。大家注意,在寫入的時候,如果要寫入中文的話,就要將中文從GB2312轉換到utf-8再寫入,大家根據自己項目的需要,函數我已經給出了。






聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.