亚洲国产精品人久久,亚洲va国产日韩欧美精品色婷婷,久久久久88色偷偷,免费人成黄页在线观看国际

17站長網(wǎng)

17站長網(wǎng) 首頁 數(shù)據(jù)庫 SQLite教程 查看內(nèi)容

深入SQLite基本操作的總結詳解

2023-3-21 15:23| 查看: 2304 |來源: 互聯(lián)網(wǎng)

sqlite提供的是一些C函數(shù)接口,你可以用這些函數(shù)操作數(shù)據(jù)庫。通過使用這些接口,傳遞一些標準 sql 語句(以 char * 類型)給 sqlite 函數(shù),sqlite 就會為你操作 ...

sqlite提供的是一些C函數(shù)接口,你可以用這些函數(shù)操作數(shù)據(jù)庫。通過使用這些接口,傳遞一些標準 sql 語句(以 char * 類型)給 sqlite 函數(shù),sqlite 就會為你操作數(shù)據(jù)庫。sqlite 跟MS的access一樣是文件型數(shù)據(jù)庫,就是說,一個數(shù)據(jù)庫就是一個文件,此數(shù)據(jù)庫里可以建立很多的表,可以建立索引、觸發(fā)器等等,但是,它實際上得到的就是一個文件。備份這個文件就備份了整個數(shù)據(jù)庫。 sqlite 不需要任何數(shù)據(jù)庫引擎,這意味著如果你需要 sqlite 來保存一些用戶數(shù)據(jù),甚至都不需要安裝數(shù)據(jù)庫。

下面開始介紹數(shù)據(jù)庫基本操作。

1、基本流程

(1)關鍵數(shù)據(jù)結構:

sqlite 里最常用到的是 sqlite3 * 類型。從數(shù)據(jù)庫打開開始,sqlite就要為這個類型準備好內(nèi)存,直到數(shù)據(jù)庫關閉,整個過程都需要用到這個類型。當數(shù)據(jù)庫打開時開始,這個類型的變量就代表了你要操作的數(shù)據(jù)庫。下面再詳細介紹。

(2)打開數(shù)據(jù)庫:

int sqlite3_open( 文件名, sqlite3 ** ); 用這個函數(shù)開始數(shù)據(jù)庫操作。需要傳入兩個參數(shù),一是數(shù)據(jù)庫文件名,比如:..//test//testDatabase.db。

文件名不需要一定存在,如果此文件不存在,sqlite 會自動建立它。如果它存在,就嘗試把它當數(shù)據(jù)庫文件來打開。 其中sqlite3 ** 參數(shù)即前面提到的關鍵數(shù)據(jù)結構。這個結構底層細節(jié)如何,你不要關它。

函數(shù)返回值表示操作是否正確,如果是 SQLITE_OK 則表示操作正常。相關的返回值sqlite定義了一些宏。具體這些宏的含義可以參考 sqlite3.h 文件。里面有詳細定義。

(3)關閉數(shù)據(jù)庫:

int sqlite3_close(sqlite3 *); 前面如果用 sqlite3_open 開啟了一個數(shù)據(jù)庫,結尾時不要忘了用這個函數(shù)關閉數(shù)據(jù)庫。

sqlite數(shù)據(jù)庫操作例子

復制代碼 代碼如下:www.CuoXin.com

#include "./sqlite3.h"

int main( int , char** )

{

sqlite3 * db = NULL; //聲明sqlite關鍵結構指針

int result;

//需要傳入 db 這個指針的指針,

//因為 sqlite3_open 函數(shù)要為這個指針分配內(nèi)存,還要讓db指針指向這個內(nèi)存區(qū)

result = sqlite3_open("..//test//testDatabase.db", &db);//打開數(shù)據(jù)庫

if( result != SQLITE_OK )

{

return -1; //數(shù)據(jù)庫打開失敗

}

//數(shù)據(jù)庫操作代碼

//…-

//數(shù)據(jù)庫打開成功

sqlite3_close( db ); //關閉數(shù)據(jù)庫

return 0;

}

