前回までの話
今回は、前回作ったDBからデータを取得したいなーって話。
…できたらいいなー…。
プロジェクト作成
いつも通りVisual Studio2022で作ります。
今回ソリューション名はMySQLTest、プロジェクト名はMySQLTest1にします。

アプリケーションの種類をダイアログベースにして完了。

いきなりですが、ボタンを配置しておきます。
今回は接続したいだけなので、位置もIDも適当でいいです。

追加したボタンをダブルクリックして、
押下時に呼ばれる関数を作成しておきます。

とりあえず、ここまで。
プロパティの設定
続いて、プロパティの設定です。
プロジェクトメニューからMySQLTest1のプロパティを選択。
(もしくはソリューションエクスプローラーから、MySQLTest1を右クリックからのプロパティ)

インクルードディレクトリ追加
C/C++の「全般」を選択。
「追加のインクルードディレクトリ」を選択し、編集します。

「新しい行」を選択し、
MySQL Connector C++のincludeディレクトリパスを追加します。

パスを入れたらOKで完了。
ライブラリディレクトリ追加
リンカーの「全般」を選択。
「追加のライブラリ ディレクトリ」を選択し、編集します。

「新しい行」を選択し、
MySQL Connector C++のlibディレクトリパスを追加します。
次で設定しますが、要はmysqlcppconn.libを読み込みたいので、
libファイルがあるパスを今回設定します。
このバージョンの場合、libディレクトリではなくlib64ディレクトリとなっており、
更にもう一つ下の階層(vs14ディレクトリ下)に行かなければいけないので、
追加パスは画像のようになります。

パスを入れたらOKで完了。
依存ライブラリ追加
リンカーの「入力」を選択。
「追加の依存ファイル」を選択し、編集します。

ライブラリファイルを追加します。
追加するのは、先ほど話に合ったmysqlcppconn.lib。

追加してOKです。
プロパティページに戻ったら、適用、OKを押して画面を閉じます。
DB接続処理追加
ヘッダーファイル
必要なヘッダーファイルをインクルードします。
MySQLTest1Dlg.cppに以下を追加。
#include <mysql/jdbc.h>
#include <windows.h>一番最初のjdbc.h、中身開いて見ればわかると思いますが、
本来たくさんのヘッダーファイルをインクルードしなければいけないところ、
jdbc.hにまとめてくれています。

OnBnClickedButton1内の処理
一番最初に追加した、ボタン押下時の処理を書きます。
とりあえず、データ取得云々の前に、接続できるかのチェック。
void CMySQLTest1Dlg::OnBnClickedButton1()
{
sql::SQLString strHost = "tcp://127.0.0.1:3306"; // ホスト名
sql::SQLString strUser = "root"; // ユーザ名
sql::SQLString strPass = "password"; // パスワード
// ※パスワードは、前回設定したものを入れる
try
{
// MySQLドライバのインスタンス取得
sql::mysql::MySQL_Driver* driver = sql::mysql::get_mysql_driver_instance();
// DB接続情報を設定。
std::unique_ptr<sql::Connection> con(driver->connect(strHost, strUser, strPass));
//ここまで来たら、接続できた
AfxMessageBox(_T("接続成功"));
}
catch (sql::SQLException& e)
{
// 接続できなかった
CString errorMessage = _T("");
errorMessage.Format(_T("エラー: %s\r\nエラーコード: %d"), CString(e.what()), e.getErrorCode());
AfxMessageBox(errorMessage, MB_OK | MB_ICONERROR);
}
}パスワードは便宜上passwordで載せてますが、
本来はMySQL Serverインストール時に設定したものを入れます。
std::unique_ptr<sql::Connection>を使って、Connectionオブジェクトを生成しています。
例外が発生した場合、自動的にリソース解放してくれるらしいです。
ここで一度ビルドします。
exe起動
起動自体は当然でき…

