MS ACCESS

AccessでSqlServerにリンクテーブルを作成する関数

Accessのリンクテーブル機能を使用してSqlServerへのリンクテーブルを作成することになったため、AccessからSqlServerへのリンクテーブルを作成する必要になったため、関数を作成しました。

まず最初にコードだけをかくとこのようになります。

'--DsnLessのSqlServerへのリンクテーブルを作成する
'--tableName:作成対象のテーブル名
'--linkTableNaMe:リンクテーブル名
Public Function setDsnLessTable(tableName As String, linkTableName As String) As Long
On Error GoTo catch
  Dim td As tableDef
  Dim databaseName As String
  Dim userName As String
  Dim userPassword As String
  Dim serverName As String
  Dim connectionString As String
  
  setDsnLessTable = 0
  
  databaseName = "SqlServerのデータベース名"
  userName     = "SqlServerのユーザー名"
  userPassword = "SqlServerのユーザーのパスワード"

  serverName = "localhost,1111"
      
  '--同一の名前のテーブルがあれば削除する
  For Each td In CurrentDb.TableDefs
    If td.Name = tableName Then
      CurrentDb.TableDefs.Delete tableName
    End If
  Next
                   
  connectionString = "ODBC;DRIVER=SQL Server;" _
                   & "SERVER=" & serverName & ";" _
                   & "DATABASE=" & databaseName & ";" _
                   & "UID=" & userName & ";" _
                   & "PWD=" & userPassword & ";"

  Set td = CurrentDb.CreateTableDef(tableName, dbAttachSavePWD, linkTableName, connectionString)
  CurrentDb.TableDefs.Append td

  Exit Function
catch:
  setDsnLessTable = -1
  MsgBox "setDsnLessTable error: " & Err.Description
End Function

基本的なコードは上記のようになります。
あくまでも接続文字列の部分は最低限だけを書いています。

必要であれば以下のコードも接続文字列に追加します。

 & "Encrypt=True;" _
 & "TrustServerCertificate=True;"

通信の暗号化や、証明書の検証をスキップするかなどの設定となっています。

では次に実際の使い方を見ていきます。

DSN Lessリンクテーブルとは?

今回リンクテーブルを作成するときにDSN Lessテーブルを使用しています。
通常accessでSqlServerのリンクテーブルを作成するには「DSNファイル」が必要となります。

しかし、この方法だとDSNファイルを別で管理する必要があるので、複数の端末で使用されるクライアントを作成していると管理する部分が増えます。
個人的にはそれを避けたいので、DSN LESS接続を使っているのですが、具体的なメリットはこのようになります。

DSN Less接続のメリット

  • ポータビリティ: DSN設定をデータベースやシステムに保存する必要がないため、アプリケーションを別のコンピューターに移動しても、追加の設定なしに接続が可能です。
  • 簡易性: システムDSNやファイルDSNを事前に設定する手間が不要になります。
  • 柔軟性: プログラム内で直接接続文字列を指定するため、実行時に接続先を動的に変更することができます。

シンプルに全てコードでかけるので、個人的にはDSN LESS接続しておくのが便利なのでこちらを使用しています。

SqlServerへのリンクテーブル作成する関数の使用例

先ほどのコードの実際の使用例として挙げるとまずこちらになります。

if setDsnLessTable("リンクテーブルにしたいテーブル名","accdb上で見えるテーブル名") = -1 then
   exit sub
end if

シンプルに一つのテーブルをSqlServerのリンクテーブルにしたい場合は上記のように使用します。
指定テーブル数が少ないのであればこれでOKです。

私の場合はすでに存在しているリンクテーブルをSqlServerのリンクへ変更するため、以下の関数を作成ました。
全てのリンクテーブルをSqlServerに置き換えてくれるようになっています。

Public Function changeAllLinkTablesToSqlserver() As Long
On Error GoTo catch
  Dim sqlConnection As String
  Dim db As Dao.Database
  Dim tb As Dao.tableDef
  Dim tableName As String
  Dim errorString As String
    
  changeAllLinkTablesToSqlserver = 0
  
  '--------------------------------------
  Set db = CurrentDb
  
  'テーブルオブジェクトを列挙
  For Each tb In db.TableDefs
    'リンクテーブルだけを処理
    If tb.Connect <> "" Then
      tableName = tb.Name
      If setDsnLessTable(tableName, tableName) = -1 Then
        GoTo catch
      End If
    End If
  Next tb
  
  db.Close
  Set tb = Nothing
  Set db = Nothing
  Exit Function
catch:
  errorString = Err.Description
On Error Resume Next
  db.Close
  Set tb = Nothing
  Set db = Nothing
  Call Utility.consoleLog(errorString)
  changeAllLinkTablesToSqlserver = -1
End Function

tb.Connectはリンクテーブルの場合、文字列が入っているので、文字列の有無でリンクテーブルかどうかの判定をしています。

基本的にリンクテーブルの名前は変更しないので、setDnsLessTableの引数には同じ値を送る形となっています。

AccessでSqlServerにリンクテーブルが必要になった経緯

参画していた場所で昔からaccessを使用してデータベースを作成されていました。
VBAで書かれていて、DBとフロントは一応別れていました。

しかし、DBはリンクテーブルで作成されており、DAOを使用して書かれていました。

テーブル数は130以上、データ件数も30万件を超えるレコードがあるなどの状況でした。

リンクテーブルでの実装は処理が重くなることはよく言われており、
流石にAccessには荷が重いということで、SqlServerへの移行を考えることにしました。

一つづつ変えていくのでも良いかと思ったのですが、あっちはAccess、こっちはSqlserverで管理も大変かと思ったので、一気にSqlServerへの移行することにしました。

リンクテーブルそのまま移行する理由

本当であればSqlServerに変えた時にAdoでの実装もするのが良いのですが、流石に影響範囲が大きく断念することに。

リンクテーブルを使用して書かれていたコードだったため、SqlServerへのリンクテーブルであれば、基本的にはそのままのコードで動くため、あえてリンクテーブルのまま移行を行い、その後に徐々にAdoを使用した書き方に変更していくような流れでやろうと決まりました。

まとめ

ここまで読んでいただきありがとうございます。

Accessのリンクテーブルはパフォーマンスは良くないので多用したくないですが、徐々に移行していくのに使用するのはまだ使いやすいかなと思います。

もし現在のプロジェクトでリンクテーブルを使用するのであれば、今回のコードをベースに使ってもらえれば、比較的簡単にリンクテーブルを作成できると思いますので、よければ使ってみて下さい。

-MS ACCESS
-, ,