掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
SQLite是一款輕量級(jí)的嵌入式關(guān)系型數(shù)據(jù)庫(kù),適用于嵌入式設(shè)備和移動(dòng)設(shè)備等資源有限的系統(tǒng)。它不需要獨(dú)立的服務(wù)進(jìn)程,可以直接訪問(wèn)存儲(chǔ)在普通的磁盤文件中的數(shù)據(jù),因此相對(duì)于其他數(shù)據(jù)庫(kù)來(lái)說(shuō),SQLite占用的系統(tǒng)資源更少,性能更高。

在C語(yǔ)言中,我們可以通過(guò)SQLite API來(lái)連接SQLite數(shù)據(jù)庫(kù)。這篇文章將詳細(xì)介紹如何使用C語(yǔ)言中的SQLite API來(lái)連接SQLite數(shù)據(jù)庫(kù)。主要包括以下幾個(gè)方面:
1.連接SQLite數(shù)據(jù)庫(kù)
2.插入數(shù)據(jù)
3.查詢數(shù)據(jù)
4.更新數(shù)據(jù)
5.刪除數(shù)據(jù)
1.連接SQLite數(shù)據(jù)庫(kù)
在C語(yǔ)言中,我們可以使用sqlite3_open函數(shù)來(lái)創(chuàng)建一個(gè)與SQLite數(shù)據(jù)庫(kù)的連接。該函數(shù)的原型如下:
“`
int sqlite3_open(const char *filename, sqlite3 **ppDb);
“`
該函數(shù)接收兩個(gè)參數(shù),之一個(gè)參數(shù)為要打開(kāi)的SQLite數(shù)據(jù)庫(kù)的文件名,包括路徑,如果該文件不存在則會(huì)自動(dòng)創(chuàng)建。第二個(gè)參數(shù)為用來(lái)存儲(chǔ)SQLite數(shù)據(jù)庫(kù)對(duì)象的指針。
連接SQLite數(shù)據(jù)庫(kù)的示例代碼如下:
“`c
#include
#include
int mn(int argc, char **argv)
{
sqlite3 *db;
int rc = sqlite3_open(“test.db”, &db);
if (rc)
{
fprintf(stderr, “Can’t open database: %s\n”, sqlite3_errmsg(db));
sqlite3_close(db);
return 1;
}
else
{
printf(“Opened database successfully!\n”);
}
sqlite3_close(db);
return 0;
}
“`
在上述示例代碼中,我們首先包含了sqlite3.h頭文件,然后使用sqlite3_open函數(shù)連接了一個(gè)名為“test.db”的SQLite數(shù)據(jù)庫(kù)。如果連接失敗,我們將輸出錯(cuò)誤消息并返回錯(cuò)誤代碼。如果連接成功,我們將輸出一條成功連接的消息。我們通過(guò)sqlite3_close函數(shù)關(guān)閉了與數(shù)據(jù)庫(kù)的連接。
2.插入數(shù)據(jù)
要向SQLite數(shù)據(jù)庫(kù)中插入數(shù)據(jù),我們可以使用sqlite3_exec函數(shù)。這個(gè)函數(shù)可以執(zhí)行在之一個(gè)參數(shù)中指定的任何SQL語(yǔ)句。該函數(shù)的原型如下:
“`c
int sqlite3_exec(sqlite3*, const char *sql, int (*callback)(void*,int,char**,char**), void *, char **errmsg);
“`
該函數(shù)接受五個(gè)參數(shù),之一個(gè)參數(shù)為與SQLite數(shù)據(jù)庫(kù)之間的連接。第二個(gè)參數(shù)為要執(zhí)行的SQL語(yǔ)句。第三個(gè)參數(shù)為結(jié)果回調(diào)函數(shù),可以在SQL執(zhí)行期間或執(zhí)行完成后進(jìn)行一些操作。第四個(gè)參數(shù)為以上結(jié)果回調(diào)函數(shù)的之一個(gè)參數(shù)。第五個(gè)參數(shù)用于存儲(chǔ)錯(cuò)誤消息。
插入數(shù)據(jù)的示例代碼如下:
“`c
#include
#include
int mn(int argc, char **argv)
{
sqlite3 *db;
int rc;
rc = sqlite3_open(“test.db”, &db);
if (rc)
{
fprintf(stderr, “Can’t open database: %s\n”, sqlite3_errmsg(db));
sqlite3_close(db);
return 1;
}
else
{
printf(“Opened database successfully!\n”);
}
char *sql = “INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) ” \
“VALUES (1, ‘Paul’, 32, ‘California’, 20230.00); “;
char *errmsg;
rc = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
if (rc != SQLITE_OK)
{
fprintf(stderr, “SQL error: %s\n”, errmsg);
sqlite3_free(errmsg);
}
else
{
printf(“Records created successfully!\n”);
}
sqlite3_close(db);
return 0;
}
“`
在上述示例代碼中,我們通過(guò)sql變量設(shè)置了要執(zhí)行的SQL語(yǔ)句,即向名為“COMPANY”的表中插入一條記錄。然后我們將該SQL語(yǔ)句傳遞給sqlite3_exec函數(shù)來(lái)執(zhí)行。如果執(zhí)行期間發(fā)生錯(cuò)誤,我們將通過(guò)sqlite3_free函數(shù)釋放錯(cuò)誤消息,并輸出錯(cuò)誤消息。否則,我們將輸出一條成功插入的消息。
3.查詢數(shù)據(jù)
要查詢SQLite數(shù)據(jù)庫(kù)中的數(shù)據(jù),我們可以使用sqlite3_exec函數(shù)和結(jié)果回調(diào)函數(shù)。當(dāng)sqlite3_exec執(zhí)行SQL查詢后,結(jié)果回調(diào)函數(shù)將被調(diào)用一次或多次。每次調(diào)用將返回一個(gè)結(jié)果行。每個(gè)結(jié)果行是由一個(gè)或多個(gè)數(shù)據(jù)值組成的數(shù)組。
結(jié)果回調(diào)函數(shù)的原型如下:
“`c
int callback(void *NotUsed, int argc, char **argv, char **azColName);
“`
除了之一個(gè)參數(shù)以外,其他參數(shù)只有在每行中具有一個(gè)以上的結(jié)果時(shí)才適用。之一個(gè)參數(shù)與sqlite3_exec的第四個(gè)參數(shù)相同,它是傳遞給結(jié)果回調(diào)函數(shù)的參數(shù)。第二個(gè)參數(shù)是結(jié)果集中的結(jié)果行數(shù)。第三個(gè)參數(shù)是由結(jié)果行中的每個(gè)元素組成的數(shù)組。第四個(gè)參數(shù)是包含每個(gè)結(jié)果行中的列名的數(shù)組。
查詢數(shù)據(jù)的示例代碼如下:
“`c
#include
#include
int callback(void *data, int argc, char **argv, char **azColName)
{
int i;
for (i = 0; i
{
printf(“%s = %s\n”, azColName[i], argv[i] ? argv[i] : “NULL”);
}
printf(“\n”);
return 0;
}
int mn(int argc, char **argv)
{
sqlite3 *db;
char *sql;
char *errmsg;
int rc;
rc = sqlite3_open(“test.db”, &db);
if (rc)
{
fprintf(stderr, “Can’t open database: %s\n”, sqlite3_errmsg(db));
sqlite3_close(db);
return 1;
}
else
{
printf(“Opened database successfully!\n”);
}
sql = “SELECT * from COMPANY;”;
rc = sqlite3_exec(db, sql, callback, NULL, &errmsg);
if (rc != SQLITE_OK)
{
fprintf(stderr, “SQL error: %s\n”, errmsg);
sqlite3_free(errmsg);
}
else
{
printf(“Operation done successfully!\n”);
}
sqlite3_close(db);
return 0;
}
“`
在上述示例代碼中,我們定義了一個(gè)名為callback的結(jié)果回調(diào)函數(shù)。然后,我們使用sqlite3_exec函數(shù)執(zhí)行了一個(gè)SQL查詢,該查詢以指定的回調(diào)函數(shù)作為第三個(gè)參數(shù)。如果查詢期間出現(xiàn)錯(cuò)誤,我們將輸出錯(cuò)誤消息并釋放錯(cuò)誤消息。否則,我們將輸出成功執(zhí)行的消息。
4.更新數(shù)據(jù)
要更新從SQLite數(shù)據(jù)庫(kù)中檢索出的數(shù)據(jù),我們可以使用sqlite3_exec函數(shù)。我們可以將UPDATE語(yǔ)句傳遞給該函數(shù),并指定要更新的行和列。
更新數(shù)據(jù)的示例代碼如下:
“`c
#include
#include
int mn(int argc, char **argv)
{
sqlite3 *db;
char *errmsg;
int rc;
rc = sqlite3_open(“test.db”, &db);
if (rc)
{
fprintf(stderr, “Can’t open database: %s\n”, sqlite3_errmsg(db));
sqlite3_close(db);
return 1;
}
else
{
printf(“Opened database successfully!\n”);
}
char *sql = “UPDATE COMPANY set SALARY = 25000.00 where ID=1; “;
rc = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
if (rc != SQLITE_OK)
{
fprintf(stderr, “SQL error: %s\n”, errmsg);
sqlite3_free(errmsg);
}
else
{
printf(“Total updated rows: %d\n”, sqlite3_changes(db));
}
sqlite3_close(db);
return 0;
}
“`
在上述示例代碼中,我們通過(guò)UPDATE語(yǔ)句將ID為1的記錄的薪水更新為25000.00。然后,我們將該SQL語(yǔ)句傳遞給sqlite3_exec函數(shù)。如果更新期間出現(xiàn)錯(cuò)誤,我們將輸出錯(cuò)誤消息并釋放錯(cuò)誤消息。否則,我們將輸出成功更新的行數(shù)。
5.刪除數(shù)據(jù)
要從SQLite數(shù)據(jù)庫(kù)中刪除數(shù)據(jù),我們可以使用sqlite3_exec函數(shù)。我們可以將DELETE語(yǔ)句傳遞給該函數(shù),并指定要?jiǎng)h除的行和列。
刪除數(shù)據(jù)的示例代碼如下:
“`c
#include
#include
int mn(int argc, char **argv)
{
sqlite3 *db;
char *errmsg;
int rc;
rc = sqlite3_open(“test.db”, &db);
if (rc)
{
fprintf(stderr, “Can’t open database: %s\n”, sqlite3_errmsg(db));
sqlite3_close(db);
return 1;
}
else
{
printf(“Opened database successfully!\n”);
}
char *sql = “DELETE from COMPANY where ID=1; “;
rc = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
if (rc != SQLITE_OK)
{
fprintf(stderr, “SQL error: %s\n”, errmsg);
sqlite3_free(errmsg);
}
else
{
printf(“Total deleted rows: %d\n”, sqlite3_changes(db));
}
sqlite3_close(db);
return 0;
}
“`
在上述示例代碼中,我們使用DELETE語(yǔ)句刪除ID為1的記錄。然后,我們將該SQL語(yǔ)句傳遞給sqlite3_exec函數(shù)。如果刪除期間出現(xiàn)錯(cuò)誤,我們將輸出錯(cuò)誤消息并釋放錯(cuò)誤消息。否則,我們將輸出成功刪除的行數(shù)。
:
相關(guān)問(wèn)題拓展閱讀:
sorry, 沒(méi)安裝”sqlite developer”.
若只是想導(dǎo)出sqlite數(shù)據(jù)庫(kù)中的表數(shù)據(jù)皮蘆可以很簡(jiǎn)備塵單地用燃滾帶sqlite命令:
tim@ubtim:~/workspace$ sqlite3
SQLite version 3.7.9:49:22
Enter “.help” for instructions
Enter SQL statements terminated with a “;”
sqlite> create table tb_test (field int, val varchar(3));
sqlite> insert into tb_test values (1, ‘a(chǎn)’);
sqlite> insert into tb_test values (2, ‘b’);
sqlite> insert into tb_test values (3, ‘c’);
sqlite> .mode csv
sqlite> .output tb_test.csv
sqlite> select * from tb_test;
sqlite> .q
tim@ubtim:~/workspace$ cat tb_test.csv
1,a
2,b
3,c
tim@ubtim:~/workspace$
是什么語(yǔ)言想要模襲連接差敗的呢,不同語(yǔ)言的操作差別挺旦慶兄大的
~~~~~~~
~~~~~~~~~~~~~
~~~~~
首先說(shuō)明這個(gè)問(wèn)題困擾了我很長(zhǎng)時(shí)間了,肆御嚴(yán)格地說(shuō)應(yīng)該有兩天,不過(guò)終于通過(guò)sqlite的官方文檔解決了。
For example, assume the string variable zText contains text as follows:
char *zText = “It’s a happy day!”;
One can use this text in an SQL statement as follows:
char *zSQL = sqlite3_mprintf(“州雹唯INSERT INTO table VALUES(‘%q’)”, zText); sqlite3_exec(db, zSQL, 0, 0, 0); sqlite3_free(zSQL);
摘自liuzhidong123的冊(cè)培專欄
ORDER BY 列 ASC
c連接sqlite數(shù)據(jù)庫(kù)語(yǔ)句的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于c連接sqlite數(shù)據(jù)庫(kù)語(yǔ)句,C語(yǔ)言中使用SQLite數(shù)據(jù)庫(kù)的連接語(yǔ)句詳解,sqlite怎么連接數(shù)據(jù)庫(kù)文件,怎么用C語(yǔ)言動(dòng)態(tài)往sqlite3里面插入數(shù)據(jù)的信息別忘了在本站進(jìn)行查找喔。
創(chuàng)新互聯(lián)成都網(wǎng)站建設(shè)公司提供專業(yè)的建站服務(wù),為您量身定制,歡迎來(lái)電(028-86922220)為您打造專屬于企業(yè)本身的網(wǎng)絡(luò)品牌形象。
成都創(chuàng)新互聯(lián)品牌官網(wǎng)提供專業(yè)的網(wǎng)站建設(shè)、設(shè)計(jì)、制作等服務(wù),是一家以網(wǎng)站建設(shè)為主要業(yè)務(wù)的公司,在網(wǎng)站建設(shè)、設(shè)計(jì)和制作領(lǐng)域具有豐富的經(jīng)驗(yàn)。

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流