亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數(shù)據(jù)庫 > SQLite > 正文

用sqlite執(zhí)行標(biāo)準(zhǔn)SQL語法

2024-09-07 00:10:05
字體:
供稿:網(wǎng)友

1. 執(zhí)行sql語句

int sqlite3_exec(sqlite3*, const char *sql, sqlite3_callback, void *, char **errmsg );
這就是執(zhí)行一條 sql 語句的函數(shù)。
第1個參數(shù)不再說了,是前面open函數(shù)得到的指針。說了是關(guān)鍵數(shù)據(jù)結(jié)構(gòu)。
第2個參數(shù)const char *sql 是一條 sql 語句,以/0結(jié)尾。
第3個參數(shù)sqlite3_callback 是回調(diào),當(dāng)這條語句執(zhí)行之后,sqlite3會去調(diào)用你提供的這個函數(shù)。
第4個參數(shù)void * 是你所提供的指針,你可以傳遞任何一個指針參數(shù)到這里,這個參數(shù)最終會傳到回調(diào)函數(shù)里面,這個指針比較重要,可以用來作參數(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)。而當(dāng)你做 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 每查到一條記錄,就調(diào)用一次這個回調(diào)
int LoadMyInfo( void * para, int n_column, char ** column_value, char ** column_name )
{
//para是你在 sqlite3_exec 里傳入的 void * 參數(shù)
//通過para參數(shù),你可以傳入一些特殊的指針(比如類指針、結(jié)構(gòu)指針),然后在這里面強(qiáng)制轉(zhuǎn)換成對應(yīng)的類型(這里面是void*類型,必須強(qiáng)制轉(zhuǎn)換成你的類型才可用)。然后操作這些數(shù)據(jù)
//n_column是這一條記錄有多少個字段 (即這條記錄有多少列)
// char ** column_value 是個關(guān)鍵值,查出來的數(shù)據(jù)都保存在這里,它實際上是個1維數(shù)組(不要以為是2維數(shù)組),每一個元素都是一個 char * 值,是一個字段內(nèi)容(用字符串來表示,以/0結(jié)尾)
//char ** column_name 跟 column_value是對應(yīng)的,表示這個字段的字段名稱
//這里,我不使用 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( “c://Dcg_database.db”, &db );
if( result != SQLITE_OK )
{
//數(shù)據(jù)庫打開失敗
return -1;
}
//數(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 );
}

//開始查詢數(shù)據(jù)庫
result = sqlite3_exec( db, “select * from MyTable_1”, LoadMyInfo, NULL, &errmsg );

//關(guān)閉數(shù)據(jù)庫
sqlite3_close( db );
return 0;
}

通過上面的例子,應(yīng)該可以知道如何打開一個數(shù)據(jù)庫,如何做數(shù)據(jù)庫基本操作。
有這些知識,基本上可以應(yīng)付很多數(shù)據(jù)庫操作了。

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

上面介紹的 sqlite3_exec 是使用回調(diào)來執(zhí)行 select 操作。還有一個方法可以直接查詢而不需要回調(diào)。但是,我個人感覺還是回調(diào)好,因為代碼可以更加整齊,只不過用回調(diào)很麻煩,你得聲明一個函數(shù),如果這個函數(shù) 是類成員函數(shù),你還不得不把它聲明成 static 的(要問為什么?這又是C 基礎(chǔ)了。C 成員函數(shù)實際上隱藏了一個參數(shù):this,C 調(diào)用類的成員函數(shù)的時候,隱含把類指針當(dāng)成函數(shù)的第一個參數(shù) 傳遞進(jìn)去。結(jié)果,這造成跟前面說的 sqlite 回調(diào)函數(shù)的參數(shù)不相符。只有當(dāng)把成員函數(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 );
第1個參數(shù)不再多說,看前面的例子。
第2個參數(shù)是 sql 語句,跟 sqlite3_exec 里的 sql 是一樣的。是一個很普通的以/0結(jié)尾的char *字符串。
第3個參數(shù)是查詢結(jié)果,它依然一維數(shù)組(不要以為是二維數(shù)組,更不要以為是三維數(shù)組)。它內(nèi)存布局是:第一行是字段名稱,后面是緊接著是每個字段的值。下面用例子來說事。
第4個參數(shù)是查詢出多少條記錄(即查出多少行)。
第5個參數(shù)是多少個字段(多少列)。
第6個參數(shù)是錯誤信息,跟前面一樣,這里不多說了。
下面給個簡單例子:

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( “c://Dcg_database.db”, &db );

if( result != SQLITE_OK )
{
//數(shù)據(jù)庫打開失敗
return -1;
}

//數(shù)據(jù)庫操作代碼
//假設(shè)前面已經(jīng)創(chuàng)建了 MyTable_1 表
//開始查詢,傳入的 dbResult 已經(jīng)是 char **,這里又加了一個 & 取地址符,傳遞進(jìn)去的就成了 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] );
index; // dbResult 的字段值是連續(xù)的,從第0索引到第 nColumn - 1索引都是字段名稱,從第 nColumn 索引開始,后面都是字段值,它把一個二維的表(傳統(tǒng)的行列表示法)用一個扁平的形式來表示
}
printf( “-------/n” );
}
}

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

