日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 數據庫 > SQLite > 正文

用sqlite執行標準SQL語法

2024-09-07 00:10:05
字體:
來源:轉載
供稿:網友

1. 執行sql語句

int sqlite3_exec(sqlite3*, const char *sql, sqlite3_callback, void *, char **errmsg );
這就是執行一條 sql 語句的函數。
第1個參數不再說了,是前面open函數得到的指針。說了是關鍵數據結構。
第2個參數const char *sql 是一條 sql 語句,以/0結尾。
第3個參數sqlite3_callback 是回調,當這條語句執行之后,sqlite3會去調用你提供的這個函數。
第4個參數void * 是你所提供的指針,你可以傳遞任何一個指針參數到這里,這個參數最終會傳到回調函數里面,這個指針比較重要,可以用來作參數的傳遞。如果不需要傳遞指針給回調函數,可以填NULL。等下我們再看回調函數的寫法,以及這個參數的使用。
第5 個參數char ** errmsg 是錯誤信息。注意是指針的指針。sqlite3里面有很多固定的錯誤信息。執行 sqlite3_exec 之后,執行失敗時可以查閱這個指針(直接 printf(“%s/n”,errmsg))得到一串字符串信息,這串信息告訴你錯在什么地方。sqlite3_exec函數通過修改你傳入的指針的指 針,把你提供的指針指向錯誤提示信息,這樣sqlite3_exec函數外面就可以通過這個 char*得到具體錯誤提示。
說明:通常, sqlite3_callback 和它后面的 void * 這兩個位置都可以填 NULL。填NULL表示你不需要回調。比如你做 insert 操作,做 delete 操作,就沒有必要使用回調。而當你做 select 時,就要使用回調,因為 sqlite3 把數據查出來,得通過回調告訴你查出了什么數據。

2.exec 的回調

typedef int (*sqlite3_callback)(void*,int,char**, char**);
你的回調函數必須定義成上面這個函數的類型。下面給個簡單的例子:
// sqlite 每查到一條記錄,就調用一次這個回調
int LoadMyInfo( void * para, int n_column, char ** column_value, char ** column_name )
{
//para是你在 sqlite3_exec 里傳入的 void * 參數
//通過para參數,你可以傳入一些特殊的指針(比如類指針、結構指針),然后在這里面強制轉換成對應的類型(這里面是void*類型,必須強制轉換成你的類型才可用)。然后操作這些數據
//n_column是這一條記錄有多少個字段 (即這條記錄有多少列)
// char ** column_value 是個關鍵值,查出來的數據都保存在這里,它實際上是個1維數組(不要以為是2維數組),每一個元素都是一個 char * 值,是一個字段內容(用字符串來表示,以/0結尾)
//char ** column_name 跟 column_value是對應的,表示這個字段的字段名稱
//這里,我不使用 para 參數。忽略它的存在.
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 )
{
//數據庫打開失敗
return -1;
}
//數據庫操作代碼
//創建一個測試表,表名叫 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( “創建表失敗,錯誤碼:%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 );

//關閉數據庫
sqlite3_close( db );
return 0;
}

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

3. 不使用回調查詢數據庫

上面介紹的 sqlite3_exec 是使用回調來執行 select 操作。還有一個方法可以直接查詢而不需要回調。但是,我個人感覺還是回調好,因為代碼可以更加整齊,只不過用回調很麻煩,你得聲明一個函數,如果這個函數 是類成員函數,你還不得不把它聲明成 static 的(要問為什么?這又是C 基礎了。C 成員函數實際上隱藏了一個參數:this,C 調用類的成員函數的時候,隱含把類指針當成函數的第一個參數 傳遞進去。結果,這造成跟前面說的 sqlite 回調函數的參數不相符。只有當把成員函數聲明成 static 時,它才沒有多余的隱含的this參數)。
雖然回調顯得代碼整齊,但有時候你還是想要非回調的 select 查詢。這可以通過 sqlite3_get_table 函數做到。
int sqlite3_get_table(sqlite3*, const char *sql, char ***resultp, int *nrow, int *ncolumn, char **errmsg );
第1個參數不再多說,看前面的例子。
第2個參數是 sql 語句,跟 sqlite3_exec 里的 sql 是一樣的。是一個很普通的以/0結尾的char *字符串。
第3個參數是查詢結果,它依然一維數組(不要以為是二維數組,更不要以為是三維數組)。它內存布局是:第一行是字段名稱,后面是緊接著是每個字段的值。下面用例子來說事。
第4個參數是查詢出多少條記錄(即查出多少行)。
第5個參數是多少個字段(多少列)。
第6個參數是錯誤信息,跟前面一樣,這里不多說了。
下面給個簡單例子:

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 )
{
//數據庫打開失敗
return -1;
}

