2013-06-07 4 views
1

링크 된 테이블/SQL Server 백엔드를 사용하도록 최근에 업데이트 한 레거시 Microsoft Access 데이터베이스로 작업하고 있습니다.데이터 형식을 새로 고치는 Access에서도 연결된 테이블을 프로그래밍 방식으로 어떻게 업데이트합니까?

데이터 구조를 약간 변경하고 프로그래밍 방식으로 연결된 테이블 참조를 업데이트하려고합니다.

그러나 내가 사용하고있는 코드를 사용하면 링크 된 테이블을 새로 고치면 특정 테이블에 대한 업데이트 된 데이터 형식이 표시되지 않을 것입니다. 현재 데이터 유형은 텍스트이지만 External Data> Linked Table Manager를 사용하고 해당 프로세스를 거쳐 날짜/시간으로 업데이트됩니다.

(내가 dev에와 생산 사이의 플립하는 기능을 가지고 싶습니다, 그래서 옵션이 될 위의 경로를 고려하지 않습니다.)

액세스/VB 더 이상 내 강력한 기술하지 않습니다 ,하지만 MSDN (thisthis)에서는 tb.Fields.Refresh이 필요하지만 예상대로 작동하지 않습니다.

내가 뭘 잘못하고 있니?

Function RefreshLinkedTables() As Boolean 
    Dim db As DAO.Database 
    Dim tb As DAO.TableDef 
    Dim fld As DAO.Field 

    Set db = CurrentDb 

    For Each tb In db.TableDefs 
     ' Skip system files. 
     If (Mid(tb.Name, 1, 4) <> "MSys" And Mid(tb.Name, 1, 4) <> "~TMP") Then 
      Debug.Print tb.Name 
      Debug.Print tb.Connect 
      If (Mid(tb.Connect, 1, 5) = "ODBC;") Then 
       tb.RefreshLink 
       If (tb.Name = "Jobs") Then 
        Debug.Print "Refreshing fields data" 
        tb.Fields.Refresh 
       End If 
      End If 
      Debug.Print "=== === ===" 
     End If 
     db.TableDefs.Refresh 
    Next 

    Set db = Nothing 

    RefreshLinkedTables = True 
    Exit Function 
End Function 
+0

테이블 링크 새로 고침이 만족스럽지 않으면 연결된 테이블을 삭제하고 다시 작성해 보았습니까? –

+0

감사합니다. @GordThompson. 나는 연결된 테이블을 삭제할 수 있다고 생각하지만, 프로그래밍 방식의 리프레시가 표준처럼 작동하도록하는 편이 낫습니다. 나는 또한 연결된 테이블이 생성되었을 때 DSN이 어떻게 지적되었는지 100 % 아니며 가능한 한 사용자에게 미치는 영향을 원합니다. –

+0

링크 된 테이블 관리자가이를 수행 할 수 있다면 'tb.RefreshLink'도이를 수행 할 수있을 것으로 기대했을 것입니다. 'tb.Connect = tb.Connect &'''와 같은 것을 시도해 보았습니다.'tb.RefreshLink'를 호출하기 전에'.Connect' 속성을 "dirty"로 만드시겠습니까? –

답변

2

이상한 행동을 일으키는 몇 가지가있었습니다.

먼저 연결된 테이블은 SQL Server 드라이버를 사용했지만 SQL Server Native Client 10.0 드라이버는 사용하지 않았습니다. 그래서 테이블을 새로 고쳤을 때 잘못된 것을 선택했습니다 (나는 11.0이 아니지만 10.0이라고 생각했습니다).

두 번째 문제는 Access 테이블을 SQL Server로 변환 할 때 datetime 필드가 datetime2 (0) (Access 2010 마이그레이션 도구가 사용됨)로 설정되었음을 나타냅니다. 불행히도 SQL Server 드라이버는이를 지원하지 않습니다.

사용자가 Windows 인증 (다시 한 번 웹 또는 제 3 자 솔루션으로 이전하게 될 레거시 앱)을 통해 인증되기를 원하며, 우리는 이러한 방식으로 작동한다는 것을 알고 있습니다.

대신 DATETIME2의 날짜를 사용하도록 SQL Server 테이블을 변경 한 후, 아래의 코드는 잘 작동 :

Option Compare Database 
Option Explicit 

Function RefreshLinkedTables() As Boolean 
    Dim db As DAO.Database 
    Dim tb As DAO.TableDef 

    Set db = CurrentDb 

    For Each tb In db.TableDefs 
     ' Skip system files. 
     If (Mid(tb.Name, 1, 4) <> "MSys" And Mid(tb.Name, 1, 4) <> "~TMP") Then 
      Debug.Print tb.Name 
      Debug.Print tb.Connect 
      If (Mid(tb.Connect, 1, 5) = "ODBC;") Then 
       'We only need to refresh a single table. 
       If (tb.Name = "Jobs") Then 
        tb.Connect = tb.Connect & "" 
        'Live connection 
        'tb.Connect = "ODBC;Description=___;DRIVER=SQL Server;SERVER=___;APP=Microsoft Office 2010;DATABASE=___" 
        'Dev connection 
        'tb.Connect = "ODBC;Description=___;DRIVER=SQL Server;SERVER=___;APP=Microsoft Office 2010;DATABASE=___" 
        tb.RefreshLink 
       End If 
       'tb.RefreshLink 
      End If 
      Debug.Print "=== === ===" 
     End If 
    Next 
    db.TableDefs.Refresh 

    Set db = Nothing 

    RefreshLinkedTables = True 
    Exit Function 
End Function 

논리는 좀 더 정리 될 수 있지만 작동합니다.

Gord Thompson에게 도움이되는 의견을 보내 주셔서 감사합니다.

+0

후속 조치에 대해 감사 드리며'datetime2 '문제에 대해 알고있는 것이 좋습니다. –

+0

그래, 드라이버가 그렇지 않다는 것을 유감스럽게 생각합니다. 해당 형식을 지원하지만 ... 즉시 작동하지 않았기 때문에 일종의 일이지만, Visual Basic for Applications 응용 프로그램에서 직접 실행 창을 실제로 사용할 수 있는지 몰랐습니다. 만약 내가 그렇게 많은 문제를 겪지 않았다면. –