Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Access 2016)
外部接続accdbのレコード取得
投稿日時: 21/07/16 15:43:25
投稿者: hareru

外部接続したaccdbのテーブルに対し、inesrt,update,deleteを実行、直後にそのテーブルを更新結果を確認すると読込む方法の違いにより想定外の結果が返されます。
以下の(1)と(2)では同じ結果が返されると思っているのですが、updateとdeleteの時、(2)の結果はテーブル変更前情報が取得されてしまいます。
コネクションやメソッド等の使い方が基本的に出来ていないかも知れませんが、ネットで関連情報を見たのですが解決に至っていません。
どなたかアドバイスをください。
--------------------------------------------------------
Private Function Test()
 
    Dim SotCn As ADODB.Connection
    Dim CurCn As ADODB.Connection
     
    On Error GoTo Test_err11
     
    Dim sPath As String
    Dim sAccDbPath As String
    sPath = CurrentProject.Path
 
    sAccDbPath = sPath & "\TEST_LDB.accdb"
     
    '外部DB cnn
    pStrConnCli = "Provider=Microsoft.ACE.OLEDB.16.0;"
    pStrConnCli = pStrConnCli & "Data Source="
    pStrConnCli = pStrConnCli & sAccDbPath
     
    Set SotCn = New ADODB.Connection
    SotCn.Open pStrConnCli
 
    'カレントdb
    Set CurCn = CurrentProject.Connection
     
    If Me!Timp = 1 Then
        '// Add //
        pStrSql = "INSERT INTO T_TANT(C_TANT,C_TANTNM,C_KACD,C_JUNI,C_TKBN,C_SKBN) IN '" & sAccDbPath & "' "
        pStrSql = pStrSql & "VALUES('" & Me!Tcd & "','aaa','5037',1,0,1)"
        CurCn.Execute pStrSql, pIntErrFlg, adCmdText + adExecuteNoRecords
     
        GoTo Chk
        '// Update //
    ElseIf Me!Timp = 2 Then
             
        pStrSql = "UPDATE T_TANT SET "
        pStrSql = pStrSql & "C_TANTNM = 'zzz' "
        pStrSql = pStrSql & "WHERE C_TANT = """ & Me!Tcd & """"
    ElseIf Me!Timp = 9 Then
        '// DELE //
        pStrSql = "DELETE a.* "
        pStrSql = pStrSql & "FROM T_TANT "
        pStrSql = pStrSql & "WHERE C_TANT = """ & Me!Tcd & """"
    End If
    SotCn.Execute pStrSql, pIntErrFlg, adCmdText + adExecuteNoRecords
 
Chk:
    ' 更新後チェック
     
    '(1)SotCn接続
    pStrSql = "SELECT C_TANT,C_TANTNM "
    pStrSql = pStrSql & "FROM T_TANT "
    Set Rst1 = New ADODB.Recordset
    Rst1.Open pStrSql, SotCn, adOpenForwardOnly, adLockReadOnly
    Do While Not Rst1.EOF
        Debug.Print "Sot " & Rst1!C_TANT & "/" & Rst1!C_TANTNM
        Rst1.MoveNext
    Loop
    Rst1.Close: Set Rst1 = Nothing
 
    '(2)CurCn接続
    pStrSql = "SELECT C_TANT,C_TANTNM "
    pStrSql = pStrSql & "FROM T_TANT IN '" & sAccDbPath & "' "
    Set Rst2 = New ADODB.Recordset
    Rst2.Open pStrSql, CurCn, adOpenForwardOnly, adLockReadOnly
    Do While Not Rst2.EOF
        Debug.Print "Cur " & Rst2!C_TANT & "/" & Rst2!C_TANTNM
        Rst2.MoveNext
    Loop
    Rst2.Close: Set Rst2 = Nothing
     
    CurCn.Close: Set CurCn = Nothing
    SotCn.Close: Set SotCn = Nothing
--------------------------------------------------------
よろしくお願いいたします。

回答
投稿日時: 21/07/16 18:06:43
投稿者: sk

引用:
外部接続したaccdbのテーブルに対し、inesrt,update,deleteを実行、
直後にそのテーブルを更新結果を確認すると読込む方法の違いにより
想定外の結果が返されます。
以下の(1)と(2)では同じ結果が返されると思っているのですが、
updateとdeleteの時、(2)の結果はテーブル変更前情報が
取得されてしまいます

引用:
sAccDbPath = sPath & "\TEST_LDB.accdb"

引用:
SotCn.Open pStrConnCli
 
'カレントdb
Set CurCn = CurrentProject.Connection

引用:
Rst1.Open pStrSql, SotCn, adOpenForwardOnly, adLockReadOnly

引用:
Rst2.Open pStrSql, CurCn, adOpenForwardOnly, adLockReadOnly

・TEST_LDB.accdb のテーブルを参照先とするリンクテーブルが
 カレントデータベースに存在する。
 
・そのリンクテーブルが何らかの形で開かれている状態
 (データシートビュー/連結フォーム/連結レポート/
 コンボボックス/リストボックス)でコードを実行している。
 
もしこういう状態である場合、SotCn 側で SQL が実行された結果は、
CurCn 側のレコードセットには反映されません(すぐには同期しない)。
 
そのコードを実行しているフォーム自体が「リンクテーブルを
レコードソースとする連結フォーム」である場合や、
「リンクテーブルを値集合ソースとするコンボボックス/リストボックス」が
そのフォーム上に埋め込まれている場合は、そのフォームの
Refresh メソッドや Requery メソッドなどを実行してから、
CurCn 側のレコードセットを開くようにしてみて下さい。

投稿日時: 21/07/16 19:10:01
投稿者: hareru

skさん、回答ありがとうございます。
ご指摘の通り、Formのrecordsourceにsql句を貼り付けています。
ただ、requeryは実行して確かめたような気がします。
月曜日になってしまいますがrefreshも確認してみます。
ありがとうございました。

投稿日時: 21/07/19 09:56:42
投稿者: hareru

「Me.Refresh」で解決出来ました。
MS-SQLに接続している時は何の問題もなかったのですが、外部accdbに接続したら、この現象が発生し悩んでいました。
ありがとうございました、大変助かりました。