sqlite3_exec函數的使用

sqlite3_exec函數的使用sql

sqlite3數據庫是一個小型的關係型的數據庫,以文件的方式存在,打開文件便是打開數據庫,它小巧且功能強大,在嵌入式領域內使用很廣.如今就介紹一下其中一個重要函數的使用:數據庫

int sqlite3_exec(sqlite3 *db, const char *sql, sqlite3_callback callback, void *,char **errmsg);ide

功能:執行sql語句函數

參數:測試

db:數據庫句柄spa

sql:sql語句指針

callback:回調函數,每成功執行一次sql語句就執行一次callback函數code

void *:給回調函數傳的參數sqlite

errmsg:錯誤信息blog

回調函數的定義:

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

很明顯這是一個函數指針,具體說明參見程序註釋,如今貼出程序,程序註釋比較詳細,很容易看懂,我就很少說了.程序執行的前提是我在本目錄下有一個提早建立好的有兩個數據條目的名字叫environment的數據表在數據庫文件db.db中

clip_image002

/**************************************************

* 文件名稱:main.c

* 文件描述:測試sqlite3的sqlite3_exec函數的回調函數

* 文件做者:by Wang.J,in 2013.11.06

* 文件版本:1.0

* 修改記錄:

**************************************************/

#include <stdio.h>

#include <stdlib.h>

#include <sqlite3.h>

#define DB_PATH "./db.db"

/*=======================================

* 函數名稱:open_db

* 函數功能:打開數據庫文件

* 函數參數:const char *path 數據庫文件路徑

* 返 回 值:成功 sqlite3*

失敗 NULL

* 創 建 人:by Wang.J,in 2013.11.06

* 修改記錄:

========================================*/

sqlite3 * open_db(const char *path)

{

sqlite3 *db = NULL;

int ret = 0;

ret = sqlite3_open(DB_PATH, &db);

if (SQLITE_OK != ret) {

printf("%s:數據庫打開出錯.\n錯誤緣由:%s\n",

__FUNCTION__, sqlite3_errmsg(db));

sqlite3_close(db);

return NULL;

}

printf("%s:數據庫打開成功\n", __FUNCTION__);

return db;

}

/*===================================================

* 函數名稱:close_db

* 函數功能:關閉數據庫文件

* 函數參數:sqlite3 *

* 返 回 值:void

* 創 建 人:by Wang.J,in 2013.11.06

* 修改記錄:

====================================================*/

void close_db(sqlite3 *db)

{

if (NULL != db)

sqlite3_close(db);

printf("%s:數據庫關閉成功\n", __FUNCTION__);

return;

}

/*======================================================

* 函數名稱:callback

* 函數功能:sqlite3_exec的回調函數

* 函數參數:void *param 傳遞給callback回調函數的參數

對應於sqlite3_exec函數的第四個參數

int f_num 查找到的記錄中包含的字段數目

char **f_value 包含查找到每一個記錄的字段值

char **f_name 包含查找到每一個記錄的字段名稱

* 返 回 值:成功返回0

失敗返回-1

* 創 建 人:by Wang.J,in 2013.11.06

* 修改記錄:

=======================================================*/

int callback(void *param, int f_num, char **f_value, char **f_name)

{

printf("%s:這是回調函數!\n", __FUNCTION__);

return 0;

}

int main(void)

{

char sql[512];

sqlite3 *db = NULL;

char *err_msg;

int ret = 0;

printf("函數開始\n");

sprintf(sql, "SELECT * FROM environment;");

db = open_db(DB_PATH);

ret = sqlite3_exec(db, sql, callback, NULL, &err_msg);

printf("函數返回值:%d\n", ret);

if (0 != ret) {

//printf("函數執行失敗\n");

perror("函數執行失敗\n");

return -1;

}

close_db(db);

printf("函數結束\n");

return 0;

}

程序執行結果

clip_image004

結果爲預期結果.

如今看看給回調函數傳參:

/**************************************************

* 文件名稱:main.c

* 文件描述:測試sqlite3的sqlite3_exec函數的回調函數

* 文件做者:by Wang.J,in 2013.11.06

* 文件版本:1.0

* 修改記錄:

**************************************************/

#include <stdio.h>

#include <stdlib.h>

#include <sqlite3.h>

#define DB_PATH "./db.db"

/*=======================================

* 函數名稱:open_db

* 函數功能:打開數據庫文件

* 函數參數:const char *path 數據庫文件路徑

* 返 回 值:成功 sqlite3*

失敗 NULL

* 創 建 人:by Wang.J,in 2013.11.06

* 修改記錄:

========================================*/

sqlite3 * open_db(const char *path)

{

sqlite3 *db = NULL;

int ret = 0;

ret = sqlite3_open(DB_PATH, &db);

if (SQLITE_OK != ret) {

printf("%s:數據庫打開出錯.\n錯誤緣由:%s\n",

__FUNCTION__, sqlite3_errmsg(db));

sqlite3_close(db);

return NULL;

}

printf("%s:數據庫打開成功\n", __FUNCTION__);

return db;

}

/*===================================================

* 函數名稱:close_db

* 函數功能:關閉數據庫文件

* 函數參數:sqlite3 *

* 返 回 值:void

* 創 建 人:by Wang.J,in 2013.11.06

* 修改記錄:

====================================================*/

void close_db(sqlite3 *db)

{

if (NULL != db)

sqlite3_close(db);

printf("%s:數據庫關閉成功\n", __FUNCTION__);

return;

}

/*======================================================

* 函數名稱:callback

* 函數功能:sqlite3_exec的回調函數

* 函數參數:void *param 傳遞給callback回調函數的參數

對應於sqlite3_exec函數的第四個參數

int f_num 查找到的記錄中包含的字段數目

char **f_value 包含查找到每一個記錄的字段值

char **f_name 包含查找到每一個記錄的字段名稱

* 返 回 值:成功返回0

失敗返回-1

* 創 建 人:by Wang.J,in 2013.11.06

* 修改記錄:

=======================================================*/

int callback(void *param, int f_num, char **f_value, char **f_name)

{

printf("%s:這是回調函數!\n", __FUNCTION__);

printf("%s:回調函數的參數內容:%s\n\n", __FUNCTION__, (char *)param);

return 0;

}

int main(void)

{

char sql[512];

sqlite3 *db = NULL;

char *err_msg;

int ret = 0;

printf("函數開始\n");

sprintf(sql, "SELECT * FROM environment;");

db = open_db(DB_PATH);

ret = sqlite3_exec(db, sql, callback, "回調函數參數,來自主程序", &err_msg);

printf("函數返回值:%d\n", ret);

if (0 != ret) {

//printf("函數執行失敗\n");

perror("函數執行失敗\n");

return -1;

}

close_db(db);

printf("函數結束\n");

return 0;

}

執行結果:

clip_image006

依舊沒問題.

OK!基本就這些了.