這就是一次數(shù)據(jù)庫操作過程。

2、 SQL語句操作(如何用sqlite 執(zhí)行標準 sql 語法)

(1)執(zhí)行sql語句: int sqlite3_exec(sqlite3*, const char *sql, sqlite3_callback, void *, char **errmsg ); 這就是執(zhí)行一條 sql 語句的函數(shù)。

參數(shù)說明:

第1個參數(shù)不再說了,是前面open函數(shù)得到的指針。說了是關鍵數(shù)據(jù)結構。

第2個參數(shù)const char *sql 是一條 sql 語句,以/0結尾。

第3個參數(shù)sqlite3_callback 是回調(diào),當這條語句執(zhí)行之后,sqlite3會去調(diào)用你提供的這個函數(shù)。

第4個參數(shù)void * 是你所提供的指針,你可以傳遞任何一個指針參數(shù)到這里,這個參數(shù)最終會傳到回調(diào)函數(shù)里面,如果不需要傳遞指針給回調(diào)函數(shù),可以填NULL。等下我們再看回調(diào)函數(shù)的寫法,以及這個參數(shù)的使用。

第5個參數(shù)char ** errmsg 是錯誤信息。注意是指針的指針。sqlite3里面有很多固定的錯誤信息。執(zhí)行 sqlite3_exec 之后,執(zhí)行失敗時可以查閱這個指針(直接 printf("%s/n",errmsg))得到一串字符串信息,這串信息告訴你錯在什么地方。sqlite3_exec函數(shù)通過修改你傳入的指針的指針,把你提供的指針指向錯誤提示信息,這樣sqlite3_exec函數(shù)外面就可以通過這個 char*得到具體錯誤提示。

說明:通常,sqlite3_callback 和它后面的 void * 這兩個位置都可以填 NULL。填NULL表示你不需要回調(diào)。比如你做 insert 操作,做 delete 操作,就沒有必要使用回調(diào)。而當你做 select 時,就要使用回調(diào),因為 sqlite3 把數(shù)據(jù)查出來,得通過回調(diào)告訴你查出了什么數(shù)據(jù)。

(2)exec 的回調(diào) :typedef int (*sqlite3_callback)(void*,int,char**, char**); 你的回調(diào)函數(shù)必須定義成上面這個函數(shù)的類型。

sqlite數(shù)據(jù)庫操作例子:

復制代碼 代碼如下:www.CuoXin.com

//sqlite3的回調(diào)函數(shù)

// sqlite 每查到一條記錄,就調(diào)用一次這個回調(diào)

//para是你在 sqlite3_exec 里傳入的 void * 參數(shù)

//通過para參數(shù),你可以傳入一些特殊的指針(比如類指針、結構指針),然后在這里面強制轉換成對應的類型

//(這里面是void*類型,必須強制轉換成你的類型才可用)。然后操作這些數(shù)據(jù)

//n_column是這一條記錄有多少個字段 (即這條記錄有多少列)

//char ** column_value 是關鍵值,查出來的數(shù)據(jù)都保存在這里,實際上是個1維數(shù)組(不要以為是2維數(shù)組),

//每一個元素都是一個 char * 值,是一個字段內(nèi)容(用字符串來表示,以/0結尾)

//char ** column_name 跟 column_value是對應的,表示這個字段的字段名稱

int LoadMyInfo( void * para, int n_column, char ** column_value, char ** column_name )

{

//這里,我不使用 para 參數(shù)。忽略它的存在.

int i;

printf( "記錄包含 %d 個字段/n", n_column );

for( i = 0 ; i < n_column; i ++ )

{

printf( "字段名:%s ?> 字段值:%s/n", column_name[i], column_value[i] );

}

printf( "/n" );

return 0;

}

