愚者の経験

「また今度」はほとんどこない

日別アーカイブ: 6月 14, 2012

AccessでDSNなしでODBC接続

最近はADODBなどの台頭で枯れてきている感があるものの、Accessにおいては
外部データベースでも「テーブル」として認識でき、クエリなどGUIでデザインできる
貴重な手段です(adpはおそらくADODBを利用していますがSQLServerしか接続できません)。

結構昔のプログラムで使っているのを見たことがあります。

しかしAccessからODBCを利用してデータのリンクを作成しようとすると「DSN」が必要です。
これはファイルデータソースを共有しない場合、各クライアントで設定が必要です。
(ファイルデータソース(dsnファイル)を共有フォルダに置き、各クライアントで
同じパスで参照出来れば多分大丈夫かな…未検証。)

「こんなわざわざ面倒くさい。ADODBみたいに接続文字列でできないの?」
と思い調べてみました。
VBAでリンクを作ればDSNは不要です。ちゃんと作成できます。ただし条件付…
ODBC(Access)のリンク作成関数

Option Compare Database
Option Explicit

‘リンクテーブルを作成する関数
‘AccessLink        リンク先がODBCかAccessか
‘TableName         リンクテーブル名
‘ConnectionString  接続文字列
‘SourceTableName   リンク元のテーブル名
‘PrimaryFields     ODBCリンクの場合、擬似インデックスを作成する主キーフィールド名(複数指定可)
‘                  ※ODBCLinkの場合はadpと同じように主キーを設定しないとデータの追加が不可になります。
‘ODBCリンクの接続文字列の例:”DRIVER=SQL Server;SERVER=MSSQLSVR;DATABASE=test;Uid=sa;Pwd=xxxxxx;”
‘Access同士の接続文字列の例:”DATABASE=C:\data.accdb”
Public Sub CreateLinkTable(AccessLink As Boolean, TableName As String, ConnectionString As String, SourceTableName As String, ParamArray PrimaryFields() As Variant)
Dim tdf As DAO.TableDef
On Error Resume Next
CurrentDb.TableDefs.Delete TableName

On Error GoTo Failure
Set tdf = CurrentDb.CreateTableDef(TableName)

With tdf
.SourceTableName = SourceTableName
If  AccessLink  = True Then
.Connect = “;” & ConnectionString
Else
.Connect = “ODBC;” & ConnectionString
End If
End With

CurrentDb.TableDefs.Append tdf

If  AccessLink = False And IsMissing(PrimaryFields) = False Then
Dim IdxCreate As String
IdxCreate = “create index ” & TableName & “_ODBC_Primary on ” & TableName & “(” & Join(PrimaryFields, “,”) & “) with primary”

CurrentDb.Execute IdxCreate
End If
Exit Sub
Failure:
Beep
MsgBox Err.Description, , “エラー”
End Sub

一応擬似インデックス張るところまで面倒見てますが怪しいです(笑)
それより条件付きの内容ですが。
実はこれで作成したリンクはユーザーとパスワードが保存されません。
なのでプログラムを再起動すると接続が切れ、テーブルにアクセスしようとすると
ユーザーとパスワードが聞かれます。
回避方法がありそうなんですが…起動時に接続を作ればいいだけですので調べてませんm(. .)m
若干問題がありますが、これでクライアントの設定不要なODBCリンクができます。