Access+MySQLでDSNレス接続

スポンサーリンク

Access + MySQLの環境で開発するとき、テーブルはリンクテーブルにして使う事が多いです。
リンクテーブルを使うと、Accessの中でテーブルが簡単に参照できるし更新もできるから
便利といえば便利なのですが、お客様の環境にセットアップする際に少し設定が手間だったりします。
とはいえ、Access開発なので小規模前提だとは思うのです。
だからそんなに手間かな~?とも思うけれど、お客様がPC買い換えた時とか
そういう場面を考えると、DSNレス接続できると良いよね、と確かに思いました。

DSNとは?
DSNとは・・・という話しは割愛します。調べてください。
簡単に書くと、accessからODBC接続する際に接続するのに必要なものです。
予め、ODBC→DSN設定をしないと使えません。

この設定をしないでもaccessからMySQLに接続できないか?という事です。

ちなみにこちらの開発環境(access2010 + MySQL 5.1)
SQLServerで接続するものの情報は割とあるのですが、MySQLの情報少なく少々手間取りました。

◆DSN接続

DoCmd.TransferDatabase acLink, "ODBC データベース", "ODBC;DSN=db1;UID=yumi;PWD=pass;LANGUAGE=us_english;DATABASE=db1", acTable, tblNm, tblNm, False

◆DSNレス接続

    Set td = CurrentDb.CreateTableDef(stLocalTableName, dbAttachSavePWD, stRemoteTableName, "ODBC;DRIVER=MySQL ODBC 5.1 DRIVER;SERVER=localhost;DATABASE=db1;UID=yumi;PWD=pass")
    CurrentDb.TableDefs.Append td

今までは、DSN設定を予め各PCにしておいてから上記のDSN接続でテーブルリンクしていましたが
それをしないでもDSNレス接続の文字列でもテーブルリンクできるのを確認しました。

更に、パススルークエリーこれは便利です。

mysql用のSQLで実行して結果をaccessが取得するので速度も速いし
なんといってもSQLがmysqlのが書きやすいので楽なのです。
なので最近は、クエリーもパススルークエリーにすることが多いかな。
帳票もパススルークエリーで行けるし、正直テーブルリンクいらないかも・・とさえ
最近思っています。

    '------------------------------------------------------------
    ' パススルークエリを作成してMySqlでSQLを実行して返却します
    '------------------------------------------------------------
    Set objQd = CurrentDb.CreateQueryDef("")
    ' パススルークエリー接続文字
'    objQd.Connect = "ODBC;DSN=db1;LANGUAGE=us_english;DATABASE=db1"
    objQd.Connect = "ODBC;DRIVER=MySQL ODBC 5.1 DRIVER;SERVER=localhost;DATABASE=db1;UID=yumi;PWD=pass"
    
    ' SQL
    objQd.SQL = "select * from d_order_2"
    ' レコードセット
    Set objRs = objQd.OpenRecordset()

    str = ""
    If objRs.RecordCount > 0 Then
        objRs.MoveFirst
        Do Until objRs.EOF
            
            str = str & objRs.Fields("order_id").value & ":" & objRs.Fields("subject_name").value & vbCrLf
            
            objRs.MoveNext
        Loop
    End If
    MsgBox str

DSNいらないな~便利!

でも、問題を発見しました。

・DSNレスでテーブルリンクすると、accessのテーブル一覧に即反映されない。
→accessを再起動するとテーブル一覧に新しいテーブルが反映された
内部的には新テーブルも参照できるので処理に問題はないと思いますが
通常のリフレッシュとか使っても反映はされませんでした。
実際にこれで正常に動作するかと確認作業は必要になると思います。

スポンサーリンク
広告
広告

シェアする

フォローする