int main( int , char ** )

{

sqlite3 * db;

int result;

char * errmsg = NULL;

result = sqlite3_open("..//test//testDatabase.db", &db );

if( result != SQLITE_OK )

{

return -1; //數(shù)據(jù)庫打開失敗

}

//數(shù)據(jù)庫操作代碼

//創(chuàng)建測試表,表名叫 MyTable_1,有2個字段: ID 和 name。其中ID是一個自動增加的類型,

//以后insert時可以不去指定這個字段,它會自己從0開始增加

result = sqlite3_exec( db, "create table MyTable_1( ID integer primary key autoincrement, name nvarchar(32) ))", NULL, NULL, errmsg );

if(result != SQLITE_OK )

{

printf("創(chuàng)建表失敗,錯誤碼:%d,錯誤原因:%s/n", result, errmsg );

}

//插入一些記錄

result = sqlite3_exec( db, "insert into MyTable_1( name) values ('走路')", 0, 0, errmsg);

if(result != SQLITE_OK )

{

printf( “插入記錄失敗,錯誤碼:%d,錯誤原因:%s/n”, result, errmsg );

}

result = sqlite3_exec( db,"insert into MyTable_1( name ) values ('騎單車')", 0, 0, errmsg);

if(result != SQLITE_OK )

{

printf("插入記錄失敗,錯誤碼:%d,錯誤原因:%s/n", result, errmsg );

}

result = sqlite3_exec( db, "insert into MyTable_1( name ) values ( '坐汽車')", 0, 0, errmsg );

if(result != SQLITE_OK )

{

printf( "插入記錄失敗,錯誤碼:%d,錯誤原因:%s/n", result, errmsg );

}

result = sqlite3_exec( db, "select * from MyTable_1", LoadMyInfo, NULL, errmsg );//開始查詢數(shù)據(jù)庫 sqlite3_close( db ); //關閉數(shù)據(jù)庫

return 0;

}

通過上面的例子,應該可以知道如何打開一個數(shù)據(jù)庫,如何做數(shù)據(jù)庫基本操作。

(3)不使用回調(diào)查詢數(shù)據(jù)庫

sqlite3_exec 是使用回調(diào)來執(zhí)行 select 操作。還有一個方法可以直接查詢而不需要回調(diào)。但是,我個人感覺還是回調(diào)好,因為代碼可以更加整齊,只不過用回調(diào)很麻煩,你得聲明一個函數(shù),如果這個函數(shù)是類成員函數(shù),你還不得不把它聲明成 static 的(C++成員函數(shù)實際上隱藏了一個參數(shù):this,C++調(diào)用類的成員函數(shù)的時候,隱含把類指針當成函數(shù)的第一個參數(shù)傳遞進去。結果,這造成跟前面說的 sqlite 回調(diào)函數(shù)的參數(shù)不相符。只有當把成員函數(shù)聲明成 static 時,它才沒有多余的隱含的this參數(shù))。雖然回調(diào)顯得代碼整齊,但有時候你還是想要非回調(diào)的 select 查詢。這可以通過 sqlite3_get_table 函數(shù)做到。

int sqlite3_get_table(sqlite3*, const char *sql, char ***resultp, int *nrow, int *ncolumn, char **errmsg );

參數(shù)說明:

第1個參數(shù)不再多說,看前面的例子。

第2個參數(shù)是 sql 語句,跟 sqlite3_exec 里的 sql 是一樣的。是一個很普通的以/0結尾的char *字符串。

第3個參數(shù)是查詢結果,它依然一維數(shù)組(不要以為是二維數(shù)組,更不要以為是三維數(shù)組)。它內(nèi)存布局是:第一行是字段名稱,后面是緊接著是每個字段的值。下面用例子來說事。

第4個參數(shù)是查詢出多少條記錄(即查出多少行)。

第5個參數(shù)是多少個字段(多少列)。

