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
結論から申し上げると
リンクテーブルを作った時点で ADO を使う必要は無いでしょう。
Accessのオブジェクト構造とミドルウェアの選定がミスマッチという印象を受けます。
は、OLEDB 接続した SQLServer の Recordset を
ダイレクトにAccessフォームへバインドするときに有効な方法ですから
ローカルにリンクテーブルが存在する現在の構成ですと、このコードは不要です。
王道の連結フォームでAccessデータベースを運用すればいいでしょう。
これは 32bit, 64bit に関係なく問題があるでしょう。
リンクテーブルは、ローカルにあるのに
ADODB.Connection はローカルではなく、サーバーに接続しています。
また、リンクテーブルというのは 外部データベースのスキーマを
Access用に変換したテーブルですから、操作は ADO ではなく、DAO でおこないましょう。
最後に、動作がおかしくなるのは おそらく
64bitアプリにおいて、32bitアプリ用のODBCドライバを使っているからでしょう。
64bitのODBCドライバを使ってリンクテーブルを作成して下さい。