C言語(Windows環境)からMySQL #2 サンプルソース編
C言語(Windows環境)からMySQL #2 サンプルソース編
C言語(Windows環境)からMySQL #2 サンプルソース編
前回に引き続き、Windows環境でC言語を使っていて不意にMySQLとの接続をしたくなったものの、検索してもWindowsのコマンドプロンプト(文字コード:cp932)からC言語でMySQLにアクセスしているサンプルがあまり見当たらない(見つかってもコンパイラが違っていたり、Visual Studioを使っていたり、コマンドプロンプトベースじゃなかったりして筆者の環境に合わない)ので、試行錯誤をした結果を備忘録代わりにメモ。
コピペでサンプルが動かないなら自力でサンプルを作ればいいじゃない
なお、今回は安全性や動作速度などは一切考えずにあくまでも「Windowsのコマンドプロンプトから直接MySQLを使えるプログラムをC言語で作る」ことに注力しています。
セキュリティ面や動作速度、バグの有無などは考慮に入れていませんので参考にする場合はそのあたりにはお気を付けの上、自己責任で利用してください。
開発環境
C言語
C言語の環境はこちらー>環境導入前編 環境導入後編 おまけその1 おまけその2
MySQLの環境は以下のものを用意しました。
MySQL 5.5.56(zip形式のものをダウンロード、解凍して使用)
Connector/Cは以下のものを用意しました。
Connector/C 6.1.10(zip形式のものをダウンロード、解凍して使用)
本記事は以上の環境を前提に説明を行います。
C言語からMySQLを利用する手順
C言語からMySQLを利用する手順
C言語からMySQLを利用するための手順は大雑把に書くと以下の通りです。
3.ソースを書く ← 今回はココ
※ソース解説編はこちら
他の環境(Javaとか)から簡単に叩けるんだし、楽勝!!・・・と思ったら、コンパイルで思いっきり詰まって悔しかったのでメモに残したのは内緒。
前回は1,2を行ったので今回は3のソースを書いてみます。
3.ソースを書く
Windows環境でC言語を利用してMySQLを使用する準備ができた(はずな)ので今回はソースコードを書きます。
早速ですが、ソースコードはこちら↓(Sample.c)※一部修正しました。2017-07-06 15:30
#include <stdio.h> #include <stdlib.h> #include "mysql.h" int main(void){ MYSQL *conn; MYSQL_RES *res; MYSQL_ROW row; const char query[256] = "SELECT `table_name`.`id`, `table_name`.`sample_column`, `table_name`.`date_time` FROM `db_name`.`table_name`"; const char *SERV = "localhost"; const char *USER = "user_name"; const char *PASSWORD = "password"; const char *DB_NAME = "db_name"; const unsigned int PORT = 3306; /* 2017-07-06 15:30 追加 */ conn = mysql_init(NULL); mysql_options(conn, MYSQL_SET_CHARSET_NAME, "cp932"); /* 2017-07-06 修正前 */ /* if( !mysql_real_connect(conn,SERV,USER,PASSWORD,DB_NAME,3306,NULL,0) ){ fprintf(stderr, "%s\r\n", mysql_error(conn)); exit(-1); } */ /* 2017-07-06 修正後 */ if( !mysql_real_connect(conn,SERV,USER,PASSWORD,DB_NAME,PORT,NULL,0) ){ /* ポート番号を定数PORTで指定する形に変更 */ fprintf(stderr, "%s\r\n", mysql_error(conn)); exit(-1); } /* 修正箇所は以上です */ if( mysql_query( conn, query) ){ fprintf(stderr, "%s\r\n", mysql_error(conn)); exit(-1); } res = mysql_use_result(conn); while( NULL != (row = mysql_fetch_row(res)) ){ unsigned int col; for(col = 0; col < mysql_num_fields(res); col++){ printf("%s ", row[col]); } printf("\r\n"); } if(NULL != res){ mysql_free_result(res); } if(NULL != conn){ mysql_close(conn); } return 0; }
細かい説明は置いといて、書き終わったらソースコードを配置します。前回準備したファイルと併せて以下のように配置しました。
MySQLサンプル用フォルダ
┠Sample.c(ソースコード)
┠Makefile(makeファイル)
┃
┣mysql-5.5.56-winx64(MySQL本体のフォルダ)
┃ ┣(省略)
┃ ┣bin(★)
┃ ┣include(★)
┃ ┗lib(★)
┃
┗mysql-connector-c-6.1.10-winx64(connector Cのフォルダ)
┣(省略)
┣bin(※)
┣include(※)
┗lib(※)
これでひとまずソースも書けたし、あとはコンパイルするだけ(^^
gcc Sample.c
これでうまく。。。
いかないΣ(゜O゜
なぜ!?
筆者のおすすめ記事
MinGW-w64とmsys2で作るC言語環境構築
C言語練習問題一覧
C言語でBINGOを作ろうシリーズ記事一覧
実践力が身につくC言語講座 連載リンク
競技プログラミングをイメージしたライブラリ活用講座
競技プログラミング風-標準Cライブラリ入門 連載
アルゴリズムをマスターして技術力アップ!
実践アルゴリズム講座 連載
パズルゲームの解析をテーマにしたC++講座
ゲーム解析プログラミング 連載