ほとんどのプログラムは MyODBC
と連携して動作しますが、ここに示したプログラムについては、当社が社内で試験したか、またはユーザから動作確認したという連絡を受けています。
プログラム
Access
Access を動作させるには、以下の処理を実行する。
Access 2000
を使用している場合、http://www.microsoft.com/data/
から最新(バージョン 2.6 以降)の
Microsoft MDAC(Microsoft Data Access
Components
)をダウンロードし、インストールする必要がある。これによって、MySQL
にデータをエクスポートする際にテーブル名およびカラム名が指定されないという
Access
のバグが修正される。このバグは、MyODBC
バージョン 2.50.33 および MySQL
バージョン 3.23.x
にアップグレードすることによって回避することもできる。
その他に、http://support.microsoft.com/support/kb/articles/Q
239/1/14.ASP で公開されている
Microsoft Jet 4.0 サービスパック 5
をダウンロードし、適用する必要もある。これは、Access
でカラムが #deleted#
とマークされる場合があるバグを修正する。
注意: MySQL バージョン 3.22 を使用している場合、この問題を回避するには、MDAC パッチを適用し、MyODBC 2.50.32 または 2.50.34 以降を使用する必要がある。
Access のすべてのバージョンで、MyODBC
のオプションフラグ Return matching
rows
を有効にする必要がある。Access 2.0
では、さらに Simulate ODBC
1.0
を有効にする必要がある。
更新可能にするすべてのテーブルでタイムスタンプ型のカラムを定義する必要がある。移植性を最大にするために、TIMESTAMP(14)
または単純な TIMESTAMP
を、TIMESTAMP(X)
の代わりに使用することが推奨される。
テーブルに主キーを定義する必要がある。これを定義しない場合、新しく追加したレコードまたは更新したレコードが
#DELETED#
として表示される可能性がある。
DOUBLE
浮動小数点型のフィールドだけを使用する。Access
では、単精度浮動小数点型の値を比較できない。その結果、表面上は、新しく追加したレコードまたは更新されたレコードが
#DELETED#
として表示されたり、レコードを検索または更新できないという現象が発生する。
BIGINT
型のカラムを持つテーブルを MyODBC
経由でリンクしている場合、結果が
#DELETED
として表示される。以下に回避策を示す。
データ型が
TIMESTAMP
、できれば
TIMESTAMP(14)
のダミーカラムを 1 つ追加する。
ODBC DSN
アドミニストレータの接続オプションを指定するダイアログボックスで、'Change
BIGINT columns to INT'
をオンにする。
Access からテーブルリンクを削除し、再作成する。
上記の回避策を実行した後も、既存のレコードは
#DELETED#
として表示されたままだが、新しく追加または更新されたレコードは正しく表示されるようになる。
TIMESTAMP
型カラムを追加した後でもエラー
Another user has changed your data
が発生する場合、次の対策で解決する可能性がある。
テーブル
データシートビューを使用しない。代わりに必要なフィールドを定義したフォームを作成し、フォーム
データシートビューを使用する。TIMESTAMP
型カラムの DefaultValue
プロパティを NOW()
に設定する必要がある。このテーブルを使用するユーザが混乱しないように、TIMESTAMP
型カラムを非表示にすることも 1
つの方法である。
場合によっては、Access が、MySQL
が解釈できない不正な SQL
クエリを生成する可能性がある。これは、Access
のメニューから
"Query|SQLSpecific|Pass-Through"
を選択することによって修正できる。
NT 上で動作する Access が
BLOB
型カラムを OLE
OBJECTS
型として報告する。代わりに
MEMO
型カラムを使用する場合は、ALTER
TABLE
を使用してカラムを
TEXT
型に変更する必要がある。
Access が DATE
型カラムを正しく処理できない場合がある。この問題が発生する場合、カラムを
DATETIME
型に変更する。
Access で BYTE
型として定義されているカラムを使用している場合、Access
はこのカラムを、TINYINT
UNSIGNED
型ではなく、TINYINT
型としてエクスポートしようとする。この場合、カラムに
127
より大きい値が格納されていると問題が発生する。
ADO API および MyODBC
を使用してコーディングする場合、MySQL
サーバでサポートされない一部のデフォルトプロパティに注意する必要がある。たとえば、CursorLocation
プロパティ
に adUseServer
が設定されている場合、RecordCount
プロパティ
は -1
を返す。正しい値が返されるようにするには、以下の
VB コードで示すように、このプロパティを
adUseClient
に設定する必要がある。
Dim myconn As New ADODB.Connection Dim myrs As New Recordset Dim mySQL As String Dim myrows As Long myconn.Open "DSN=MyODBCsample" mySQL = "SELECT * from user" myrs.Source = mySQL Set myrs.ActiveConnection = myconn myrs.CursorLocation = adUseClient myrs.Open myrows = myrs.RecordCount myrs.Close myconn.Close
他の回避策としては、同じようなクエリで
SELECT COUNT(*)
ステートメントを使用して適切なレコード数を取得する方法がある。
Active server pages(ASP)
オプションフラグ Return matching
rows
を使用する必要がある。
BDE アプリケーション
オプションフラグ Don't optimize column
widths
および Return matching
rows
を設定する必要がある。
クエリを開始するとき、Active
プロパティまたは Open
メソッドを使用できる。注意:
Active
は、自動的に SELECT
* FROM ...
クエリを発行してクエリを開始するが、テーブルが大きい場合は問題になる場合がある。
ColdFusion(Unix 上)
以下の情報は ColdFusion のマニュアルからの抜粋である。
以下の情報を使用して、MySQL
データソースに対して MyODBC
とともに unixODBC ドライバを使用するように
ColdFusion Server for Linux を設定する。Allaire
は、MyODBC
バージョン 2.50.26 が
MySQL バージョン 3.22.27 および ColdFusion for Linux
と連携して動作することを確認済みである(それ以降のバージョンも当然動作する)。MyODBC
は、http://www.mysql.com/downloads/api-myodbc.html
からダウンロードできる。
ColdFusion バージョン 4.5.1
を使用すると、ColdFusion Administrator
を使用して MySQL
データソースを追加できる。ただし、ColdFusion
バージョン 4.5.1
にはドライバは付属していない。MySQL
ドライバが ODBC
データソースのドロップダウンリストに表示されるようにするには、MyODBC
ドライバをビルドして、/opt/coldfusion/lib/libmyodbc.so
にコピーする必要がある。
Contrib ディレクトリには
mydsn-xxx.zip
があり、これを使用して ColuFusion
アプリケーションで MyODBC ドライバの DSN
レジストリファイルをビルドおよび削除できる。
DataJunction では、エクスポートで
ENUM
が出力されて、MySQL
でトラブルの原因となるので、代わりに
VARCHAR
を出力するように設定を変更する必要がある。
Excel
正常に動作する。以下にヒントを示す。
日付データで問題が発生する場合、CONCAT()
関数を使用して日付データを文字列として選択する。たとえば、以下のように指定する。
SELECT CONCAT(rise_time), CONCAT(set_time) FROM sunrise_sunset;
この方法で文字列として取得した値は、Excel97 で正しく時刻として認識される。
この例で CONCAT()
を使用したのは、ODBC にカラムが
``文字列型''
であると思わせるためである。CONCAT()
を使用しないと、ODBC
はカラムが時刻型であることを認識するが、Excel
はそれを認識しない。
注意: Excel は自動的に文字列を時刻データに変換するので、上記の件は Excel のバグである。ソースがテキストファイルであれば、この自動変換は非常に便利だが、ソースがカラムごとのデータ型を正しく報告する ODBC 接続である場合はまったく意味をなさない。
Word
MySQL から Word または Excel
ドキュメントにデータを取得するには、MyODBC
ドライバおよび Microsoft Query
アドインを使用する必要がある。
たとえば、データベースに、2 つのテキスト型カラムを持つテーブルがあるとする。
mysql
クライアントコマンドラインツールを使用してレコードを挿入する。
ODBC
マネージャを使用して、上記のデータベースに対して、たとえば
my
という DSN
ファイルを作成する。
Word を開く。
新規ドキュメントを作成する。
[Database] ツールバーの [Insert Database] をクリックする。
[Get Data] をクリックする。
[Get Data] ダイアログボックスの右側にある [MS Query] をクリックする。
[MS Query] で DSN ファイル my を使用して新しいデータソースを作成する。
新しいクエリを選択する。
取得するカラムを選択する。
必要ならフィルタを作成する。
必要なら並べ替えを指定する。
[Return Data to Microsoft Word] を選択する。
[Finish] をクリックする。
[Insert data] をクリックしてレコードを選択する。
[OK] をクリックする。Word ドキュメントに選択したレコードが表示される。
Delphi
BDE バージョン 3.2
以降を使用する必要がある。MySQL
に接続する場合、オプションフィールド
Don't optimize column width
を有効にする。
また、MyODBC
の ODBC
エントリおよび BDE エントリ(BDE エントリは
Delphi Super Page で無料公開されている BDE Alias
Editor
を必要とする)をセットアップする便利な
Delphi コードを以下に示す(これについては
Bryan Brunton <bryan@flesherfab.com>
に感謝する)。
fReg:= TRegistry.Create; fReg.OpenKey('\Software\ODBC\ODBC.INI\DocumentsFab', True); fReg.WriteString('Database', 'Documents'); fReg.WriteString('Description', ' '); fReg.WriteString('Driver', 'C:\WINNT\System32\myodbc.dll'); fReg.WriteString('Flag', '1'); fReg.WriteString('Password', ''); fReg.WriteString('Port', ' '); fReg.WriteString('Server', 'xmark'); fReg.WriteString('User', 'winuser'); fReg.OpenKey('\Software\ODBC\ODBC.INI\ODBC Data Sources', True); fReg.WriteString('DocumentsFab', 'MySQL'); fReg.CloseKey; fReg.Free; Memo1.Lines.Add('DATABASE NAME='); Memo1.Lines.Add('USER NAME='); Memo1.Lines.Add('ODBC DSN=DocumentsFab'); Memo1.Lines.Add('OPEN MODE=READ/WRITE'); Memo1.Lines.Add('BATCH COUNT=200'); Memo1.Lines.Add('LANGDRIVER='); Memo1.Lines.Add('MAX ROWS=-1'); Memo1.Lines.Add('SCHEMA CACHE DIR='); Memo1.Lines.Add('SCHEMA CACHE SIZE=8'); Memo1.Lines.Add('SCHEMA CACHE TIME=-1'); Memo1.Lines.Add('SQLPASSTHRU MODE=SHARED AUTOCOMMIT'); Memo1.Lines.Add('SQLQRYMODE='); Memo1.Lines.Add('ENABLE SCHEMA CACHE=FALSE'); Memo1.Lines.Add('ENABLE BCD=FALSE'); Memo1.Lines.Add('ROWSET SIZE=20'); Memo1.Lines.Add('BLOBS TO CACHE=64'); Memo1.Lines.Add('BLOB SIZE=32'); AliasEditor.Add('DocumentsFab','MySQL',Memo1.Lines);
BDE バージョン 3.0 を使用して試験済み。唯一の既知の問題は、テーブルスキーマが変更されたときにクエリのフィールドが更新されないことである。ただし、BDE はインデックスの PRIMARY 以外の主キーを認識しないと思われるが、これはこれまで問題にはなっていない。
Vision
オプションフラグ Return matching
rows
を使用する必要がある。
テーブルを更新できるようにするには、テーブルに主キーを定義する必要がある。
Visual Basic を ADO
とともに使用した場合、大きなサイズの整数を処理できない。これは、SHOW
PROCESSLIST
のようなクエリは正しく動作しないことを意味する。これを解決するには、ODBC
接続文字列にオプション
OPTION=16384
を設定するか、または MyODBC 接続画面で
Change BIGINT columns to INT
を選択する。場合によっては、Return
matching rows
も選択する必要がある。
VisualInterDev
[Microsoft][ODBC Driver Manager] Driver does not
support this parameter
というエラーが発生する場合、結果セットに
BIGINT
が含まれていることが原因である可能性がある。MyODBC
接続画面で Change BIGINT columns to
INT
を選択すると解決する可能性がある。
Visual Objects
オプションフラグ Don't optimize column
widths
を使用する必要がある。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.