スポンサーリンク

C++からSQLite3を使う

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);// ファイルを閉じる
}

INSERT, SELECTをしてみる

#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);
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: