※未解決です。また、同じトラブルに遭う可能性が高いので、備忘録として残しました。

 

発生する環境(当方の環境)

古いDelphiのみ

(新しいDelphiではこの記事は該当しません。その理由はFireDACという最新アクセスライブラリが対応しているからです)

オープンソースのMySQL(サーバーは5.7)

 

概要

Delphiで作成したアプリから、自社のMySQLサーバーへのアクセスを試みる。

 

結果

接続できず失敗

 

考えられる原因

1 手持ちのDelphiのバージョンが古く、最近のMySQLに対応していない

2 自分が利用するMySQLサーバーにファイアーウォールがかけられていて、PC上にある自作のDelphiアプリからの接続を拒否している

3 ただし、自分のWebサーバー上に置いた自作PHPからの接続は可能だった

 

よって、原因は「1」または「1および2」と考えられる。したがって、Delphiのバージョンが最新ならトラブルなく接続できる可能性があり、それでも不可なら、自分が利用しているMySQLサーバーがローカルPC内のアプリからの接続を拒否していると判断できる。

 

 

再現手順

1 フォーム上に TSQLConnectionを1個, TButtonを2個配置

 

2 TSQLConnectionの下記の項目に設定値を入れる

Delphi 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.

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)

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接続を試みましたが、同様にエラーでした。

ODBCドライバーでMySQLに接続するも失敗

 

現時点の結論

色々試した結果、「MySQLおよびODBCでもホストを見つけられない」という結果になったので「ファイアーウォールが原因、または自分が利用するMySQLサーバーがリモートPCからの接続を拒否している」と判断しました。



ȥåץڡ