第6個參數(shù)是錯誤信息,跟前面一樣,這里不多說了。

sqlite數(shù)據(jù)庫操作例子:

復制代碼 代碼如下:www.CuoXin.com

int main( int , char ** )

{

sqlite3* db;

int result;

char* errmsg = NULL;

char **dbResult; //是 char ** 類型,兩個*號

int nRow, nColumn;

int i , j;

int index;

result = sqlite3_open("..//test//testDatabase.db", &db );

if( result != SQLITE_OK )

{

return -1; //數(shù)據(jù)庫打開失敗

}

//數(shù)據(jù)庫操作代碼

//假設前面已經(jīng)創(chuàng)建了 MyTable_1 表

//開始查詢,傳入的 dbResult 已經(jīng)是 char **,這里又加了一個 & 取地址符,傳遞進去的就成了 char ***

result = sqlite3_get_table( db, "select * from MyTable_1", &dbResult, &nRow, &nColumn, &errmsg );

if( SQLITE_OK == result ) //查詢成功

{

index = nColumn; //前面說過 dbResult 前面第一行數(shù)據(jù)是字段名稱,從 nColumn 索引開始才是真正的數(shù)據(jù)

printf("查到%d條記錄/n", nRow );

for( i = 0; i < nRow ; i++ )

{

printf( "第 %d 條記錄/n", i+1 );

for( j = 0 ; j < nColumn; j++ )

{

printf("字段名:%s ß> 字段值:%s/n", dbResult[j], dbResult [index]);

// dbResult 的字段值是連續(xù)的,從第0索引到第 nColumn - 1索引都是字段名稱

// 從第 nColumn 索引開始,后面都是字段值,

//它把一個二維的表(傳統(tǒng)的行列表示法)用一個扁平的形式來表示

++index;

}

printf( "/n" );

}

}

//到這里,不論數(shù)據(jù)庫查詢是否成功,都釋放 char** 查詢結果,使用 sqlite 提供的功能來釋放

sqlite3_free_table( dbResult );

sqlite3_close( db );//關閉數(shù)據(jù)庫

return 0;

}

到這個例子為止,sqlite3 的常用用法都介紹完了。 用以上的方法,完全可以應付絕大多數(shù)數(shù)據(jù)庫需求。

3、事務處理

sqlite 是支持事務處理的。如果你知道你要同步刪除很多數(shù)據(jù),不仿把它們做成一個統(tǒng)一的事務。通常一次 sqlite3_exec 就是一次事務,如果你要刪除1萬條數(shù)據(jù),sqlite就做了1萬次:開始新事務->刪除一條數(shù)據(jù)->提交事務->開始新事務->… 的過程。這個操作是很慢的。因為時間都花在了開始事務、提交事務上。你可以把這些同類操作做成一個事務,這樣如果操作錯誤,還能夠回滾事務。事務的操作沒有特別的接口函數(shù),它就是一個普通的 sql 語句而已:

分別如下:

復制代碼 代碼如下:www.CuoXin.com

int result;

result = sqlite3_exec( db, "begin transaction", 0, 0, &zErrorMsg ); //開始一個事務

result = sqlite3_exec( db, "commit transaction", 0, 0, &zErrorMsg ); //提交事務

result = sqlite3_exec( db, "rollback transaction", 0, 0, &zErrorMsg ); //回滾事務

本文最后更新于 2023-3-21 15:23,某些文章具有時效性,若有錯誤或已失效,請在網(wǎng)站留言或聯(lián)系站長:17tui@17tui.com
·END·
站長網(wǎng)微信號:w17tui,關注站長、創(chuàng)業(yè)、關注互聯(lián)網(wǎng)人 - 互聯(lián)網(wǎng)創(chuàng)業(yè)者營銷服務中心

