在本章中,您將學習如何在C / C ++程序中使用SQLite。
在我們的C / C ++程序中開始使用SQLite之前,您需要確保在計算機上設置了SQLite庫。您可以查看“ SQLite安裝”一章以了解安裝過程。
以下是重要的C / C ++ SQLite接口示例,這些示例足以滿足您從C / C ++程序使用SQLite數(shù)據(jù)庫的要求。如果您正在尋找更復雜的應用程序,則可以查閱SQLite官方文檔。
序號 | API和說明 |
---|---|
1 | sqlite3_open(const char *filename, sqlite3 **ppDb) 該例程打開與SQLite數(shù)據(jù)庫文件的連接,并返回一個數(shù)據(jù)庫連接對象,供其他SQLite例程使用。 如果filename參數(shù)為NULL或':memory:',則sqlite3_open()將在RAM中創(chuàng)建一個內(nèi)存數(shù)據(jù)庫,該數(shù)據(jù)庫僅在會話期間持續(xù)存在。 如果文件名不為NULL,則sqlite3_open()嘗試使用其值打開數(shù)據(jù)庫文件。如果不存在該名稱的文件,則sqlite3_open()將打開該名稱的新數(shù)據(jù)庫文件。 |
2 | sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg) 此例程提供了一種快速,簡便的方法來執(zhí)行由sql參數(shù)提供的SQL命令,該參數(shù)可由多個SQL命令組成。 在這里,第一個參數(shù)sqlite3是一個開放的數(shù)據(jù)庫對象,sqlite_callback是一個回調,其數(shù)據(jù)是第一個參數(shù),并且將返回errmsg以捕獲例程引發(fā)的任何錯誤。 sqlite3_exec()例程解析并執(zhí)行sql參數(shù)中給定的每個命令,直到到達字符串末尾或遇到錯誤為止。 |
3 | sqlite3_close(sqlite3*) 此例程關閉先前通過調用sqlite3打開的數(shù)據(jù)庫連接_open()。與連接關聯(lián)的所有準備好的語句應在關閉連接之前完成。 如果還有任何尚未完成的查詢,則sqlite3_close()將返回SQLITE_BUSY,錯誤消息由于未完成的語句而無法關閉。 |
以下C代碼段顯示了如何連接到現(xiàn)有數(shù)據(jù)庫。如果數(shù)據(jù)庫不存在,則將創(chuàng)建該數(shù)據(jù)庫,最后將返回一個數(shù)據(jù)庫對象。
#include <stdio.h> #include <sqlite3.h> int main(int argc, char* argv[]) { sqlite3 *db; char *zErrMsg = 0; int rc; rc = sqlite3_open("test.db", &db); if( rc ) { fprintf(stderr, "無法打開數(shù)據(jù)庫: %s\n", sqlite3_errmsg(db)); return(0); } else { fprintf(stderr, "成功打開數(shù)據(jù)庫\n"); } sqlite3_close(db); }
現(xiàn)在,讓我們編譯并運行上述程序,以test.db在當前目錄中創(chuàng)建數(shù)據(jù)庫。您可以根據(jù)需要更改路徑。
$gcc test.c -l sqlite3 $./a.out 成功打開數(shù)據(jù)庫
如果要使用C ++源代碼,則可以按以下方式編譯代碼-
$g++ test.c -l sqlite3
在這里,我們將程序與sqlite3庫鏈接在一起,以提供C程序所需的功能。這將在您的目錄中創(chuàng)建一個數(shù)據(jù)庫文件test.db,您將得到以下結果。
-rwxr-xr-x. 1 root root 7383 May 8 02:06 a.out -rw-r--r--. 1 root root 323 May 8 02:05 test.c -rw-r--r--. 1 root root 0 May 8 02:06 test.db
以下C代碼段將用于在先前創(chuàng)建的數(shù)據(jù)庫中創(chuàng)建表-
#include <stdio.h> #include <stdlib.h> #include <sqlite3.h> static int callback(void *NotUsed, int argc, char **argv, char **azColName) { int i; for(i = 0; i<argc; i++) { printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL"); } printf("\n"); return 0; } int main(int argc, char* argv[]) { sqlite3 *db; char *zErrMsg = 0; int rc; char *sql; /*打開數(shù)據(jù)庫*/ rc = sqlite3_open("test.db", &db); if( rc ) { fprintf(stderr, "無法打開數(shù)據(jù)庫: %s\n", sqlite3_errmsg(db)); return(0); } else { fprintf(stdout, "已成功打開數(shù)據(jù)庫\n"); } /* 創(chuàng)建SQL語句 */ sql = "CREATE TABLE COMPANY(" \ "ID INT PRIMARY KEY NOT NULL," \ "NAME TEXT NOT NULL," \ "AGE INT NOT NULL," \ "ADDRESS CHAR(50)," \ "SALARY REAL );"; /* 執(zhí)行 SQL 語句 */ rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg); if( rc != SQLITE_OK ){ fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); } else { fprintf(stdout, "表創(chuàng)建成功\n"); } sqlite3_close(db); return 0; }
編譯并執(zhí)行上述程序后,它將在test.db中創(chuàng)建COMPANY表,文件的最終列表如下-
-rwxr-xr-x. 1 root root 9567 May 8 02:31 a.out -rw-r--r--. 1 root root 1207 May 8 02:31 test.c -rw-r--r--. 1 root root 3072 May 8 02:31 test.db
以下C代碼段顯示了如何在上述示例中創(chuàng)建的COMPANY表中創(chuàng)建記錄-
#include <stdio.h> #include <stdlib.h> #include <sqlite3.h> static int callback(void *NotUsed, int argc, char **argv, char **azColName) { int i; for(i = 0; i<argc; i++) { printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL"); } printf("\n"); return 0; } int main(int argc, char* argv[]) { sqlite3 *db; char *zErrMsg = 0; int rc; char *sql; /* Open database */ rc = sqlite3_open("test.db", &db); if( rc ) { fprintf(stderr, "無法打開數(shù)據(jù)庫: %s\n", sqlite3_errmsg(db)); return(0); } else { fprintf(stderr, "已成功打開數(shù)據(jù)庫\n"); } /* 創(chuàng)建SQL語句 */ sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " \ "VALUES (1, 'Paul', 32, 'California', 20000.00 ); " \ "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " \ "VALUES (2, 'Allen', 25, 'Texas', 15000.00 ); " \ "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \ "VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );" \ "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \ "VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );"; /* 執(zhí)行SQL語句 */ rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg); if( rc != SQLITE_OK ){ fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); } else { fprintf(stdout, "已成功創(chuàng)建記錄\n"); } sqlite3_close(db); return 0; }
編譯并執(zhí)行上述程序后,它將在COMPANY表中創(chuàng)建給定記錄,并顯示以下兩行-
已成功打開數(shù)據(jù)庫 已成功創(chuàng)建記錄
在繼續(xù)實際示例以獲取記錄之前,讓我們看一下在示例中使用的有關回調函數(shù)的一些細節(jié)。該回調提供了一種從SELECT語句獲取結果的方法。它具有以下聲明-
typedef int (*sqlite3_callback)( void*, /* 在sqlite3_exec()的第4個參數(shù)中提供的數(shù)據(jù) */ int, /* 行中的列數(shù) */ char**, /* 表示行中字段的字符串數(shù)組 */ char** /* 表示列名的字符串數(shù)組 */ );
如果上述回調在sqlite_exec()例程中作為第三個參數(shù)提供,則SQLite將為在SQL參數(shù)內(nèi)執(zhí)行的每個SELECT語句中處理的每個記錄調用此回調函數(shù)。
以下C代碼段顯示了如何從上例中創(chuàng)建的COMPANY表中獲取和顯示記錄-
#include <stdio.h> #include <stdlib.h> #include <sqlite3.h> static int callback(void *data, int argc, char **argv, char **azColName){ int i; fprintf(stderr, "%s: ", (const char*)data); for(i = 0; i<argc; i++){ printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL"); } printf("\n"); return 0; } int main(int argc, char* argv[]) { sqlite3 *db; char *zErrMsg = 0; int rc; char *sql; const char* data = "Callback function called"; /* 打開數(shù)據(jù)庫 */ rc = sqlite3_open("test.db", &db); if( rc ) { fprintf(stderr, "無法打開數(shù)據(jù)庫: %s\n", sqlite3_errmsg(db)); return(0); } else { fprintf(stderr, "已成功打開數(shù)據(jù)庫\n"); } /* 創(chuàng)建SQL語句 */ sql = "SELECT * from COMPANY"; /* 執(zhí)行SQL語句 */ rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg); if( rc != SQLITE_OK ) { fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); } else { fprintf(stdout, "操作成功完成\n"); } sqlite3_close(db); return 0; }
編譯并執(zhí)行上述程序后,將產(chǎn)生以下結果。
已成功打開數(shù)據(jù)庫 Callback function called: ID = 1 NAME = Paul AGE = 32 ADDRESS = California SALARY = 20000.0 Callback function called: ID = 2 NAME = Allen AGE = 25 ADDRESS = Texas SALARY = 15000.0 Callback function called: ID = 3 NAME = Teddy AGE = 23 ADDRESS = Norway SALARY = 20000.0 Callback function called: ID = 4 NAME = Mark AGE = 25 ADDRESS = Rich-Mond SALARY = 65000.0 操作成功完成
以下C代碼段顯示了如何使用UPDATE語句更新任何記錄,然后從COMPANY表中獲取并顯示更新的記錄。
#include <stdio.h> #include <stdlib.h> #include <sqlite3.h> static int callback(void *data, int argc, char **argv, char **azColName){ int i; fprintf(stderr, "%s: ", (const char*)data); for(i = 0; i<argc; i++) { printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL"); } printf("\n"); return 0; } int main(int argc, char* argv[]) { sqlite3 *db; char *zErrMsg = 0; int rc; char *sql; const char* data = "Callback function called"; /* Open database */ rc = sqlite3_open("test.db", &db); if( rc ) { fprintf(stderr, "無法打開數(shù)據(jù)庫: %s\n", sqlite3_errmsg(db)); return(0); } else { fprintf(stderr, "已成功打開數(shù)據(jù)庫\n"); } /*創(chuàng)建合并SQL語句*/ sql = "UPDATE COMPANY set SALARY = 25000.00 where ID=1; " \ "SELECT * from COMPANY"; /* 執(zhí)行SQL語句 */ rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg); if( rc != SQLITE_OK ) { fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); } else { fprintf(stdout, "Operation done successfully\n"); } sqlite3_close(db); return 0; }
編譯并執(zhí)行上述程序后,將產(chǎn)生以下結果。
已成功打開數(shù)據(jù)庫 Callback function called: ID = 1 NAME = Paul AGE = 32 ADDRESS = California SALARY = 25000.0 Callback function called: ID = 2 NAME = Allen AGE = 25 ADDRESS = Texas SALARY = 15000.0 Callback function called: ID = 3 NAME = Teddy AGE = 23 ADDRESS = Norway SALARY = 20000.0 Callback function called: ID = 4 NAME = Mark AGE = 25 ADDRESS = Rich-Mond SALARY = 65000.0 Operation done successfully
以下C代碼段顯示了如何使用DELETE語句刪除任何記錄,然后從COMPANY表中獲取并顯示其余記錄。
#include <stdio.h> #include <stdlib.h> #include <sqlite3.h> static int callback(void *data, int argc, char **argv, char **azColName) { int i; fprintf(stderr, "%s: ", (const char*)data); for(i = 0; i<argc; i++) { printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL"); } printf("\n"); return 0; } int main(int argc, char* argv[]) { sqlite3 *db; char *zErrMsg = 0; int rc; char *sql; const char* data = "Callback function called"; /* 打開數(shù)據(jù)庫 */ rc = sqlite3_open("test.db", &db); if( rc ) { fprintf(stderr, "無法打開數(shù)據(jù)庫: %s\n", sqlite3_errmsg(db)); return(0); } else { fprintf(stderr, "已成功打開數(shù)據(jù)庫\n"); } /* 創(chuàng)建合并SQL語句 */ sql = "DELETE from COMPANY where ID=2; " \ "SELECT * from COMPANY"; /* 執(zhí)行SQL語句 */ rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg); if( rc != SQLITE_OK ) { fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); } else { fprintf(stdout, "Operation done successfully\n"); } sqlite3_close(db); return 0; }
編譯并執(zhí)行上述程序后,將產(chǎn)生以下結果。
已成功打開數(shù)據(jù)庫 Callback function called: ID = 1 NAME = Paul AGE = 32 ADDRESS = California SALARY = 20000.0 Callback function called: ID = 3 NAME = Teddy AGE = 23 ADDRESS = Norway SALARY = 20000.0 Callback function called: ID = 4 NAME = Mark AGE = 25 ADDRESS = Rich-Mond SALARY = 65000.0 Operation done successfully