C++からSQLite3を使用してみる。
まずソースコードをダウンロードするが、.hと.cの構成になっており、プロジェクトに組み込んでビルドするので、CMakeやlibのlinkなどはしない。
まず、以下からSource Codeをダウンロード。
https://www.sqlite.org/download.html
展開して、sqlite3.cをプロジェクトに追加。以下のコードを実行すると、カレントディレクトリにwebsites.dbが作成される。
#include "sqlite3.h" #include <iostream> int main() { int result; sqlite3* database; result = sqlite3_open("websites.db", &database);// ファイルを開く if (result) { std::cerr << "失敗 " << sqlite3_errmsg(database) << std::endl; return(0); } const char* sql_query; sql_query = "CREATE TABLE WEBSITES(" "SITE_NAME TEXT NOT NULL," "URL TEXT NOT NULL," "ACCESS_COUNT INT NOT NULL);" ; // SQL実行 char* errormsg = 0; result = sqlite3_exec(database, sql_query, 0, 0, &errormsg); if (result != SQLITE_OK) { std::cerr << "失敗: " << errormsg << std::endl; sqlite3_free(errormsg); } sqlite3_close(database);// ファイルを閉じる }
#include "sqlite3.h" #include <iostream> #pragma warning(disable:4996)
// データを追加
void insert(sqlite3* database, const char* site_name, const char* url, int access_count) { char* errormsg = 0; char query[1024]; sprintf(query, "INSERT INTO WEBSITES VALUES('%s', '%s', %d);", site_name, url, access_count); int result = sqlite3_exec(database, query, 0, 0, &errormsg); if (result != SQLITE_OK) { std::cerr << "失敗: " << errormsg << std::endl; sqlite3_free(errormsg); } }
////////////////////////////////////////////////// ////////////////////////////////////////////////// //////////////////////////////////////////////////
// sqlite3_execで、抽出したデータ一軒ごとにこのコールバック関数が呼び出される int callback_per_row(void* NotUsed, int argc, char** argv, char** azColName) { // 一軒分のデータを表示する // 今回は、SITE_NAME , URL , ACCESS_COUNT の三つのカラムがあるので、argc==3 となる for (int i = 0; i < argc; i++) { const char* column_name = azColName[i]; const char* value = argv[i]; // 値は NULL があり得るので、その場合は NULL と表示する if (value != nullptr) { std::cout << column_name << " == " << value << std::endl; } else { std::cout << column_name << " == NULL" << std::endl; } } std::cout << "\n"; return 0; }
// WHERE SITE_NAME で SELECT する void getitem(sqlite3* database ,const char* sitename) { char* errormsg = nullptr; // SQLクエリ char sql_query[1024]; sprintf(sql_query,"SELECT * FROM WEBSITES WHERE SITE_NAME = '%s';",sitename); // SQLクエリ実行 int result = sqlite3_exec(database, sql_query, callback_per_row, 0, &errormsg); if (result != SQLITE_OK) { std::cerr << "失敗: " << errormsg << std::endl; sqlite3_free(errormsg); } }
////////////////////////////////////////////////// ////////////////////////////////////////////////// ////////////////////////////////////////////////// int main() { int result; sqlite3* database; result = sqlite3_open("websites.db", &database); if (result) { std::cerr << "失敗 " << sqlite3_errmsg(database) << std::endl; return(0); } const char* sql_query; sql_query = "CREATE TABLE WEBSITES(" "SITE_NAME TEXT NOT NULL," "URL TEXT NOT NULL," "ACCESS_COUNT INT NOT NULL);" ; // SQL実行 char* errormsg = nullptr; result = sqlite3_exec(database, sql_query, 0, 0, &errormsg); if (result != SQLITE_OK) { std::cerr << "失敗: " << errormsg << std::endl; sqlite3_free(errormsg); } insert(database, "Google", "http://www.google.com", 0); insert(database, "Yahoo!", "http://www.yahoo.co.jp", 5); insert(database, "Amazon", "http://www.amazon.co.jp", 10); insert(database, "Facebook", "http://www.facebook.com", 15); insert(database, "Twitter", "http://www.twitter.com", 20); getitem(database,"Amazon"); sqlite3_close(database); }