免責聲明:本站部分文章和圖片均來自用戶投稿和網(wǎng)絡收集,旨在傳播知識,文章和圖片版權歸原作者及原出處所有,僅供學習與參考,請勿用于商業(yè)用途,如果損害了您的權利,請聯(lián)系我們及時修正或刪除。謝謝!

17站長網(wǎng)微信二維碼

始終以前瞻性的眼光聚焦站長、創(chuàng)業(yè)、互聯(lián)網(wǎng)等領域,為您提供最新最全的互聯(lián)網(wǎng)資訊,幫助站長轉型升級,為互聯(lián)網(wǎng)創(chuàng)業(yè)者提供更加優(yōu)質的創(chuàng)業(yè)信息和品牌營銷服務,與站長一起進步!讓互聯(lián)網(wǎng)創(chuàng)業(yè)者不再孤獨!

掃一掃,關注站長網(wǎng)微信

大家都在看

熱門排行

最近更新

返回頂部
亚洲国产精品人久久,亚洲va国产日韩欧美精品色婷婷,久久久久88色偷偷,免费人成黄页在线观看国际
日本伊人精品一区二区三区观看方式| 欧美国产精品一区| 丁香婷婷综合激情五月色| 日韩成人一区二区三区在线观看| 亚洲美女一区二区三区| 亚洲视频在线观看三级| 国产精品久久久久四虎| 国产精品久久久99| 亚洲视频免费在线| 一区二区三区色| 亚洲一卡二卡三卡四卡无卡久久 | 欧美福利电影网| 欧美日韩中文国产| 欧美一区永久视频免费观看| 91精品国产欧美日韩| 精品免费视频.| 亚洲国产成人私人影院tom| 国产精品夫妻自拍| 亚洲成人中文在线| 国产精品中文字幕日韩精品| 成人黄色免费短视频| av在线不卡电影| 色综合中文字幕国产| 欧美日韩精品专区| 精品三级av在线| 国产精品美女久久久久aⅴ国产馆| 亚洲视频一二三区| 青草av.久久免费一区| 国产精品99久久久久久有的能看| 91免费观看视频| 欧美videossexotv100| 亚洲欧洲精品一区二区三区| 日本中文字幕一区二区有限公司| 国产aⅴ综合色| 欧美高清视频一二三区| 欧美国产激情一区二区三区蜜月| 亚洲大片免费看| 成人免费看视频| 欧美疯狂做受xxxx富婆| 国产精品免费久久久久| 欧美aaaaaa午夜精品| 91免费在线播放| 久久久久久夜精品精品免费| 午夜精品福利久久久| 成人午夜电影小说| 精品国产污网站| 日韩国产精品久久久久久亚洲| av在线不卡观看免费观看| 久久久久国产一区二区三区四区| 日韩中文字幕1| 91福利视频网站| 中文字幕精品一区| 国产一区二区三区四区五区美女| 欧美性大战久久久久久久| 国产欧美中文在线| 国产一区二区三区综合| 欧美电视剧在线看免费| 日韩电影在线观看电影| 7777精品伊人久久久大香线蕉完整版| 一卡二卡三卡日韩欧美| 波多野结衣在线一区| 久久久久久久久久美女| 国产精品羞羞答答xxdd| 久久久精品2019中文字幕之3| 蜜桃一区二区三区在线观看| 欧美日本在线播放| 日日摸夜夜添夜夜添国产精品| 欧美午夜电影网| 午夜免费久久看| 91精品在线免费| 精品写真视频在线观看| 久久精品日产第一区二区三区高清版| 国产乱码一区二区三区| 国产精品美女视频| 日本丶国产丶欧美色综合| 亚洲国产色一区| 日韩视频永久免费| 国产精品香蕉一区二区三区| 国产精品短视频| 欧美日韩国产123区| 麻豆一区二区在线| 国产精品美女一区二区三区| 欧美视频在线观看一区二区| 日本vs亚洲vs韩国一区三区二区 | 欧美久久高跟鞋激| 久久成人免费日本黄色| 国产精品伦一区二区三级视频| 成人激情av网| 日本亚洲视频在线| 国产精品久久久久一区| 欧美日韩1区2区| 国产69精品久久久久毛片| 亚洲一区二区三区四区在线观看| 日韩三级伦理片妻子的秘密按摩| 成人黄色av电影| 免费成人在线影院| 亚洲欧美另类小说| 26uuu亚洲综合色欧美| 欧洲一区二区三区在线| 国产精品一线二线三线| 视频一区视频二区中文| 136国产福利精品导航| 日韩精品一区二区三区四区| 91成人在线免费观看| 高清国产一区二区| 免费人成精品欧美精品| 一区二区三区在线视频免费 | 亚洲一区在线免费观看| 中文字幕不卡在线播放| 亚洲精品一区二区三区影院| 欧美日韩国产成人在线91| 在线亚洲高清视频| 一本色道a无线码一区v| 成人h动漫精品一区二| 久久精品国产亚洲a| 视频一区二区欧美| 视频一区二区欧美| 日本欧美一区二区三区| 肉色丝袜一区二区| 偷窥国产亚洲免费视频 | 亚洲精品成人悠悠色影视| 欧美国产激情一区二区三区蜜月| 久久午夜羞羞影院免费观看| 精品国产伦一区二区三区观看方式| 欧美丰满嫩嫩电影| 69堂成人精品免费视频| 欧美一区二区三区免费观看视频| 色播五月激情综合网| 丁香一区二区三区| 色综合久久久久久久久久久| 日本高清无吗v一区| 欧美伊人久久久久久午夜久久久久| 欧美在线高清视频| 欧美精品久久久久久久多人混战 | 国产亚洲一区二区三区四区| 国产精品免费观看视频| 亚洲九九爱视频| 亚洲人成人一区二区在线观看| 最近中文字幕一区二区三区| 亚洲综合一区二区三区| 日韩成人dvd| 国产尤物一区二区在线| 99re热视频精品| 欧美高清你懂得| 国产欧美一区二区精品性色超碰| 亚洲欧美综合另类在线卡通| 亚洲超碰精品一区二区| 国产在线不卡一卡二卡三卡四卡| 99久久久久免费精品国产| 欧美日韩精品福利| 国产亚洲成aⅴ人片在线观看| 亚洲精品免费视频| 精品一区二区三区免费观看| 91蜜桃婷婷狠狠久久综合9色| 制服丝袜一区二区三区| 国产精品久久久久一区| 美女在线一区二区| 色欧美乱欧美15图片| 欧美成人精品福利| 一区二区三区欧美日| 国产99久久久国产精品| 欧美麻豆精品久久久久久| 国产精品色哟哟| 蜜臀av国产精品久久久久| 色av一区二区| 国产精品乱子久久久久| 国产一区二区三区在线看麻豆| 欧美日韩在线观看一区二区| 国产精品成人在线观看| 国产在线精品一区二区| 欧美一二三区在线| 依依成人精品视频| 成人国产精品免费| 久久久亚洲综合| 国产麻豆成人传媒免费观看| 91麻豆精品国产自产在线观看一区 | 图片区小说区区亚洲影院| 91视频在线看| 中文久久乱码一区二区| 国产精品一二三四区| ww久久中文字幕| 狠狠色狠狠色综合| 欧美成人国产一区二区| 蜜桃av一区二区| 日韩视频一区二区在线观看| 美腿丝袜亚洲色图| 欧美mv日韩mv亚洲| 国产中文字幕一区| 国产视频一区在线观看| 国产1区2区3区精品美女| 欧美激情自拍偷拍| 99久久99久久精品免费观看| 亚洲人123区| 欧美日韩综合在线免费观看| 五月激情六月综合| 欧美成人video| 成人动漫精品一区二区| 夜夜亚洲天天久久| 日韩欧美一级特黄在线播放| 国产很黄免费观看久久|