深入SQLite基本操作的總結(jié)詳解建站知識
導(dǎo)讀:1建站知識sqlite提供的是一些C函數(shù)接口,你可以用這些函數(shù)操作數(shù)據(jù)庫。通過使用這些接口,傳遞一些標(biāo)準(zhǔn) sql 語句(以 char * 類型)給 sqlite 函數(shù),s如何seo優(yōu)化推廣網(wǎng)站網(wǎng)站建設(shè)公司。
sqlite提供的是一些C函數(shù)接口,你可以用這些函數(shù)操作數(shù)據(jù)庫。通過使用這些接口,傳遞一些標(biāo)準(zhǔn) 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)關(guān)鍵數(shù)據(jù)結(jié)構(gòu):
sqlite 里最常用到的是 sqlite3 * 類型。從數(shù)據(jù)庫打開開始,sqlite就要為這個類型準(zhǔn)備好內(nèi)存,直到數(shù)據(jù)庫關(guān)閉,整個過程都需要用到這個類型。當(dāng)數(shù)據(jù)庫打開時開始,這個類型的變量就代表了你要操作的數(shù)據(jù)庫。下面再詳細介紹。
(2)打開數(shù)據(jù)庫:
int sqlite3_open( 文件名, sqlite3 ** ); 用這個函數(shù)開始數(shù)據(jù)庫操作。需要傳入兩個參數(shù),一是數(shù)據(jù)庫文件名,比如:..\\test\\testDatabase.db。
文件名不需要一定存在,如果此文件不存在,sqlite 會自動建立它。如果它存在,就嘗試把它當(dāng)數(shù)據(jù)庫文件來打開。 其中sqlite3 ** 參數(shù)即前面提到的關(guān)鍵數(shù)據(jù)結(jié)構(gòu)。這個結(jié)構(gòu)底層細節(jié)如何,你不要關(guān)它。
函數(shù)返回值表示操作是否正確,如果是 SQLITE_OK 則表示操作正常。相關(guān)的返回值sqlite定義了一些宏。具體這些宏的含義可以參考 sqlite3.h 文件。里面有詳細定義。
(3)關(guān)閉數(shù)據(jù)庫:
int sqlite3_close(sqlite3 *); 前面如果用 sqlite3_open 開啟了一個數(shù)據(jù)庫,結(jié)尾時不要忘了用這個函數(shù)關(guān)閉數(shù)據(jù)庫。
sqlite數(shù)據(jù)庫操作例子
復(fù)制代碼 代碼如下:
#include "./sqlite3.h"
int main( int , char** )
{
sqlite3 * db = NULL; //聲明sqlite關(guān)鍵結(jié)構(gòu)指針
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 ); //關(guān)閉數(shù)據(jù)庫
return 0;
}
這就是一次數(shù)據(jù)庫操作過程。
2、 SQL語句操作(如何用sqlite 執(zhí)行標(biāo)準(zhǔn) sql 語法)
(1)執(zhí)行sql語句: int sqlite3_exec(sqlite3*, const char *sql, sqlite3_callback, void *, char **errmsg ); 這就是執(zhí)行一條 sql 語句的函數(shù)。
參數(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ù)里面,如果不需要傳遞指針給回調(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*seo網(wǎng)站優(yōu)化*); 你的回調(diào)函數(shù)必須定義成上面這個函數(shù)的類型。
sqlite數(shù)據(jù)庫操作例子:
復(fù)制代碼 代碼如下:
//sqlite3的回調(diào)函數(shù)
// sqlite 每查到一條記錄,就調(diào)用一次這個回調(diào)
//para是你在 sqlite3_exec 里傳入的 void * 參數(shù)
//通過para參數(shù),你可以傳入一些特殊的指針(比如類指針、結(jié)構(gòu)指針),然后在這里面強制轉(zhuǎn)換成對應(yīng)的類型
//(這里面是void*類型,必須強制轉(zhuǎn)換成你的類型才可用)。然后操作這些數(shù)據(jù)
//n_column是這一條記錄有多少個字段 (即這條記錄有多少列)
//char **網(wǎng)站推廣優(yōu)化seo column_value 是關(guān)鍵值,查出來的數(shù)據(jù)都保存在這里,實際上是個1維數(shù)組(不要以為是2維數(shù)組),
//每一個元素都是一個 char * 值,是一個字段內(nèi)容(用字符串來表示,以\0結(jié)尾)
//char ** column_name 跟 column_value是對應(yīng)的,表示這個字段的字段名稱
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網(wǎng)站seo優(yōu)化, 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 ); //關(guān)閉數(shù)據(jù)庫
return 0;
}
通過上面的例子,應(yīng)該可以知道如何打開一個數(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ù)的時候,隱含把類指針當(dāng)成函數(shù)的第一個參數(shù)傳遞進去。結(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 );
參數(shù)說明:
第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ù)是錯誤信息,跟前面一樣,這里不多說了。
sqlite數(shù)據(jù)庫操作例子:
復(fù)制代碼 代碼如下:相關(guān)如何seo優(yōu)化推廣網(wǎng)站網(wǎng)站建設(shè)公司。
聲明: 本文由我的SEOUC技術(shù)文章主頁發(fā)布于:2023-05-24 ,文章深入SQLite基本操作的總結(jié)詳解建站知識主要講述詳解,深入,SQL網(wǎng)站建設(shè)源碼以及服務(wù)器配置搭建相關(guān)技術(shù)文章。轉(zhuǎn)載請保留鏈接: http://www.bifwcx.com/article/web_6588.html
為你推薦與深入SQLite基本操作的總結(jié)詳解建站知識相關(guān)的文章
-
通王TWCMS 2.0.3網(wǎng)站模板程序下載
(126)人喜歡 2024-01-15 -
Windows官方原版在哪里下載
(175)人喜歡 2024-01-15 -
WordPress網(wǎng)站模板發(fā)帖標(biāo)題顏色設(shè)置
(131)人喜歡 2024-01-07 -
修改discuz論壇帖子標(biāo)題80字符的長度限制
(249)人喜歡 2024-01-07 -
wordpress程序調(diào)用不帶超鏈接的Tag標(biāo)簽
(234)人喜歡 2024-01-05 -
網(wǎng)站在不同時期需調(diào)整內(nèi)容更新的方向
(112)人喜歡 2023-08-12