愚者の経験

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

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リンクができます。

広告

AccessでDSNなしでODBC接続」への2件のフィードバック

  1. k17 3月 9, 2014 1:06 pm

    パスワード保存は以下でできます。
    tdf.Attributes = tdf.Attributes Or dbAttachSavePWD
    あと DSN と DNS がごっちゃになってますね…。

    • rsskkr 3月 9, 2014 10:35 pm

      k17様
      はじめまして、rsskkrです。ブログご閲覧くださってありがとうございます。
      拙い記事にコメントまで2件もくださってとても嬉しく思います。

      Accessの機能でODBC作った時はパスワード保存できているみたいなので
      何か方法があると思っていましたが…知ることができて非常にスッキリしました。

      あと「DSN」と「DNS」間違えているのはまずいですね笑
      ご指摘くださってありがとうございます。修正しておきます…
      お恥ずかしい限りです。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。