C言語でSQLite,データを取得(抽出)する(exec)-2

スポンサーリンク

鍛錬 236

C言語でSQLite,データを取得(抽出)する (exec)-2

C言語で SQLite3 を操作して、データを取得(抽出)する方法についてです。
 
本記事では、sqlite3_exec() でデータを取得する際に、sqlite3_exec() の第4引数を使用する場合について記述しています。

第4引数を使用しない場合(NULLを指定する場合)については、別の記事にて記述しています。

関連記事:C言語でSQLite3,データを取得・抽出する(exec)

サンプルデータ

以下は、今回使用するサンプルデータです。

sqlite> 
sqlite> select * from fruits;
id   fruits_name   price 
---  ------------  ------
1    apple         300   
2    orange        250   
3    grape         500   
4    banana        350   
5    peach         700

プログラム

以下は、データを取得するプログラム、select_table.c です。

今回は、データベースファイル /var/tmp/fruits.db の、テーブル fruits のデータを取得しています。

また、sqlite3_exec() の第4引数について用途が思い浮かばなかったので、今回は数値の 123 を引数として渡して、コールバック関数で表示させるのみとしました。

// include
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sqlite3.h>

// prototype
int Sqlite3ExecCallback(void *cb_arg, int column_count,
						char **data, char **column_name);

// main
int main(void)
{
	char db_name[256] = "";
	char sql_str[256] = "";
	char *errmsg = '\0';
	int tmp_int;
	int ret;
	
	sqlite3 *db = NULL;
	
	strncpy(db_name, "/var/tmp/fruits.db", sizeof(db_name) - 1);
	
	// オープン
	ret = sqlite3_open(db_name, &db);
	if (ret != SQLITE_OK) {
		printf("ERROR,sqlite3_open(),%s\n", sqlite3_errmsg(db));
		
		exit(EXIT_FAILURE);
	}
	
	// SQLステートメントを作成
	strncpy(sql_str,
			"select * from fruits",
			sizeof(sql_str) - 1
			);
	
	// sqlite3_exec()の第4引数で使用
	tmp_int = 123;
	
	// SQLステートメントを実行
	ret = sqlite3_exec(db, sql_str, Sqlite3ExecCallback, &tmp_int, &errmsg);
	if (ret != SQLITE_OK) {
		printf("ERROR,sqlite3_exec(),%s\n", errmsg);
		
		// クローズ
		sqlite3_close(db);
		
		// エラーメッセージのメモリ領域を解放
		sqlite3_free(errmsg);
		
		exit(EXIT_FAILURE);
	}
	
	// クローズ
	ret = sqlite3_close(db);
	if (ret != SQLITE_OK) {
		printf("ERROR,sqlite3_close(),%s\n", sqlite3_errmsg(db));
		
		exit(EXIT_FAILURE);
	}
	
	printf("\n");
	printf("SUCCESS,select table\n");
	
	return 0;
}

// ==================================================
// @brief      sqlite3_exec()のコールバック関数
// @param[in]  cb_arg        sqlite3_exec()の第4引数
// @param[in]  column_count  カラム(列)数
// @param[in]  data          データ
// @param[in]  column_name   カラム(列)名
// @return     0 -> 成功
// @note       無し
// ==================================================
int Sqlite3ExecCallback(void *cb_arg, int column_count,
						char **data, char **column_name)
{
	int i;
	int *db_type;
	
	db_type = (int *)cb_arg;
	
	printf("-------------------------------\n");
	printf("sqlite3_exec() の第4引数 = %d\n", *db_type);
	for (i = 0; i < column_count; i++)
		printf("%s,%s\n", column_name[i], data[i]);
	
	return 0;
}

実行結果

以下は、上記のプログラム select_table.c を実行してデータを取得しています。

***@ubuntu:~/***/test/sqlite3$ 
***@ubuntu:~/***/test/sqlite3$ gcc -Wall -Wextra select_table.c -o select_table -lsqlite3 -L/usr/lib/x86_64-linux-gnu -I/usr/include
***@ubuntu:~/***/test/sqlite3$ ./select_table
-------------------------------
sqlite3_exec() の第4引数 = 123
id,1
fruits_name,apple
price,300
-------------------------------
sqlite3_exec() の第4引数 = 123
id,2
fruits_name,orange
price,250
-------------------------------
sqlite3_exec() の第4引数 = 123
id,3
fruits_name,grape
price,500
-------------------------------
sqlite3_exec() の第4引数 = 123
id,4
fruits_name,banana
price,350
-------------------------------
sqlite3_exec() の第4引数 = 123
id,5
fruits_name,peach
price,700

SUCCESS,select table

 
上記に示した通り、sqlite3_exec() の第4引数である、数値の 123 をコールバック関数に渡していることが確認できました。

スポンサーリンク

シェアする

フォローする