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を再起動するとテーブル一覧に新しいテーブルが反映された
内部的には新テーブルも参照できるので処理に問題はないと思いますが
通常のリフレッシュとか使っても反映はされませんでした。
実際にこれで正常に動作するかと確認作業は必要になると思います。

 

コメント

  1. ダブルレール より:

    同じようなことをされているので、
    失礼千万を承知で質問させて下さい。

    初心者からAccessを始めて、少しずつ複雑なことも手がけるようになり、
    150人程度の会社で、ERPに近い形のシステムを運用しています。
    ところが、内製からの転換を目論む大手ベンダが
    「Accessなんて素人が使う物」「MDBは壊れる」と上役に吹き込み、
    中身を知らない上が、不安に思っています。

    ODBC接続ですが、20人程が同時アクセスしても
    トランザクションは正常に処理されており、
    システム障害は発生していません。

    私の場合、他のサービス(SQL ServerやOracle等)を
    使う理由が見当たらないのです。

    Access & MySQLが大規模に向かない、
    という判断根拠を教えていただけないでしょうか。

    • admin より:

      >ダブルレール様
      この記事に対するコメントとはあまり関係ないように思います。
      この記事で私は「Access & MySQLが大規模に向かない」と記載していますか?
      どこかで記載していたということでしょうか。

      まぁ一般的に、大規模に向かないと言われているのは確かです。
      でもそれは、Accessオンリーの場合です。大手ベンダはAccessオンリーのシステムの事を言っていると思います。
      また、扱うデータ量にもよるのではないかと思います。
      Access+SQL ServerやOracleとAccess+MySQLであればどちらも一緒ではと思います。
      割と社内環境であれば問題なくやれるのではと思います。
      実際に壊れるというのはあります。でもそれは作りの問題もあったりしますので一概には言えません。

      トランザクションがきちんと出来ているっていうことは
      連結コントロールにしないで非連結で処理しているなど、きちんと対策を取られているからだと思います。
      問題となっているのは、すべて連結コントロールにしていて
      複数の人が同時にアクセスして重くなる・・という話しが多いということです。
      意外と素人でも簡単に作れてしまうので、いざふたをあけるとマクロだけでVBA一切記述なしとか多いです。

      今現在、問題なく動いているのであれば、きちんと作られているということでそのままで良いと思います。
      次はoffice365に乗せ換えれば、クラウド化も夢じゃないかもしれません。
      無意味に作り替えを提案してくる企業もあるのは確かです。
      不安に思われる上役の方を上手く説得できると良いですね。

タイトルとURLをコピーしました