メモ帳

メモ帳です.

C++ から MySQL のデータベースに接続する

MySQL

MySQLオープンソースで公開されている RDBMS の1つです.色々なアプリケーションで用いられていますが,C++ のプログラムから MySQL に接続する方法を紹介する記事が少なかったので,実際にソースコードを示しながらまとめたいと思います.
C++ のプログラムからデータベースを操作するには Connector/C++ を用います.
下記のリンクからダウンロード可能です.

MySQL :: Download Connector/C++

実行環境は Mac OS X (10.11) ですが,おそらく Linux でも同様に実行可能だと思います.
C++C++11 を使用しています.

また,MySQL と Connector/C++ のインストールや SQL 構文の詳細については省略します.

Connector/C++

例として基本的な操作を行うプログラムのソースコードを添付します.

以下のテーブルを作成し, SELECT 文でデータを取得したデータを出力しています.

+------+--------+
| cid  | name   |
+------+--------+
|    1 | SIGMOD |
|    2 | VLDB   |
|    3 | ICDE   |
|    4 | KDD    |
+------+--------+

プログラムは次の通りです.

gist.github.com

実行結果は以下の通りになります.

conference table created.
0   cid = 1, name = 'SIGMOD'
1   cid = 2, name = 'VLDB'
2   cid = 3, name = 'ICDE'
3   cid = 4, name = 'KDD'

データベースとの接続は sql::mysql::MySQL_Driver クラスから生成した sql::Connection インスタンスで行います(20, 21 行).

SQL による問い合わせを実行するには sql::Statement を使用します(22 行).

データの追加(INSERT など)のように結果を返さない問い合わせは stmt->execute() で実行します(25~33 行).

一方,データの取得(SELECT など)のように結果を返す問い合わせは stmt->executeQuery() で実行し,結果は sql::ResultSet で受け取ります(35 行).

sql::ResultSet によってデータを取得すると,iterator を通じて各 row に対して操作を行うことができます(38~45 行).

res->getInt(column_num) は,column_num 列目の int 型の要素を取得します(index は 1 から開始).

res->getString(column_name) は,列名が column_name である string 型の要素を取得します.

まとめ

Connector/C++ を用いて MySQL のデータベースに接続しました.
基本的に sql::Statement の execute() か executeQuery() を用いて SQL の問い合わせを行います.

非常に簡易な説明なのでわかりにくいかと思いますが,詳しくは Document を読んでいただけたらと思います.

MySQL :: MySQL Connector/C++ Developer Guide :: 7 Getting Started with Connector/C++: Usage Examples

追記(2016/10/14)

本記事の内容をより詳しくまとめて Qiita に投稿しました.

qiita.com

ぜひこの記事についても参照してみてください.