麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 數據庫 > SQLite > 正文

SQLITE3 使用總結(2)

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

(2) SQL語句操作
本節介紹如何用sqlite 執行標準 sql 語法。

i.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 把數據查出來,得通過回調告訴你查出了什么數據。

i.2 exec 的回調

typedef int (*sqlite3_callback)(void*,int,char**, char**);

你的回調函數必須定義成上面這個函數的類型。下面給個簡單的例子:

//sqlite3的回調函數
// 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;
}

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

有這些知識,基本上可以應付很多數據庫操作了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 欧美成人一区免费视频 | 日韩毛片在线看 | 欧美国产一区二区三区 | 国产精品视频一区二区三区四区五区 | 成人羞羞在线观看网站 | 欧美zoofilia杂交videos | 日本一道aⅴ不卡免费播放 久久久久久久高清 | 毛片免费试看 | 久久影院国产精品 | 欧美成人做爰高潮片免费视频 | 成人免费网站在线观看视频 | 午夜久久久精品一区二区三区 | 欧美三级美国一级 | 国产小视频在线观看 | 午夜精品福利视频 | 国产一级一片免费播放 | 午夜视频成人 | 一级做a爱片久久毛片a高清 | 一级毛片免费高清 | 亚洲欧美一区二区三区在线观看 | 亚洲第一成人在线视频 | 色综合精品 | 欧美精品欧美 | 小情侣嗯啊哦视频www | 牛牛热这里只有精品 | 在线成人免费视频 | 一本色道精品久久一区二区三区 | 欧美无限资源 | 天天舔夜夜操 | 国产人成免费爽爽爽视频 | 精品国产一区二区久久 | 日本残忍极度灌浣肠视频 | 亚洲第五色综合网 | 国产女做a爱免费视频 | 亚洲一区二区三区日本久久九 | 久久精品视频首页 | 九九热视频免费 | 丁香天堂网 | 97中文字幕在线观看 | 日韩精品久久久久久 | 性生活视频一级 |