//數據庫操作代碼
//假設前面已經創建了 MyTable_1 表
//開始查詢,傳入的 dbResult 已經是 char **,這里又加了一個 & 取地址符,傳遞進去的就成了 char ***
result = sqlite3_get_table( db, “select * from MyTable_1”, &dbResult, &nRow, &nColumn, &errmsg );
if( SQLITE_OK == result )
{
//查詢成功
index = nColumn; //前面說過 dbResult 前面第一行數據是字段名稱,從 nColumn 索引開始才是真正的數據
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 的字段值是連續的,從第0索引到第 nColumn - 1索引都是字段名稱,從第 nColumn 索引開始,后面都是字段值,它把一個二維的表(傳統的行列表示法)用一個扁平的形式來表示
}
printf( “-------/n” );
}
}

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

//關閉數據庫
sqlite3_close( db );
return 0;
}

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
91精品国产欧美日韩| 日本亚洲视频在线| 精品视频www| 本道综合精品| 日本熟女一区二区| 欧美三级日本三级少妇99| 国产一区在线观看视频| 精品国产99| 91精品国产自产观看在线| 亚洲三级欧美| 精品午夜av| 国产欧美中文在线| 欧美日韩国产123区| 国产免费电影网站入口| 国产手机精品视频| eeuss一区| 日韩精品不卡一区二区| 国产成人一区二区精品非洲| 中文字幕精品在线播放| 国产一卡二卡3卡4卡四卡在线| 久久精品黄色片| 91精品久久久久久久久| 一区二区日韩视频| 日韩精品不卡一区二区| 久久99精品久久久| 国产精久久久久| 日韩免费精品| 亚洲 欧美综合在线网络| 中文字幕在线视频日韩| 国产欧美日韩中文| 欧美亚洲国产激情| 欧美日韩亚洲第一| 日韩高清不卡一区| 日韩欧美综合视频| 一区二区三区精品在线观看| 亚洲欧美99| 亚洲社区在线| 91精品国产乱码久久蜜臀| 国产黄色在线播放| 欧洲精品久久久| 精品国产免费视频| 欧美日韩国产高清| 中文字幕国产欧美| 欧美午夜影院在线视频| 久久麻豆视频| 中文字幕国产欧美| 热久久精品国产| 久久麻豆视频| 国产精品福利视频一区二区三区| 欧美日韩精品中文字幕| 欧美啪啪一区| 中文不卡在线| 国产69精品久久app免费版| 欧美日韩精品欧美日韩精品| 欧美日韩在线播放三区四区| 不卡在线一区二区| 久久精品日韩欧美| 日韩欧美久久久| 国产wwww| √天堂资源中文www| 国产在线一在线二| 在线视频日韩欧美| 在线国产一级| 九一精品国产| 亚洲国产91精品在线观看| 一区二区精品区| 最近免费中文字幕在线第一页| 日韩中文字幕在线视频播放| 91精品国产91久久久久久久久| 五月天久久比比资源色| 精品久久久三级| 国产九九在线| 日本免费在线视频不卡一不卡二| 日韩亚洲国产欧美| 日韩免费看网站| 欧美日韩国产首页在线观看| 精品综合久久久久| 91久久精品午夜一区二区| 久久精品在线免费观看| 欧美日韩精品综合| 97久久精品| 91精品国产自产| 久久久精品午夜少妇| 一区二区三区精品99久久| 亚洲高清视频在线| 欧美久久在线| 黄色欧美日韩| av免费在线不卡| 国产欧美日韩视频在线| 欧美日韩夫妻久久| 欧美日韩高清| 中文字幕在线观看视频www| 精品一二三四| 国产三级精品网站| 中文字幕欧美国内| 1区不卡电影| 欧美日韩中文字幕视频| 日韩不卡一区二区| 国产激情99| 亚洲成av人片| 日韩色在线观看| 精品国产乱码一区二区| 日韩视频免费直播| 91精品国产自产| 亚洲一区中文在线| 999精品在线| 日韩三级视频在线播放| 日韩中文在线视频| 色偷偷一区二区三区| 精品视频三区| 国产中文伊人| 国产免费电影网站入口| 91精品999| 日韩不卡一二区| 中文字幕日韩欧美| 欧美三级三级三级爽爽爽| 久久麻豆视频| 久久99久久久久| 欧美综合精品| 欧美日韩三级在线| 久久riav| 国产网站av| √天堂资源中文www| 中文字幕在线导航| 日韩精品视频在线看| 红桃视频亚洲| av最新网址| 国产一区不卡精品| 久久永久免费视频| 国产wwww| 日韩免费视频一区二区| 日韩在线视频在线观看| 欧美日韩中文字幕一区| 中文字幕亚洲二区| 国产成人精品综合久久久| 欧美日韩精品是欧美日韩精品| 国产婷婷色一区二区三区在线| 日韩欧美中文在线| 欧美日韩精品免费在线观看视频| 国产对白在线| 日韩精品免费观看视频| 色屁屁一区二区| 久久99久久久久久久噜噜| 久久中文免费视频| 日韩精品高清不卡| 国产欧美日韩中文字幕| 国产香蕉精品视频| 中文字幕亚洲一区在线观看| 日本亚洲视频在线| 国产一级在线免费观看| 中文字幕中文字幕精品| 日韩中文字幕在线播放| 蜜臀91精品国产高清在线观看| 黄色一区二区在线| 欧美一级一级性生活免费录像| 欧美色欧美亚洲高清在线视频| 精品成a人在线观看| 国产绿帽一区二区三区| 亚洲乱码一区av黑人高潮| 国产在线不卡av| 中文字幕在线导航| 日韩精品欧美| 欧美一级搡bbbb搡bbbb| 日本国产在线视频| 亚洲成在线观看| 91精品xxx在线观看| 国产一级在线免费观看| 色综合久久88色综合天天免费| 国产主播中文字幕| 久久久水蜜桃| 日韩在线高清视频| 69堂精品视频在线播放| a视频免费看| 中文字幕一区二区三区精品| 在线国产99| 国产区日韩欧美| 国产一级在线播放| 国产一区二中文字幕在线看| 1区2区3区在线视频| 成人xxxx| 激情国产在线| 在线国产一级| 精品国产乱码久久久久久牛牛| 国产欧美日韩中文字幕在线| 国产乱国产乱300精品| 日韩精品在线播放| 亚洲一区精品在线| 中文字幕亚洲区| 最近中文av字幕在线中文| 欧美自拍一区| 久久视频一区| 91精品国产经典在线观看| 国产91大片| 日韩国产欧美亚洲| 国产福利一区二区| 91精品国产调教在线观看| 精品在线网站观看| 久久riav| 韩日中文字幕第一页| 国产乱国产乱老熟300| 免费在线国产| 国产黄色在线网站| 一区二区视频免费看| 中文字幕在线视频日韩| 亚洲午夜av| 国产日韩精品在线看| 在线国产一级| 免费看黄资源大全高清| 精品在线网站观看| 天堂在线视频中文网| 日韩亚洲欧美中文字幕| 久本草在线中文字幕亚洲欧美| 欧美日韩综合高清一区二区| 欧美三级中文字幕在线观看| 中文字幕在线观看欧美| 日韩三级一区二区| 精品不卡一区二区| 中文字幕亚洲欧美| 日韩精品午夜| 久久99久久久久| 日韩国产成人| 日韩视频不卡中文| 精品乱人伦一区二区三区| aaa大片在线观看| 亚洲3区在线| 久久69成人| 不卡视频一区二区三区| 色综合婷婷久久| 欧美一级久久久久久久久大| 国产欧美日韩在线播放| 欧美在线视频第一页| av免费观看国产| 国产手机精品视频| 中文字幕日韩国产| 欧美日韩成人一区二区| 欧美另类专区| 日本黄色一区二区三区| 中文字幕亚洲乱码| 在线一区av| 亚洲欧美日本国产专区一区| 日韩中文字幕视频网| 欧美不卡视频| 久本草在线中文字幕亚洲欧美| 国产一区二中文字幕在线看| 日本a口亚洲| 二区三区不卡不卡视频| 精品播放一区二区| 91精品婷婷国产综合久久竹菊| 日韩精品在线第一页| 中文字幕 乱码 中文乱码91| 日韩精品一页| 不卡福利视频| 日韩在线不卡| 999视频精品| 久草亚洲一区| 亚洲一区中文字幕在线| 日韩欧美中文字幕精品| 日韩一级中文字幕| 国产欧美日韩中文| 日韩国产欧美在线视频| 日韩欧美中文字幕在线观看| 日韩欧美不卡视频| 久草中文在线观看| 精品日韩在线| 国产欧美久久久久久久久| 一区二区在线高清视频| 一区二区不卡视频在线观看| 国产字幕中文| 午夜一区二区三区视频| 欧美不卡视频| 91精品国产调教在线观看| 国产精久久久久| 欧美日韩精品综合| av中文在线播放| 国产午夜在线观看| 中文字幕在线精品| 免费在线视频一级不卡| 日韩视频免费直播| 日韩免费视频一区二区| 欧美成人精品在线| 一区在线视频观看| 欧美亚洲天堂网| 国产欧美中文字幕| 欧美.日韩.国产.一区.二区| 婷婷久久综合九色国产成人| 久久99精品久久久| 日本一级一片免费视频| 高清不卡一区二区| 91久久精品国产| 91久久中文| 亚洲欧美久久234| 韩国av一区二区| 中文字幕在线观看亚洲| www日韩在线观看| 国产在线不卡av| 91精品观看| 首页国产欧美久久| 久久精品国产视频| 中文字幕亚洲在| 免费在线国产| 欧美日韩精品综合| 精品一区二区三区中文字幕 | 国产一级视频在线播放| 中文字幕久精品免费视频| 亚洲成av人片一区二区密柚| 国产视频二区| 精品久久在线| 久久久精品免费免费| 日韩av一区在线| 国产激情久久| 九一久久久久久| 久久韩国免费视频| 在线资源av| 中文字幕综合在线| 精品人妻一区二区三区视频| 国内精品不卡| 91精品久久久久久久久| 欧美二区在线观看| 国产中文在线观看| 日韩.com| 久久久水蜜桃| www中文字幕在线观看| 亚洲国产无线乱码在线观看| 欧美日韩国产专区| 在线一区二区不卡| 日韩中文字幕国产| 亚洲永久免费视频| 亚洲第一中文字幕在线观看| 日韩一级中文字幕| 亚洲日本欧美日韩高观看| 一区二区日韩免费看| 中文亚洲免费| 亚洲va久久久噜噜噜久久| 国产亚洲人成a一在线v站| 日韩.欧美.亚洲| 日韩va亚洲va欧洲va国产| www.三级.com| 美日韩精品免费视频| 亚洲第一中文字幕| 日本视频久久久| 中文字幕在线精品| 国产欧美日韩精品高清二区综合区 | 国产一区 二区 三区一级| 日韩.欧美.亚洲| 精品亚洲国内自在自线福利| 久久婷婷亚洲| 中文字幕在线官网| 91欧美日韩| 日韩免费视频| 欧美日韩性视频一区二区三区| 精品日韩欧美| 人人做人人澡人人爽欧美| 91麻豆精品国产91久久久使用方法| 国产aa精品| 亚洲精品中文字幕乱码三区| 精品在线网站观看| 国内不卡的二区三区中文字幕| 欧美日韩亚洲不卡| 国产婷婷色一区二区三区| 亚洲一区在线观看网站| 欧美日韩亚洲天堂| 日韩亚洲欧美中文在线| 一级国产黄色片| 国产字幕在线看| 日韩精品视频在线观看网址 | 日韩在线中文字幕| 91精品999| 国产成人精品综合网站| 日韩精品视频网站| 国产亚洲一区字幕| 国产日韩精品在线| 91精品xxx在线观看| 久久久久久久久99精品| 欧美中文字幕精品| 91一区二区| 91精品国产91久久| 91日韩欧美| 精品久久久精品| 精品人妻一区二区三区视频| 日韩激情一区| 日韩中文字幕精品视频| 国产91久久久久| 欧美日韩综合在线| 久久精品卡一| 日韩国产高清一区| 欧美国产三级| 国产午夜在线观看| 一区二区视频在线| 欧美国产小视频| 91精品无人成人www| 国产不卡一区| 日韩国产成人| 欧美日韩国产黄色| 精品福利一区二区三区| 中文字幕欧美人妻精品一区蜜臀 | 日韩一级二级三级| 欧美一级久久| 国产欧美日韩第一页| 欧美亚洲另类制服自拍| 欧美变态tickling挠脚心|