Microsoft Access 掲示板

Access64bit版だと、帳票フォームのテキストボックスに#Name?が表示されます / 6

12 コメント
views
4 フォロー
6
くろ 2021/08/31 (火) 17:39:49

mayu様、りんご様
コメントありがとうございます。

mayu様
結果から申しますと、すべて変わらずで#Name?のままでした。
【 4 】のご提案は、Accessファイルのゴミが原因ならこれで解決!と思いまっさらな状態から簡単なものを作成しましたがダメでした…。

りんご様
方法はその通りです。rsをこの中でCloseしてしまうと、リンクデータが無くなってしまうのでCloseはしていません。
こちらの環境では、データはSQLServer上にあり、リンクテーブルからADOdbで読んでいます。

そこで、mayu様のご提案で作成した新しいaccdbがありましたので、これにローカルテーブルを作成して試したところ…
そちらは正しく表示されます!
ですので、ADO接続の際のリンクに何かあるのかもしれません。

新しく作成したaccdbのコードは以下で、このaccdbを32bitAccessで動作させると問題なく、64bitAccessではダメなのが再現できました。なんでか全くわからずです。
何かしょうもない見落としな気もするのですが…

Private Sub cmdADODB_Click()
    Dim rs As New ADODB.Recordset
    Dim strSQL As String

    strSQL = "SELECT * FROM リンクテーブル WHERE DATA1 LIKE '%みかん%'"
    rs.Open strSQL, cn, adOpenStatic, adLockOptimistic
' cn はADOBE.Connection としてSQLServerに接続しています。

    Set Me.Recordset = rs

    If rs.EOF = False And rs.BOF = False Then
        Me.txtData1.ControlSource = rs![DATA1].Name
        Me.txtData2.ControlSource = rs![DATA2].Name
    End If

    Set rs = Nothing

End Sub

Private Sub cmdlocal_Table_Click()
    Dim rs As DAO.Recordset
    Dim strSQL As String

    strSQL = "SELECT * FROM test_table WHERE DATA1 LIKE '%みかん%'"
    Set rs = CurrentDb.OpenRecordset(strSQL)

    Set Me.Recordset = rs

    Me.txtData1.ControlSource = rs![Data1].Name
    Me.txtData2.ControlSource = rs![Data2].Name

    Set rs = Nothing

End Sub

Private Sub cmdClear_Click()
Me.txtData1.ControlSource = ""
Me.TxtData2.ControlSource = ""
Set Me.Recordset = Nothing
End Sub

通報 ...
  • 7
    mayu 2021/08/31 (火) 19:44:40 修正 ef559@a99f1 >> 6

    結論から申し上げると
    リンクテーブルを作った時点で ADO を使う必要は無いでしょう。
      

    データはSQLServer上にあり、リンクテーブルからADOdbで読んでいます。

      
    Accessのオブジェクト構造とミドルウェアの選定がミスマッチという印象を受けます。

    Set Me.Recordset = rs
    

    は、OLEDB 接続した SQLServer の Recordset を
    ダイレクトにAccessフォームへバインドするときに有効な方法ですから
    ローカルにリンクテーブルが存在する現在の構成ですと、このコードは不要です。
    王道の連結フォームでAccessデータベースを運用すればいいでしょう。

    strSQL = "SELECT * FROM リンクテーブル
    rs.Open strSQL, cn, adOpenStatic, adLockOptimistic
    cn はADOBE.Connection としてSQLServerに接続しています。

      
    これは 32bit, 64bit に関係なく問題があるでしょう。
    リンクテーブルは、ローカルにあるのに
    ADODB.Connection はローカルではなく、サーバーに接続しています。

    また、リンクテーブルというのは 外部データベースのスキーマを
    Access用に変換したテーブルですから、操作は ADO ではなく、DAO でおこないましょう。

    最後に、動作がおかしくなるのは おそらく
    64bitアプリにおいて、32bitアプリ用のODBCドライバを使っているからでしょう。
    64bitのODBCドライバを使ってリンクテーブルを作成して下さい。