C言語(Windows環境)からMySQL #6 トラブルシュート編
C言語(Windows環境)からMySQL #6 トラブルシュート編
C言語(Windows環境)からMySQL #6 トラブルシュート編
~前回までのあらすじ~
Windowsのコマンドプロンプト(文字コード:cp932)からC言語でMySQLにアクセスしたい!!と思い立った勇者筆者はついに実行ファイルを完成させ、魔法の呪文プログラムの内容を解説したのだった。
しかしSample.exeを実行すると様々なトラブルが襲い掛かってきた!!
そこで勇者筆者はSample.exe実行時のトラブルシュートをしようと決意するのだった…。
コピペでサンプルが動かないなら自力でサンプルを作ればいいじゃない(^お^
なお、今回は安全性や動作速度などは一切考えずにあくまでも「Windowsのコマンドプロンプトから直接MySQLを使えるプログラムをC言語で作る」ことに注力しています。
セキュリティ面や動作速度、バグの有無などは考慮に入れていませんので参考にする場合はそのあたりにはお気を付けの上、自己責任で利用してください。
って、急にまじめに戻ってるYO!!
開発環境
C言語
C言語の環境はこちらー>環境導入前編 環境導入後編 おまけその1 おまけその2
MySQLの環境は以下のものを用意しました。
MySQL 5.5.56(zip形式のものをダウンロード、解凍して使用)
Connector/Cは以下のものを用意しました。
Connector/C 6.1.10(zip形式のものをダウンロード、解凍して使用)
本記事は以上の環境を前提に説明を行います。
C言語からMySQLを利用する手順
C言語からMySQLを利用する手順
C言語からMySQLを利用するための手順は大雑把に書くと以下の通りです。
おまけ:実行時のエラーと対処法 ← 今回はココ
他の環境(Javaとか)から簡単に叩けるんだし、楽勝!!・・・と思ったら、コンパイルで思いっきり詰まって悔しかったのでメモに残したのは内緒。
前回までで5の実行まで+ソースコードの解説が無事終りました。めでたしめでたし。。。?
・・・えっ、実行したら
Can't connect to MySQL server on 'localhost' (10061)
とか
Access denied for user 'user_name'@'localhost' (using password: YES)
とか
SELECT command denied to user 'user_name'@'localhost' for table 'table_name'
とか
Table 'db_name.table_name' doesn't exist
とか
…
って言われたって?それはデータベース側に原因が(モゴモゴ
今回はその原因と対処法です。
エラーの原因&解決法
上記4つのエラーの原因と解決法をサクッと載せておきます。
※全部を載せているとキリがないので良く出てきそうな4つを挙げてみました。
【1】MySQLにつながらないパターン
Can't connect to MySQL server on 'localhost' (10061)
上記のように出てきた場合はMySQLへの接続に失敗しています。localhostさんってどなたですか?MySQLさんっておいしいの??
主な原因としては
1.MySQLが設置してあるサーバのホスト名またはIPアドレス(ソースコード中の localhost となっていた部分)が間違っている
2.そもそもMySQLが起動していない
あたりが考えられます。
対処法としては
・ホスト名やIPアドレス、ポート番号に間違いが無いか確認する
→→ 間違いがないかどうかよく確認して、よ~く確認して、よ~~~~~く確認してみましょう。綴り間違いとか綴り間違いとか綴り間違いとか
・MySQLが稼働している(はず)のPCで直接MySQLが使えるかどうか調べる
→→ 使えない場合はMySQLが起動していない可能性があります。 うっかり電源入れ忘れてたお(0ω0
・MySQLの稼働しているサーバとは別のPCのコマンドプロンプトなどからMySQLにアクセスし、MySQLが使えるかどうか調べる
→→ 使えない場合、外部からのアクセスを拒否する設定になっていないか確認しましょう。MySQLだけでなく、サーバそのものがアクセスを拒否している可能性もあるので要注意。ファイヤウォールとかファイヤウォールとかファイヤウォールとか
といった対処になります。
【2】MySQLにアクセス拒否されるパターン
Access denied for user 'user_name'@'localhost' (using password: YES)
上記のように出てきた場合はMySQLへのアクセスには一応成功していますが、MySQL側にアクセス拒否されています。いやぁぁぁぁぁ(X_X)来ないでぇぇぇぇぇ
主な原因としては
1.ユーザ名が間違っている
2.パスワードが間違っている
3.アクセスする相手を間違えている
あたりが考えられます。
対処法としては
・ユーザ名とパスワードに間違いがないか確認する
→→ よ~~~~~~~~~~く確認して(ry
・同じユーザ名とパスワードでMySQLが稼働しているPCから直接MySQLが使えるかどうか調べる
→→ 使える場合、MySQLのユーザのアクセス可否の設定を確認しましょう。ただし、むやみに許可を出すとセキュリティ上大きなリスクが生じる可能性があります。設定は計画的に。
・MySQLが稼働しているPCのホスト名やIPアドレスを確認する
→→ もしソースコードで設定していたものと違うホスト名/IPアドレスだった場合、全く違うPCのMySQLにアクセスしている可能性があります。自身で判断した上で必要な対応をしてください。 おぢゃましました(゜ω゜)ミ
といった対処になります。
【3】MySQLにはアクセスできたが、データベースを操作する権限が無いパターン
SELECT command denied to user 'user_name'@'localhost' for table 'table_name'
上記のように出てきた場合はMySQLにアクセスしているユーザにはデータベースを操作する権限がありません。Don’t touch me ┗(゜n゜)
この例では user_name というユーザ には table_name というテーブルに対して SELECT 文を実行する権限が無いことを表しています。
主な原因としては
1.該当のユーザの権限が適切に設定されていない
あたりが考えられます。1個だけかい! ┗(゜O゜)
対処法としては
→→ GRANT文などを使用して適切に権限を設定する
といった対処になります。 決め打ちかい!! ┗(゜O゜)
【4】テーブルが存在しないパターン
Table 'db_name.table_name' doesn't exist
上記のように出てきた場合は該当のテーブルが存在していないことになります。404 エラーとちょっと似てる?かも
主な原因としては
1.テーブル名を間違えている
2.テーブルが存在しない
あたりが考えられます。 特に綴り間違いに注意!!! ┗(゜O゜)
対処法としては
・テーブルの綴りを確認する
→→ テーブル名をよ~~~~~~~~~~~~~~~~~~~~く確認しましょう。
・そもそもテーブルがあるのか確認する
→→ そもそもテーブルが存在しないと使えません。MySQLをが動いているPCでSHOW TABLESを打つなどして、テーブルがあるのかどうか確認しましょう。無いものは使えない!!(゜_゜)
といった対処になります。
改めて実行!!
改めて実行の準備が整ったので、もう一度実行してみましょう。
Sample.exe
これで見事実行出来ます(^ω^)
た・だ・し、データベースにデータががきちんと入っていればね (゜∀゜
(次回、データ投入編へ続く)
筆者のおすすめ記事
MinGW-w64とmsys2で作るC言語環境構築
C言語練習問題一覧
C言語でBINGOを作ろうシリーズ記事一覧
実践力が身につくC言語講座 連載リンク
競技プログラミングをイメージしたライブラリ活用講座
競技プログラミング風-標準Cライブラリ入門 連載
アルゴリズムをマスターして技術力アップ!
実践アルゴリズム講座 連載
パズルゲームの解析をテーマにしたC++講座
ゲーム解析プログラミング 連載