2015/04/05

Access のリンクテーブルに主キーを VBA で設定する方法


Access 2010 + PostgreSQL で、リンクテーブルに主キーを VBA を設定する方法になります。リンクテーブルなので、SQL Server でも問題なく動作すると思います。

Access のリンクテーブルでは、リンク先のテーブルが主キーを持っていない場合は、主キーを設定しないとデータの更新ができなくなってしまいます。

このリンクテーブルに設定する主キーのことを、「擬似インデックス」と Microsoft は呼んでいるようですね。リンク先のテーブルにはインデックスを作成しないからということでしょうか。

この擬似インデックスを作成するには、 ‘ CREATE INDEX ' という命令を使用します。設定できるフィールド数の上限は10個までとなります。

詳しくはサンプルコードのコメントを参考にしてください。

■サンプルコード

Private Sub commandLink_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Dim cDb As DAO.Database
    Dim cTbDef As DAO.TableDef
    Dim cFldNm As String
    Dim pDb As DAO.Database
    Dim pTbDef As DAO.TableDef
    Dim pTbNm As String
    Dim conStr As String
    Dim i As Integer
    Dim sql As String
    
    'DRIVERは64ビット用、32ビットは変更の必要あり
    conStr = "ODBC;DRIVER={PostgreSQL Unicode(x64)};SERVER=localhost;DATABASE=postgres;UID=user01;PWD=password@1"
    
    'Open Access DB
    Set cDb = CurrentDb
    
    'Open ODBC/PostgreSQL DB
    Set pDb = DBEngine.OpenDatabase("", False, False, conStr)
    
    'テーブル定義一覧をループ
    For Each pTbDef In pDb.TableDefs
        
        pTbNm = pTbDef.Name
        
        'ユーザーテーブル(スキーマ)のみ処理
        If Left(pTbNm, 7) = "public." Then
        
            Set cTbDef = cDb.CreateTableDef(Mid(pTbNm, 8))
            cTbDef.SourceTableName = Mid(pTbNm, 8)
            cTbDef.Connect = conStr
            
            'リンクテーブルにパスワードを保��する
            cTbDef.Attributes = cTbDef.Attributes Or dbAttachSavePWD
            
            'リンクテーブルを追加
            cDb.TableDefs.Append cTbDef

            
        End If
    
    Next
    
    'リンクテーブルに主キーを設定する
    For Each cTbDef In cDb.TableDefs
        
        'リンクテーブル以外はスキップ
        If cTbDef.Attributes And dbAttachedODBC Then
            
            'インデックスのないもののみ処理
            If cTbDef.Indexes.Count = 0 Then
            
                '今回は先頭フィールドを主キーに設定する
                '主キーは10フィールドまで設定可能
                cFldNm = cTbDef.Fields(0).Name
                
                sql = "CREATE INDEX idx_" & cTbDef.Name
                sql = sql & " ON " & cTbDef.Name & "(" & cFldNm & ")"
                sql = sql & " WITH PRIMARY;"
                
                '主キー作成
                cDb.Execute sql
                
            End If
            
        End If
    
    Next

    
    cDb.Close
    pDb.Close
    
    Set cDb = Nothing
    Set pDb = Nothing
    
    MsgBox "終了しました", vbInformation
End Sub

 

■参考サイト


スポンサーリンク


このエントリーをはてなブックマークに追加




Twitter ではブログにはない、いろんな情報を発信しています。


コメント

コメントを書く



プロフィール

  • 名前:fnya
    経歴:
    SE としての経験は15年以上。様々な言語と環境で業務系システム開発を行い、セキュリティ対策などもしていました。現在は趣味SE。

    Twitter では、ブログでは取り上げない情報も公開しています。


    ブログについて

    このブログは、IT、スマートフォン、タブレット、システム開発などに関するさまざまな話題を取り上げたり、雑感などをつづっています。

    現在、Enty で支援を受け付けています。もしよければご支援ください。



    >>ブログ詳細
    >>自作ツール
    >>運営サイト
    >>Windows 10 まとめ

    Twitter のフォローはこちらから Facebook ページはこちら Google+ページはこちら RSSフィードのご登録はこちらから