SQlite3使用
SQLite3 使用
1、在SQLite官方網站下載SQLite3的源程序,下載地址:
http://www.sqlite.org
2、本文使用下載原碼的方式編譯并使用,也可下載動態庫進行使用
3、將sqlite3.hsqlite3ext.h shell.c加入工程目錄
4、使用:在工程下包含sqlite3.h就可以,代碼如下
#include <iostream>
#include "sqlite3.h"
using namespace std;
int testdb(void);
int main()
{
testdb();
return 0;
}
int testdb(void)
{
sqlite3 *db=NULL;
char *zErrMsg = 0;
int rc;
//打開指定的數據庫文件,如果不存在將創建一個同名的數據庫文件
rc = sqlite3_open("zsl.db", &db);
if( rc )
{
fprintf(stderr, "Can’t open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return (1);
}
else
{
printf("You have opened a sqlite3 database named zsl.db successfully!\n");
}
//創建一個表,如果該表存在,則不創建,
//并給出提示信息,存儲在zErrMsg 中
//char *sql = " CREATE TABLE test(ID INTEGER PRIMARY KEY,PROVINCE INTEGER,LEVEL INTEGER,NAME VARCHAR(12),HOMEDIS REAL);" ;
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(1 , 2 , 4 , 'ji', 3.0);" ;
sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
sql = "INSERT INTO \"test\" VALUES(100 , 92 , 84 , 'li', 9.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); //關閉數據庫
return 0;
}
執行結果:
5、其他
值得注意的地方,在于在使用sqlite3 的時候,你會發現存儲的過程中會出現中文的亂碼,那是因為,SQLite3數據庫默認的編碼格式為UTF-8,所以在使用之前,需要對你的格式進行轉換。
以VC++ MFC為例,如果你的程序使用的是默認Unicode編碼,那么只需要Unicode->UTF-8的轉換,如果你是使用的多字節字符集,那么系統默認的編碼格式應該是Ansi,這時候,你需要將編碼從Ansi轉換到Unicode,然后從Unicode轉換到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,否則可能造成內存泄漏。
智能推薦
Django 提交 form 表單(使用sqlite3保存數據)
優化 提交 form 表單,https://www.cnblogs.com/klvchen/p/10608143.html 創建數據庫的字段,在 models.py 中添加 修改 settings.py 文件 初始化數據庫 修改 urls.py 文件 修改 views.py 文件 啟動 web 服務 瀏覽器訪問 http://127.0.0.1:8888/userInfo...
Sqlite3使用手冊
Sqlite3使用手冊 基于自身需要,開始學習使用sqlite3數據庫,下面放一些基礎但關鍵的操作。 安裝 傻瓜式安裝,直接安裝即可,隨后在命令行中敲擊sqlite3即可喚醒 常用基礎操作 命令 描述 .dump ?TABLE? 以 SQL 文本格式轉儲數據庫。如果指定了 TABLE 表,則只轉儲匹配 LIKE 模式的 TABLE 表。 .databases 列出數據庫的名稱及其所依附的文件。 ....
Coco2dx中sqlite3的使用
當前cocos2dx版本3.17.2 sqlite3 大體上參考這位前輩https://blog.51cto.com/shahdza/1614851 如果自己測試時報這種錯 嚴重性 代碼 說明 項目 文件 行 ...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
猜你喜歡
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...
Linux C系統編程-線程互斥鎖(四)
互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...
統計學習方法 - 樸素貝葉斯
引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...