標籤:sqlite database sql linux核心 linux
前面已經說了如何開啟和關閉資料庫,這次要說得是如何執行SQL語句,來建立一張表。
要用的的函數:
sqlite3_exec(sqlite3* db, const char *sql, sqlite_callback callback, void *data, char **errmsg)
參數:db:已經開啟的資料庫執行個體sql:SQL語句,是一個字串callback:是一個回呼函數data:做為回呼函數的第一個參數errmsg:用於帶回錯誤資訊
該回呼函數有兩種傳回值類型. 1.返回零:sqlite3_exec() 將繼續執行查詢. 2.返回非零:sqlite3_exec()將立即中斷查詢, 且 sqlite3_exec() 將返回 SQLITE_ABORT.
回呼函數的格式如下:int sqlite_callback( void* pv, /* 由 sqlite3_exec() 的第四個參數傳遞而來 */ int argc, /* 表的列數 */ char** argv, /* 指向查詢結果的指標數組, 可以由 sqlite3_column_text() 得到 */ char** col /* 指向表頭名的指標數組, 可以由 sqlite3_column_name() 得到 */);參數格式: 傳給sqlite3_exec的回呼函數,用來顯示查詢結果 對每一條查詢結果調用一次該回呼函數參數: pv:由sqlite3_exec傳遞的初始化參數 argc:表頭的列數 col:表頭的名字數組指標 argv:表頭的資料數組指標傳回值: 1:中斷尋找 0:繼續列舉查詢到的資料
執行個體:
#include <stdio.h>#include <stdlib.h>#include "sqlite/sqlite3.h"#define DB_NANE "sqlite/test.db"sqlite3 *db = NULL;char* sql = NULL;char *zErrMsg = NULL;int ret = 0;typedef enum{ false, true} bool;static int callback(void *NotUsed, int argc, char **argv, char **azColName){ int i = 0; for(i=0; i < argc; i++){ printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL"); } printf("\n"); return 0;}bool connectDB(){ ret = sqlite3_open(DB_NANE, &db); if( ret != SQLITE_OK){ fprintf(stderr, "Error open database: %s\n", sqlite3_errmsg(db)); sqlite3_free(zErrMsg); return false; } fprintf(stdout, "Successfully opened database\n"); return true;}
/* 相對於前篇文章添加了這個函數 */bool createTable(){ /* Create SQL statement */ sql = "CREATE TABLE COMPANY(" "ID INT PRIMARY KEY NOT NULL," "NAME TEXT NOT NULL," "AGE INT NOT NULL," "ADDRESS CHAR(50)," "SALARY REAL );"; /* Execute SQL statement */ ret = sqlite3_exec(db, sql, callback, 0, &zErrMsg); if( ret != SQLITE_OK ){ fprintf(stderr, "Error SQL: %s\n", zErrMsg); sqlite3_free(zErrMsg); return false; } fprintf(stdout, "Successfully table created\n"); return true;}bool closeDB(){ int ret = 0; ret = sqlite3_close(db); if ( ret == SQLITE_BUSY ){ return false; } return true;}int main(int argc, char* argv[]){ connectDB(); createTable();/*增加了一個函數調用*/ closeDB(); return 0;}
這個函數只能執行一次,第二次執行會報錯說表已經存在,刪除產生的test.db可以再次執行。