ない!!
出鼻くじかれたー(´・ω・`)
対処法1 dllをexeと同じパス内に入れる
C:\Program Files\MySQL\MySQL Connector C++ 8.0\lib64へ飛びます。
そこから、mysqlcppconn-9-vs14.dllをコピー。
MySQLTest1.exeと同じ所へ貼り付けます。
ついでに、これをしたところで「まだ足りない」ってメッセージが出てきます。
なので、先ほどのdllも含めて、計3つdllをlib64ディレクトリからコピーします。
- libcrypto-1_1-x64.dll
- libssl-1_1-x64.dll
- mysqlcppconn-9-vs14.dll
これをMySQLTest1.exeがある場所にセット

これで起動すると

大丈夫そうです。
対処法2 dllをC:\Windows\System32に入れる
3つのファイルをC:\Windows\System32に貼り付けます。
これでも起動を確認できました。
対処法3 PATH環境変数に追加
環境変数からPATHを選択し、
環境変数名の編集でlib64までのパスを追加します。

こちらでも開けました。
接続実行
さて、いよいよボタンを押して接続を試します。

あっるぇ??
catch文の方に入ってますね。
原因調査
じつはこれ、2カ月ほど前に試してから今に至るまで、
ずっと解決できませんでした。
とりあえず確認すること。
ホスト名・ユーザ名・パスワードが間違ってないか
真っ先に確認することですね。
何度も読み返しますが、間違ってる気配ななさそうで。
MySQL Serverが動いているか
サービスを起動し、MySQL80の項目を確認します。

実行中ですね。
ファイアウォール設定確認
ポート3306へのアクセス許可を設定します。
Windows Defender ファイアウォールから、詳細設定。
受信側の規則で3306を許可します。

これでも接続できません。
セキュリティソフトを切る
ウイルスバスタークラウドを入れているので、一度停止し、再度起動。
変わらず。
bind-addressを設定
調べたら、my.iniに127.0.0.1を設定する方法もあるみたいですが。
隠しファイルからmy.iniを見つけ出し開いて見ると、
bind-addressが設定されていないんですよね。
これってつまり、MySQLはすべてのIPアドレスからの接続を受け入れているってことらしいので、
そもそもいじらなくてもよさそう…?
DB接続権限
rootユーザの設定変更はしていないはずなので、接続はできるはず。
一応SQL文を打って確認
mysql> SHOW GRANTS FOR 'root'@'localhost';
exeを管理者で起動
ダメもとで試しましたが、やはりダメです。
PC再起動
変わらず。
Releaseモードでビルド
Releaseモードにした場合、
インクルードディレクトリやライブラリディレクトリの設定を再度行う必要があるので、
プロパティから3種設定しなおします。
さて起動…。

!!!???
驚いた理由
先ほども書きましたが、2カ月間ずっとここで躓いていました。
この記事を書く前、何度もソリューションやプロジェクトを作って試していました。
当然Releaseモードバージョンも試していたのですが、
繋がることはなかったのです。
そして今回、記事を書くためにいつも通り、
処理を試しながら並行で執筆しています。
Releaseモードの項を書く際
「これもダメだったよなー」
と思いながらexe作っていざ実行すると…。
ちょっと感動( ;∀;)
というか、次回は別の処理でDB接続する記事を書く予定だったのに、
成功しちゃったどうしよう…。
原因調査 2
とはいえ、偶然つながった、とかでは
それは成功したのかと言えるのかは甚だ疑問なので、少しだけつながった原因を考えます。
思い当たるものとしてはただ一つ。
MySQL ServerとMySQL Connector C++のバージョンを8.x.xにした。
前回チラッと書きましたが、
この記事執筆時点で上二つの最新は9.0.0です。
そのほかは8.x.x。
記事を書く前まで試していた環境は
ServerとConncectorが9.0.0でした。
記事書く際には
「ちゃんとバージョンは揃えた方がいいよなー」
と軽い気持ちでアンスト&インストを行ったのですが。
まぁ正直な話、
これが原因かと言われると根拠は出せません。
どうしようかと考えた末、
とりあえず当初試す予定だった別案を一度記事にします。
それで、このReleaseモードで成功した方法でも
ちゃんとテーブル操作できるかを記事にしたいです。
なんかわからないけど、ひとまず胸のつっかえがなくなったというか…。
ホントなんでDebugモードだとできないんだか。
とりあえず、今回はここまで。

コメント