AccessからMySQLへADO接続する方法について
ODBC接続ではなくADOで接続したいと思いADO接続をした時の備忘録です。
開発環境:win7 + access2010 + MySQL
ADOの接続文字列をiniファイルで管理
[メリット]
・客先導入時や各クライアント毎に設定が異なる場合でもiniファイルで修正可能になる。
[デメリット]
・セキュリティは良いのか?という点。
⇒お客様に確認した所、iniファイルが良いということでiniファイルに接続文字を設定しておいて
利用する方法になりました。
各環境によってドライバが違うので各々修正と確認が必要です。
iniファイル
<設定内容>
[MYSQL] SERVER_NAME=localhost DB_NAME=hoge DB_USER=root DB_PASS=pass DRIVER_NAME=MySQL ODBC 5.1 DRIVER
⇒設定値は環境に合わせて修正します。
メモ帳(秀丸等)を新規に開いて上記の設定値を入れます。
保存する際に~.iniになるようにファイル保存します。
<標準モジュール>
' iniファイル Public Const IniFileName = "hoge.ini" ' DB接続用共通変数 Public GsServerName As String Public GsDataBase As String Public GsUserName As String Public GsPassword As String Public GsDriverName As String Rem ----------------------------------------------------------- Rem 関数名 : ReadINI Rem 処理内容 : INIファイルの情報取得 Rem 引 数 : Section,Entry Rem 戻り値 : 無し Rem ----------------------------------------------------------- Public Function ReadINI(Section As String, Entry As String) As String Dim n As String * 255 Dim rc As Long rc = GetPrivateProfileString(Section, Entry, "", n, 255, MyPath & IniFileName) ReadINI = funLeftB(n, InStr(n, Chr(0)) - 1) End Function Rem ----------------------------------------------------------- Rem 関数名 : conConnectStr Rem 処理内容 : ADO接続します Rem 引 数 : 無し Rem 戻り値 : 無し Rem ----------------------------------------------------------- Public Function conConnectStr() As String On Error GoTo ERR ' 接続文字列取得 GsServerName = ReadINI("MYSQL", "SERVER_NAME") GsDataBase = ReadINI("MYSQL", "DB_NAME") GsUserName = ReadINI("MYSQL", "DB_USER") GsPassword = ReadINI("MYSQL", "DB_PASS") GsDriverName = ReadINI("MYSQL", "DRIVER_NAME") ' 接続文字列作成 conConnectStr = "Driver={" & GsDriverName & "};" _ & " SERVER=" & GsServerName & ";" _ & " DATABASE=" & GsDataBase & ";" _ & " USER=" & GsUserName & ";" _ & " PASSWORD=" & GsPassword & ";" Exit Function ERR: MsgBox "環境設定ファイルを確認してください。" + Chr$(10) + "読み込めませんでした。", vbCritical End Function
例)帳票フォームの一覧表示
<フォーム>
'*************************** ' 画面起動時 '*************************** Private Sub Form_Open(Cancel As Integer) ' 初期化処理 Call subInitControl End Sub Rem ----------------------------------------------------------- Rem 関数名 : subSetInputdata Rem 処理内容 : 該当するデータをカレント表示する。 Rem 引 数 : なし Rem 戻り値 : なし Rem ----------------------------------------------------------- Private Sub subSetInputdata() Dim objCon As New ADODB.Connection Dim objRs As New ADODB.Recordset Dim strSql As String Dim chkStatus As String On Error GoTo Error ' データベースを開く objCon.ConnectionString = conConnectStr objCon.Open ' カーソル設定 objRs.CursorLocation = adUseClient ' SQL実行 strSql = "SELECT * FROM m_stf" '================= ' 検索条件生成 '================= mstrWhere = "" ' スタッフコード If Nz(Me.txtStfCode.value) <> "" Then If mstrWhere = "" Then mstrWhere = " WHERE stf_code = '" & Me.txtStfCode.value & "'" End If End If ' スタッフ名 If Nz(Me.txtStfName.value) <> "" Then If mstrWhere = "" Then mstrWhere = " WHERE stf_name Like '%" & Me.txtStfName.value & "%'" Else mstrWhere = mstrWhere & " AND stf_name Like '%" & Me.txtStfName.value & "%'" End If End If strSql = strSql & mstrWhere strSql = strSql & " ORDER BY stf_code" objRs.Open strSql, objCon, adOpenDynamic, adLockPessimistic ' レコードセットの複製をコピー Set Me.Recordset = objRs.Clone ' 後処理 objRs.Close Set objRs = Nothing Me.Requery Exit Sub Error: MsgBox "エラーが発生しました。エラー内容:" & ERR.Description & Chr$(10), vbCritical, C_MSG_TITLE End Sub
こんな感じです。
表示するだけならリンクテーブル不要!です。
リンクテーブルは基本的に帳票用で使ったり
クエリを使う際は必要になりますので、結局使うのですが
普通に表示して更新するだけの画面であればクエリ不要です。
コメント