このところ、ワテはMySQLデータベースのテーブルに対して、Visual Studio 2015のC#で作ったプログラムからデータを読み書きする処理を勉強中だ。
ワテの場合、データベースの操作に関しては、Microsoft社のSQL Server Express 2016を相手にC#で同様のプログラムを何度も書いた経験がある。
それを応用する事でMySQLの読み書きも出来るようになった。
ワテの場合、他の記事でも書いているようにデータベースの操作は、connectionString(接続文字列)を指定してデータベースに接続し、あとはSQL文を文字列で作成してそれを実行すると言うオーソドックスな、あるいは低レベルな、あるいは昔ながらの手法でやっている。
さて、この記事では、MySQLのデータをExcel 2013に取り込む手法を紹介したい。
C#などのプログラムは使わない。
あるいはEXCELのVBAプログラムも使わない。
やることは、EXCELの中でMySQLデータベースをデータソースに指定して、ODBC接続でデータをEXCELに読み込むと言う一般的な手法である。
結論としては、無事に読み込み成功した。
途中でかなり苦労したが、一旦接続出来るとあとは簡単に出来るようになった。
本題に入る前に、ワテの備忘録も兼ねてエンティティフレームワークとは何かに付いて説明してみたい。
- エンティティ フレームワーク(Entity Framework)
- 本題のMySQLのテーブルデータをEXCEL2013に読み込む処理
- MySQLのUpdateとODBCのx86版をインストールする
- 先に mysql-installer-community-5.7.17.0.msi を実行
- mysql-connector-odbc-5.3.7-win32.msi のインストール開始
- ところが問題が発覚! ODBC が消えてしまった。
- 上図の画像右下にある Catalog をクリックしてみる
- EXCELでMySQL用ODBC X86ドライバーを使う
- 「神は乗り越えられる試練しか与えない」
- EXCEL2013でMySQLのODBCドライバー32bitを使う
- まとめ
エンティティ フレームワーク(Entity Framework)
一方、データベースの操作ではエンティティ フレームワーク(Entity Framework)と言う新しい手法がある。新しいと言っても、それはワテにとって新しいだけで、世の中に登場したのはこのページの情報によると、
EF (or EF 3.5) The initial release of Entity Framework was included in .NET 3.5 SP1 and Visual Studio 2008 SP1. This release provided basic O/RM support using the Database First workflow.
との事である。
.NET 3.5 SP1 と言うと、このページ
の情報によると、
The .NET Framework 3.5 Service Pack 1 was released on 11 August 2008.
との事なので、もう10年くらい前か。
現在では、Entity FrameworkはCodePlexのサイトで公開されている。
最新版は EF 6.2.0 のようだ。
データベースのプログラミングを始めた当初は、右も左も分からない状態だったので、何をどうしたらC#プログラムからデータベースを操作できるのか全く分からなかった。
その過程でネットを検索しまくっていると、このEntity Frameworkと言う用語を見付けた。
ところが、Entity Frameworkと言う物の意味も概念も全く理解できなかった。
Wikipediaによると「エンティティ」とは、
エンティティ(英語: entity)
一般名詞
英語の一般名詞として、組織や団体など物質的な実体に限らず実存する概念のことを指す。法律上の概念としては「法人」(legal entity: 法的実体)と訳される場合がある。
さて、Entity Frameworkとは何か。
コードファースト
今でも完全には理解出来ていないが、ワテ流に解釈するなら、Entity Frameworkとは、例えばC#のプログラムの中でこんな社員クラスを作成しておけば、
public class 社員 { public int Id { get; set; } // 社員番号 public string Name { get; set; } // 名前 public string Address { get; set; } // 住所 public string Telephone { get; set; } // 電話番号 }
この社員クラスを使って自動的にデータベースに社員テーブルが作成出来る。
テーブルカラムのデータ型もこのクラスでメンバプロパティに指定したデータ型になる。つまりintやstringなど。
こう言う手法を「コードファースト」と言うらしい。
要するにプログラムのコード(クラス定義)さえ先に(ファースト)書いておけば、後はEntity Frameworkに任せておけばデータベースとのやり取りは上手い事やってくれると言う感じか。
それで「コードファースト」と言うようだ。
また、上記のようなクラスの事をエンティティと言うようだ。英語が多いのでややこしい。
つまりまあ、エンティティとはデータベースのテーブルを定義するためのクラスと言う理解でいいのかな。たぶん。
なお、Entity Frameworkのバージョン4.1(2011年4月)からこの「コードファースト」の機能が導入されたらしい。
「データベースファースト」とか「モデルファースト」
なお、Entity Frameworkの元々の機能としては、ウィザードを使ってデータベースのテーブルを定義したり、テーブル間のリレーションシップを設定したり出来る(ようだ)。
例えば既存のデータベースがあり、その中に社員テーブルがあるとすると、その社員テーブルからカラムを取り出して上記のような社員クラスを自動生成する事も出来るようだ。
「~のようだ」と言うのは、ワテの場合、現在はEntity Frameworkは使わずに専ら(もっぱら)冒頭で説明した通り、SQLコマンド文字列を作成して、それを実行するという超低レベルな方式でデータベースを操作している。
なのでEntity Frameworkに関しては、データベースプログラミングを勉強し始めた当初はかなり勉強したのだが、今は全く使っていないのでこのブログ記事を書いている時点では、Entity Frameworkに関しては詳しい事はよく覚えていない。
それ故に、「~である」と言う断定的な文章を書く自信が無いので「~のようだ」となる。
同様に、「モデルファースト」の場合には、Entity Frameworkウィザードを使って社員テーブルを作成出来る。
それを元にデータベースを作成したり、あるいは、C#のクラス定義(=エンティティ、あるいはモデル)を自動生成出来るようだ。
なぜワテがEntity Frameworkを使わずに低レベルなSQLコマンドを実行するのか?
それは、まあ、ワテのような古い人間は、ワテのプログラムとデータベースの間にEntity Frameworkとか言う訳分からん奴が入ると、何となく実感が湧かない。
自分でSQL文を実行して、データベースを操作する。それが分かり易いからだ。と言うのは建前で、本音はワテがEntity Frameworkを使いこなせていないからである事は言うまでも無い。
ちなみに、上記のような「〇〇ファースト」のような手法でデータベースとプログラムとの間でデータを変換する手法の事をオブジェクト関係マッピング(英: Object-relational mapping、O/RM、ORM)と言うらしい。
世の中、何でもかんでもオブジェクト指向に成って行くようだ。
まあ、兎に角、ワテの場合には低レベルなプログラミングが好きである。
本題のMySQLのテーブルデータをEXCEL2013に読み込む処理
さて、前置きが長くなってしまったが本題のMySQLのテーブルデータをEXCEL2013に読み込む処理について説明したい。
ワテの環境
- Windows 10 Pro (64bit)
- Visual Studio 2015 Community
- Excel 2013 (32bit) – Office 2013 Professionalの中のExcel
- MySQL 5.7 (64bit)
である。
やりたい事
事前にMySQLデータベースの中にC#プログラムを使って社員テーブルを作成して、何件かの社員データが書き込まれている。
そのMySQLデータベースはワテがレンタルしているABLENET社のWindows VPS上で稼働している。MySQLはワテがインストールしたものだ。
そのMySQLに自宅のWindows10パソコンからリモートアクセス出来るようにする為には、Windows VPS側でポートの設定やファイヤーウォールの設定が必要になるが、それらに関しては別記事で紹介している。
さて、そのMySQLの社員データを、自宅のパソコン上で起動したEXCEL2013に読み込みたい。
それがこの記事の目的。
EXCELの標準機能に外部のデータベースに接続してデータを読み込む機能はある。ただしデフォルトでは確か、マイクロソフト社のSQL Server、SQL Server Express、Accessなどしか接続出来ないと思う。
MySQLからデータを読み込むためには、MySQLのオプションにあるODBCドライバーをインストールする必要があるようだ。
MySQLのUpdateとODBCのx86版をインストールする
Windows10は64ビットであるが、ワテが使っているEXCEL2013は32ビット。
その場合には、ODBCドライバーも32ビット版つまりX86をインストールする必要がある。
下図は現時点でのワテのMySQLの内容。
上記のようにConnector/ODBC 5.3.6 (X64) が入っている。
これは確か、MySQLをインストールした時に自動的に入ったのかな?詳細は覚えていない。
兎に角これだとX64なので使えない。X86を入れる事にした。
でも、その前にMySQLやMySQL WorkBenchも新バージョンが出ている事が分かったので、先にそっちをバージョンアップする事にした。
mysql-installer-community-5.7.17.0.msi MySQL本体など全パッケージを含む
mysql-connector-odbc-5.3.7-win32.msi ODBCドライバーのX86つまり32ビット版
の二つをダウンロードした。
MySQLインストーラーは32ビットだがMySQL(64bit)も含んでいる
なお、注意事項としては、よく間違えやすいのだが、MySQLのサイトからMySQLのインストーラーをダウンロードする時に、32bit版しか見当たらないので当惑する。
しかし、これはMySQLのインストーラー自身が32ビットであるがそのインストーラーにはMySQL本体の32ビットも64ビットも含んでいるので心配は無い。
この32ビットインストーラーを実行すると、Windows 10 x64の環境には自動的にMySQLの64ビット版がインストールされるから心配ない。
先に mysql-installer-community-5.7.17.0.msi を実行
全自動で進んでいくので特に難しいところは無いと思う。
念のためにほぼ全部の画面をキャプチャしておいた。
説明は省略する。
以下のように現在インストールされているバージョンとこれからUpdateでインストールされるバージョンが分かり易く表示される。
Updateを実行する(下図)
順番にUpdate処理が進む(下図)。
UpdateがApplyされて行く(下図)
Updateが完了した(下図)
MySQLのインストールではConfigureと言う処理が出て来る。
まあ良く分からないが何かを構成しているようなのでNextをクリックして次へ進む。
データベースを更新するのかな?
まあ、パスワードが必要だったので入れた。
Server Configurationと言う処理だ(下図)
Server ConfigurationをApplyしている(下図)
Server Configurationが完了した(下図)
なんや知らんがProduct Configurationと言う処理も必要になる(下図)。
良く分からんのでNextをクリックしてどんどん進む。
Connect To Serverでサーバーに接続しているようだ(下図)
再びServer Configurationと言うのが出て来たぞ(下図)。
要するに何かの構成を変更する度にServer Configurationが実行されるのかな?
まあ兎に角どんどん進む(下図)。
またProduct Configurationか!
もう、勝手にやってくれればいいので、兎に角Nextをクリック。
Finishedした(下図)。
無事に完了。
WindowsのスタートメニューからMySQLを選んで、その中のMySQL Installerを実行すると下図が開く。
インストールされた内容を確認出来る。
これでMySQLやWorkBenchなどが最新版になった。
上図を見ても分るように、ODBCドライバーはX64のままだ。
それをX86版にしたいので、
mysql-connector-odbc-5.3.7-win32.msi ODBCドライバーのX86つまり32ビット版
をインストールする。
mysql-connector-odbc-5.3.7-win32.msi のインストール開始
こちらも難しい点は特にないのでどんどん進む。
下図でCustomを選択して、何がインストールされるのかを事前に確認してみる。
下図に示すように
MySQL Connector/ODBC 5.3.7. 32-bit drivers
と言うのが入るようだ。
Nextをクリック(上図)する。
無事にインストールされた。
ところが問題が発覚! ODBC が消えてしまった。
Connector/ODBC X86のインストールは成功したのだが、ここで再びスタートメニューからMySQLの中のMySQL Installerを実行するとインストールされているパッケージの一覧が出る。先ほど上で見たのと同じ画面だ。
その中に、今まであった
Connector/ODBC 5.3.7 x64
の項目が消えたのは良いのだが、代わりに
Connector/ODBC 5.3.7 x86
が出て来ると期待していたのに、Connector/ODBC に関する項目が何も無い。
おかしい。
下図は、上で一度出て来た画像であるが、ODBC X86をインストールする前の状態。
なのでODBC X64が出ている。
ところがODBC X86のインストール後には、このODBC の項目自体が出て来ないのだ。
もう嫌になっちゃうわ。
ああああああ、困った。
さて、どうするか?
選択肢は幾つかある。
- 作業を中止してMySQLデータをEXCELから読み込む実験は諦める。
- MySQL関連を全削除してやり直す。
などだ。
でも、冷静に考えばEXCELからMySQLのテーブルを読む程度の処理はネットを検索しても関連記事が沢山見つかるので、何かちょっとした設定ミスの可能性が高い。
こう言う場合には、頭を冷やして冷静になって考えるのが良い。
上図の画像右下にある Catalog をクリックしてみる
上図を見ていたら、右下にある Catalog と言う文字が目に入った。
良く分からんが、取り敢えず何か関係しているかも知れないのでクリックしてみた。
そうするとUpdateと言うボタンが有ったのでクリックしてみたら、ODBC x86が出て来たぞ!
良く分からんが兎に角ODBC X86 が出て来たので(上図)、Updateボタンをクリックした。
そうすると再びMySQLのインストール処理が開始して、以下のパッケージがUpdateされるようだ。
よし、UpdateしたいのでNextをクリックする(上図)。
ドンドン進む。
終わった(下図)。
おお、無事にConnector/ODBC 5.3.7 X86 が入った!!!!!!!
これを待っとったんや!
ようやくこれで、EXCELでこのMySQL用のODBC X86ドライバーを使う実験を開始する事が出来る。
EXCELでMySQL用ODBC X86ドライバーを使う
ファイル名を指定して実行で odbcad32.exe を実行する。
odbcad32.exe
を実行した。
でもこれは間違い。下図のように64ビット版が起動しているので。
ここで追加ボタン(上図)をクリックすると下図が出る。
本当だと上図の中に今入れた MySQL ODBC X86 が出て来るはずなのだが出ない。
なお、上図に示すように 64bit版のODBCデータソースアドミニストレーターが起動しているのが気になる。
「神は乗り越えられる試練しか与えない」
兎に角、何かと問題が多い。
まあ、こう言う試練を乗り越える事に意義があるのだ。
「神様は乗り越えられない試練は与えない」と言う事だ。
肯定形ならこうなるのかな。
「神は乗り越えられる試練しか与えない」
これか。
まあ、どっちでもいい。
兎に角やれば何とかなるだろう。
ネットを検索しまくったら解決方法が見つかった。
c:\Windows\SysWOW64\odbcad32.exe を実行すると良い
If you try to use 32bit MySQL ODBC connector on 64bit Windows, you need to use 32bit Data Sources (c:\Windows\SysWOW64\odbcad32.exe).
そう言う事か。
c:\Windows\SysWOW64\odbcad32.exe
これを実行したら32ビット版が実行された。
で、追加ボタン(上図)をクリックしてみると、下図のように
MySQL ODBC 5.3 ANSI Driver
MySQL ODBC 5.3 Unicode Driver
が表示された!
ええ感じや。
さっそくそのODBCドライバーのANSI版を使ってみる。
(注意:日本語データを扱うのが一般的なのでUnicode版を使うほうが良いだろう)。
上図の設定では今作業しているWindows10パソコンつまりlocalhostにインストールしているMySQLに接続する設定となる。
もしリモート接続したい場合には localhost ではなくて IPアドレスを 192.168.1.10 のように指定すれば良い。
試しに接続テストしたら無事に成功。
なお、上図で Detail と言うボタンがあるのでクリックしてみると沢山の設定項目がある(下図)。
まあ、ここは良く分からんのでそのまま何も変更せずにOKをクリックする。
下図のようにMySQLと言う名前でODBCドライバー32ビット版を追加出来た。
さっそく使ってみる。
EXCEL2013でMySQLのODBCドライバー32bitを使う
新規にEXCELを起動する。
リボンの
データタブ の
外部データの取り込み
を開き
その他のデータソースを開く
データ接続ウィザード(上図)を実行すると下図が開く。
上図でODBC DSNを選択する。
そうすると無事に先ほど追加したMySQLと言う項目が登場するので選択して次へ。
この後、次へをクリックするとMySQLに接続出来て、テーブル名の一覧が出たと思う。
そこでテーブルを指定するとそのテーブルのデータが取得出来たと思うのだが、キャプチャを忘れた。
まあ兎に角、これで、MySQLのテーブルを読み込む事が出来た。
まとめ
長い道のりであったが、EXCEL2013からMySQLのデータを読み込む事が出来た。
以下、まとめ。
- EXCEL2013(32bit)を使っている場合にはMySQLのODBCは32bitが必要。
- Win10(64bit)、MySQL(64bit)であってもODBCのビット数はEXCELに合わせる。
- ODBC X86インストール後にODBCの項目が何故か消えたのでCatalogを実行すると復活した。
- ODBCデータソースアドミニストレーターの32ビット版を起動する必要あり。
- それは c:\Windows\SysWOW64\odbcad32.exe で行ける。
- Unicode版のODBCドライバーを使うと良い。
- ANSI版ではMySQLテーブルのカラム名の日本語がEXCELに来た時点で文字化けした。
- ただし、テーブルの日本語データはANSIでもUnicodeでも化けなかった。
- と言う事でUnicode版を使っておけば良いみたい。
まあ、これでMySQLのデータをExcel 2013に取り込む事が可能になった。
この辺りのやり方は昔から変わっていないと思うので、EXCEL 2007, 2010, 2013, 2016でも同じだと思う。
次は、EXCELのデータをMySQLに書き込む処理を覚えたい。
女座頭市の綾瀬はるか。
本記事とはあまり関係ない。
ワテが綾瀬はるかファンと言うだけだ!
528ページもあるなあ。本格的にMySQLをマスターするにはこれくらいの本をスラスラと理解出来なくてはならないだろう。
ワテも買ってみるかな。多分途中で挫折するが。
コメント