//關(guān)閉數(shù)據(jù)庫
sqlite3_close( db );
return 0;
}

到這個例子為止,sqlite3 的常用用法都介紹完了。
用以上的方法,再配上 sql 語句,完全可以應(yīng)付絕大多數(shù)數(shù)據(jù)庫需求。
但有一種情況,用上面方法是無法實現(xiàn)的:需要insert、select 二進(jìn)制。當(dāng)需要處理二進(jìn)制數(shù)據(jù)時,上面的方法就沒辦法做到。下面這一節(jié)說明如何插入二進(jìn)制數(shù)據(jù)
(2)操作二進(jìn)制

sqlite 操作二進(jìn)制數(shù)據(jù)需要用一個輔助的數(shù)據(jù)類型:sqlite3_stmt * 。
這 個數(shù)據(jù)類型記錄了一個“sql語句”。為什么我把 “sql語句” 用雙引號引起來?因為你可以把 sqlite3_stmt * 所表示的內(nèi)容看成是 sql語句,但是實際上它不是我們所熟知的sql語句。它是一個已經(jīng)把sql語句解析了的、用sqlite自己標(biāo)記記錄的內(nèi)部數(shù)據(jù)結(jié)構(gòu)。
正因為這個結(jié)構(gòu)已經(jīng)被解析了,所以你可以往這個語句里插入二進(jìn)制數(shù)據(jù)。當(dāng)然,把二進(jìn)制數(shù)據(jù)插到 sqlite3_stmt 結(jié)構(gòu)里可不能直接 memcpy ,也不能像 std::string 那樣用 號。必須用 sqlite 提供的函數(shù)來插入。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
精产国品一区二区三区| 久久久久久久久久婷婷| 国产香蕉久久精品综合网| 狠狠色综合久久婷婷| 久久精品国产一区二区三区肥胖| 日韩欧美三区| 久久久精品久久久久特色影视| 国产乱子伦一区二区三区国色天香| 影音先锋在线中文字幕| 精品一区二区在线观看视频| 欧美亚洲在线观看| 日韩av高清在线播放| 成人中文字幕视频| 调教视频免费在线观看| 国产精品久久占久久| 欧美性受xxxx白人性爽| 久久久成人av毛片免费观看| 97一区二区国产好的精华液| 国产精品免费免费| 韩日成人在线| 动漫av免费观看| 成熟老妇女视频| 国产日韩av在线播放| 91tv国产成人福利| 日本一区二区三区视频视频| 在线成人av影院| 99久久精品免费看国产一区二区三区| 成人免费黄色网址| 我的公把我弄高潮了视频| 黄色资源在线看| 亚洲天堂av一区二区三区| 国产精品进线69影院| 亚洲成av人片在线观看www| 精品久久久久久久久久久久久久| 丰满少妇一级片| 欧美精彩一区二区三区| 欧美日韩激情一区| 一级中文字幕一区二区| 亚洲不卡中文字幕| 毛片免费在线播放| 国产乱色国产精品免费视频| 国产欧美一区二区三区四区| 羞羞视频在线观看免费| 日韩电影在线观看一区| 综合视频免费看| 国产精品不卡在线| 青青青国内视频在线观看软件| 国产精品www网站| 亚洲一区二区免费看| 免费人成福利播放| 成人国产精品一区二区| 国产精品一区一区三区| 中文字幕在线观看不卡| 91蜜桃婷婷狠狠久久综合9色| 美女网站久久| 成人亚洲激情网| 丰满放荡岳乱妇91ww| 香蕉av一区| 亚洲欧美日韩精品综合在线观看| 日韩av官网| 免费在线观看一级片| 大桥未久恸哭の女教师| 香蕉久久国产av一区二区| 欧美一区二区三区成人久久片| 成人天堂av| 午夜精品久久久久久久99热影院| 91久久午夜| 一本在线免费视频| 国产91色在线|免| 国产乱了高清露脸对白| 欧美性猛交xxxx乱大交极品| 波多野结衣一区二区三区四区| 97影院秋霞午夜在线观看| 国产精品网站导航| 精品日韩av一区二区| 中文字幕日韩欧美在线| 日韩精品福利网站| 亚洲国产一区二区精品专区| 国产精品多人| 欧美成年人视频网站欧美| 国产视频第一区| 熟女av一区二区| 摸bbb搡bbb搡bbbb| 亚洲欧美激情视频在线观看一区二区三区| 老司机在线看片网av| 丁香六月久久综合狠狠色| 国产91对白在线播放| 婷婷视频在线| 无码人妻一区二区三区精品视频| 国产青青视频| 色无极影院亚洲| 自拍视频一区二区三区| 免费观看的黄色网址| 亚洲一级电影| 成人一级视频| www.av免费| 亚洲AV无码精品国产| 99久久夜色精品国产亚洲| 午夜伦理大片视频在线观看| 欧美精品成人91久久久久久久| 小黄鸭精品aⅴ导航网站入口| 日韩久久免费视频| se视频在线观看| 欧美又大又粗又长| 欧洲av一区二区三区| 国产精品视频免费播放| av福利导福航大全在线| 欧美日韩一级视频| 亚洲精品国产av| 亚洲欧美精品中文第三| 成年人在线观看视频免费| 国产精品chinese| 亚洲精品国产综合区久久久久久久| 国产乱人伦精品一区二区| √8天堂资源地址中文在线| 97精品久久久| 亚洲午夜精品久久久| jizz内谢中国亚洲jizz| 国产精品黑丝在线播放| 亚洲精品18在线观看| 亚洲第一免费视频| 嫩草视频在线免费观看| 男人的天堂视频在线| 亚洲xxxx18| 自拍视频在线看| 国产亚洲欧美精品久久久www| 麻豆精品av| av高清在线观看| 色悠久久久久综合网小说| 激情都市一区二区| 91丨porny丨蝌蚪视频| 国产亚洲aⅴaaaaaa毛片| 国产又爽又黄的激情精品视频| 日本a视频在线观看| 欧美激情免费在线| 日韩欧美在线综合| 国产调教一区二区三区| 精品无码av无码免费专区| 99精品欧美一区二区蜜桃免费| 亚洲一区二区三区网站| 日韩av在线看| 国产97人人超碰caoprom| 一级黄色免费毛片| 久久超碰97人人做人人爱| 成人涩涩小片视频日本| 人人爽人人av| 成人一级生活片| 五月婷婷久久综合| 大片在线观看网站免费收看| 激情五月综合色婷婷一区二区| 91麻豆精品国产91久久久久推荐资源| 欧美艹逼视频| ckplayer中文字幕| 黄色免费av网站| 91社区在线高清| 欧美性色aⅴ视频一区日韩精品| 久久无码专区国产精品s| 免费看裸体网站| 99精品一级欧美片免费播放| 国产 日韩 欧美 综合 一区| 欧美专区日韩专区| 夜先锋资源站| jizz18女人| 亚洲高潮女人毛茸茸| 男人操女人免费| 国产777精品精品热热热一区二区| 俄罗斯精品一区二区三区| 亚洲精品国产综合区久久久久久久| 在线观看黄网| 国产不卡一卡2卡三卡4卡5卡在线| 一区二区视频免费看| 亚洲天堂视频在线观看免费| 国产在线精品成人一区二区三区| 日韩精品在线播放视频| 欧美性受ⅹ╳╳╳黑人a性爽| h在线视频免费观看完整版| 网友自拍视频在线| 免费观看在线综合| 成年人免费在线视频| 日韩色级片先锋影音| 日韩高清精品免费观看| 啊啊啊一区二区| 国产视频网站一区二区三区| 亚洲成人先锋电影| 国产精品v日韩精品| 国产精品白浆| 中文无码av一区二区三区| 亚洲欧洲精品在线观看| 中国一级特黄录像播放| 国产91欧美| 在线精品免费视| sis001欧美| 天天干夜夜干| 黄色三级视频在线| 99久久99久久免费精品小说| 久草福利在线| 国产视频2区| 精品国产一区探花在线观看| 91视频www| 久久精品一区二区三区资源网| 夜夜嗨av色综合久久久综合网| 久久夜色精品国产噜噜av小说| 日本在线观看视频一区| 久久综合九色综合久99| 国产不卡视频| 日本不卡一二三区黄网| 免费看欧美黑人毛片| 奇米四色中文综合久久| 婷婷激情四射五月天| 欧美一级一级性生活免费录像| 欧洲专线二区三区| 精品国产一区二区三区香蕉沈先生| 欧美日韩一区二区精品| 亚洲欧洲日产国码二区| 国产成人美女视频| 91综合久久一区二区| 亚洲欧美视频在线| 国产肥白大熟妇bbbb视频| 高清一区二区视频| 国产网站免费观看| 小黄文在线观看| 中文字幕在线播放不卡一区| 国产福利一区在线| 精品久久av| 婷婷久久久久久| 国产一级二级视频| 亚洲激情在线播放| 日韩视频不卡中文| 三级男人添奶爽爽爽视频| 91精品啪在线观看国产爱臀| 午夜精品无码一区二区三区| 欧美孕妇孕交xxⅹ孕妇交| 亚洲男人天堂色| 久久久久久久久网站| 日韩精品高清不卡| 国产精品久久久久久久浪潮网站| 蜜桃免费在线视频| 国产精品㊣新片速递bt| 久久亚洲综合av| 99在线欧洲视频| 人妻无码中文字幕| 久久精品人人做人人爽人人| 制服 丝袜 综合 日韩 欧美| 欧美色图欧美色图| 亚洲资源网你懂的| 欧美老女人性开放| 九九在线观看免费视频| 青青青青国产视频| 中文字幕日本最新乱码视频| 国产精品91一区二区三区| 国产毛片毛片毛片毛片| 日韩电影一区二区三区四区| 一本一道综合狠狠老| 国产乱码精品一区二区亚洲| 日韩美女视频免费看| 日韩欧美亚洲区| 揉丰满老妇老女人的毛片| 在线观看国产91| 乱亲女h秽乱长久久久| 姬川优奈aav一区二区| 亚洲高清在线观看一区| 欧美成人亚洲高清在线观看| 91精品国产高清一区二区三密臀| 成人精品水蜜桃| 91人人澡人人爽人人精品| 人人干人人干人人| 久久精品国产精品亚洲| 亚洲电影一二三区| 欧美一级片网址| 亚洲午夜免费| 视频在线99| 一区二区电影免费观看| 天堂在线视频中文网| 日韩av午夜在线观看| 黄色小视频在线免费看| 精品国产欧美一区二区五十路| 国产a∨精品一区二区三区仙踪林| 亚洲精品欧美综合四区| 国产免费嫩草影院| 亚洲色图五月天| 涩涩视频网站| 欧美视频四区| 猫咪在线永久网站| 影音先锋在线一区| 国产精品久久国产愉拍| 免费a漫导航| 欧美办公室脚交xxxx| 欧美不卡123| 成人免费视频caoporn| 欧美一区2区视频在线观看| 亚洲国产成人va在线观看天堂| 真人抽搐一进一出视频| 国产精品成人免费一区二区视频| 国产91综合一区在线观看| 天堂av电影在线观看| 首页亚洲欧美制服丝腿| 欧美日韩国产欧美日美国产精品| 一本久道久久综合婷婷鲸鱼| 热舞福利精品大尺度视频| 色爱区成人综合网| 成人免费影院| 一级黄色av片| 精品视频成人| 国产1区2区3区中文字幕| 日韩av一二三四区| 午夜看片在线免费| 嗯啊主人调教在线播放视频| 中文字幕乱伦视频| 红桃av在线播放| 久久久久国产精品区片区无码| 国产精品嫩草视频| 国产成人三级| 人妻激情偷乱频一区二区三区| 黄色一级片在线免费观看| 日韩欧美二区| 欧美老肥婆性猛交视频| 伊人av综合网| 网曝门事件国产精品二区| 欧美色图在线播放| 在线欧美一区二区| 日本久久一二三四| 毛片毛片女人毛片毛片| 亚洲福利二区| 91成人抖音| 图片区乱熟图片区亚洲| 亚洲v日本v欧美v久久精品| 亚洲欧美日韩国产成人精品影院| 毛片网站在线看|