[Delphi]MySQLへの接続で失敗(未解決)
トップページへ
※未解決です。また、同じトラブルに遭う可能性が高いので、備忘録として残しました。
発生する環境(当方の環境)
古いDelphi(楽天市場で探す ・ amazonで探す)のみ
(新しいDelphiではこの記事は該当しません。その理由はFireDACという最新アクセスライブラリが対応しているからです)
オープンソースのMySQL(サーバーは5.7)
概要
Delphiで作成したアプリから、自社のMySQLサーバーへのアクセスを試みる。
結果
接続できず失敗
考えられる原因
1 手持ちのDelphiのバージョンが古く、最近のMySQLに対応していない
2 自分が利用するMySQLサーバーにファイアーウォールがかけられていて、PC上にある自作のDelphiアプリからの接続を拒否している
3 ただし、自分のWebサーバー上に置いた自作PHP(楽天市場で探す ・ amazonで探す)からの接続は可能だった
よって、原因は「1」または「1および2」と考えられる。したがって、Delphiのバージョンが最新ならトラブルなく接続できる可能性があり、それでも不可なら、自分が利用しているMySQLサーバーがローカルPC内のアプリからの接続を拒否していると判断できる。
再現手順
1 フォーム上に TSQLConnectionを1個, TButtonを2個配置
2 TSQLConnectionの下記の項目に設定値を入れる
HostName
DataBase
UserName
PassWord
ServerCharset 私はutf8
3 TButton1のOnClickで
SQLConnection1.Open;
を実行する
(TButton2では同様に SQLConnection1.Close; を記述していたが実行できず)
4 すると下記のエラーが表示された
Cannot load LIBMYSQL.dll library (error code 126). The LIBMYSQL.dll library may be missing from the system path or you may have an incompatible version of the libray installed.
要するに「Delphiに付属しているLIBMYSQL.dllが非互換です」という訳です。
5 ネットの先輩ら下記の情報から
http://delphidevelop.blog.fc2.com/blog-entry-11.html
ヒント: RAD Studio IDE は 32 ビットで動作します。このため、MySQL 8.0 に接続できません(これは 64 ビットでのみ使用可能なため)。 この接続の問題を回避するため、MySQL の 32 ビットの最新版である MySQL 5.7.29 を使用することができます。
自分のDelphiと互換性のある LIBMYSQL.dll を探すが必要があると判明
6 MySQLのダウンロード→Download Archivesの中の
MySQL Community Server (Archived Versions)
からダウンロード。複数のバージョンがあるので
6-A MySQLは自分のDelphiの公開時期(*)に近いバージョンをダウンロード
*C:\Program Files (x86)\Embarcadero\RAD Studio
フォルダ内のファイル群の更新日時を参考にしました
6-B 自分のDelphiで作成したアプリは32ビットなので、MySQLもWindows用の32ビット版を選ぶ
(私は自分のDelphiのバージョンとほぼ同じ時期の「mysql 5.1.39/32bit」を選びましたが、これが正解えではありません、なぜなら個人毎にDelphiのバージョンが異なるからです。ちなみに非互換のmysqlを選ぶと4のメッセージが消えません )
7 6でダウンロードし解凍またはセットアップしてできたフォルダ(*)内から LIBMYSQL.dll をコピー
*多くの場合「bin」フォルダ内にある。
8 ネット上では色々なやり方がありますが私は自分が作成アプリ(.exe)と同じフォルダ内に LIBMYSQL.dll をコピペ
9 自作アプリを実行すると4のエラーは消え、アプリが指定したホストへの接続を試みているのがわかった。
テストで意図的に4のエラーを出したい場合は、8でコピペした LIBMYSQL.dll を一時的に変名し、自作アプリを実行するだけです。その場合のソース編集、コンパイルは不要です。
10 しかし別のエラーメッセージが表示された
Can’t connect to MySQL server on ‘ホスト名'(10060)
この英文から、当初は自分のアプリ側の不具合と判断し調査。
(pingは可能)
11 しかし、ネット上の先輩の情報から
https://ohbarye.hatenablog.jp/entry/2014/07/24/220700
MySQLサーバー側のファイアーウォールによって接続できない
と判断し、自作のDelphiアプリでの接続を断念。
12 他の言語で対応することに。
補足
試行錯誤している途中、ネット上の海外の先輩で
Delphi 2010 and MySQL – Stack Overflow
https://stackoverflow.com/questions/1778524/delphi-2010-and-mysql
にて、TAdoConnectionを使った ODBCドライバーによる接続例があったので参考にさせてもらいました。
ですが、10の
Can’t connect to MySQL server on ‘ホスト名'(10060)
が表示されたので、その時は「ODBCでもダメか」と思いました。
9/24 追記
別の方のサイト様
MySQL に ODBC 接続して、エクセルでサーバーのデータを表示する
http://dotnsf.blog.jp/archives/1013344582.html
を参考にさせて頂き、今度はMS-Excelから再度ODBC接続を試みましたが、同様にエラーでした。
現時点の結論
色々試した結果、「MySQLおよびODBCでもホストを見つけられない」という結果になったので「ファイアーウォールが原因、または自分が利用するMySQLサーバーがリモートPCからの接続を拒否している」と判断しました。