드로우홀릭 더베이직

 

이 글은 Microsoft Access팀의 영문 블로그를 번역한 글입니다.

원문 링크: http://blogs.office.com/b/microsoft-access/archive/2012/08/03/how-to-automatically-relink-microsoft-access-tables-.aspx

 

1.jpg 작성자 소개: Patrick Wood, 게스트 블로거, Access MVP이며 Gaining Access Technologies(SQL Azure 및 Access 작업을 전문으로 하는 소프트웨어 회사)의 설립자 입니다. 또한 개발자를 위한 ‘액세스 및 SQL Azure 정보 센터’를 설립했습니다. 더 많은 정보를 원하시면 다음 이메일 주소로 연락 바랍니다.  patwood @ gainingaccess.net

역자 주: 프로그램 파일과 데이터베이스 파일
원문에서는 프론트엔드(front-end)와 백엔드(back-end)로 표시하고 있습니다. 그런데, 이것은 프로그래머의 전문 용어라, 일반 사용자들이 이해하기 어려울 수 있습니다.
액세스 데이터베이스를 공유할 때, 쿼리, 폼, 보고서를 모아서 프로그램 파일(프론트엔드)로 만들어 놓고, 테이블만 모아서 데이터베이스 파일(백엔드)로 만드는 경우가 있습니다. 이렇게 함으로써, 보다 나은 성능을 기대할 수 있기 때문입니다. 그래서 본 번역에서는 프로그램 파일과 데이터베이스 파일로 나누어 적용하였음을 말씀드립니다.

이 글에서는 간단한 코드 작성으로 자동으로 테이블을 재연결 하는 방법을 설명합니다(데이터베이스 파일이 다른 폴더로 이동된 상황에서 프로시저 하나를 호출 하여 연결하는 방식입니다. 이 프로시저는 다중 데이터베이스 파일 로 구성된 테이블도 재연결 합니다). 가장 큰 장점은 사용자가 코드를 작성하는 방법을 많이 알지 못해도 구현할 수 있는 것입니다.

테이블을 재연결하는 작업을 자동으로 처리하는 것은 매우 유용합니다. 데이터베이스를 배포하는 경우에 소모되는 시간 낭비(배포 시 발생하는 문제 해결 등)를 줄여줍니다. 직접 클라이언트 측에서 작업하거나, 원격으로 연결해서 작업 할 필요가 없습니다. 또한 데이터베이스 파일 또는 연결된 테이블의 이름을 입력 할 필요가 없습니다.

동작 방법

이 코드는 프로그램 파일의 TableDefs 컬렉션에서 중요한 정보를 추출하여 연결을 갱신하는 데 사용합니다. 이 정보에는 연결된 테이블 및 데이터베이스 파일의 이름이 포함되어 있습니다. 이 정보와 프로그램 파일 데이터베이스의 기존 경로를 사용하여 “TableDef 연결 속성” 설정에 필요한 문자열을 얻습니다. TableDefs 컬렉션을 반복하며 “TableDef RefreshLink 메소드(Method)”를 통해 연결을 갱신합니다.

다음은 어떻게 작동할 지를 기술한 것입니다.

  • 데이터베이스 파일과 프로그램 파일이 같은 폴더에 있는 경우 연결된 모든 액세스 데이터베이스 테이블을 재연결 합니다.
  • 데이터베이스를 다른 폴더 또는 다른 컴퓨터로 이동하는 경우 테이블을 재연결 합니다.
  • 다중 데이터베이스 파일 테이블을 재연결 합니다.
  • 데이터베이스나 테이블을 저장하거나 이름을 입력 할 필요가 없습니다.
  • 오류가 있을 경우에도 연결된 테이블 또는 TableDef가 삭제되지 않습니다.

다음은 코드가 동작하지 않는 상황입니다.

  • 기존에 연결되었던 적이 없는 액세스 데이터베이스 테이블을 재연결 하지 않습니다.
  • 이름이 변경되었거나 데이터베이스 파일로 이동되었을 경우 테이블의 연결을 갱신하지 않습니다.
  • 이름이 변경된 데이터베이스 파일의 테이블 연결은 재연결 하지 않습니다.
  • ODBC, 엑셀, 아웃룩, dBase, Paradox 또는 연결된 테이블 또는 개체를 재연결 하지 않습니다.

 

요구 사항:

1) 프로그램 파일 및 데이터베이스 파일이 같은 폴더에 있어야 합니다.
이 요구 사항이 충족되면 파일이 어떤 폴더 또는 다른 컴퓨터라도 이동 할 수 있으며, 코드가 자동으로 테이블을 재연결 합니다.

2) ‘RefreshTableLinks 프로시저’ 호출 코드는 실행될 첫번째 폼의 오픈 이벤트에 추가하거나 AutoExec 매크로에 의해 호출되야 합니다.
이 기능이 제대로 동작하도록 하려면, 이 코드가 바운드 폼에서 (테이블의) 데이터를 불러오기 전에 실행히켜야 합니다.
(역자 주: Splash 폼이란? - 로그온 폼, 시작폼 같이 데이터베이스가 시작할 때 처음으로 표시되는 폼을 말합니다.)

 

테이블 재연결 펑션:

'----------------------------------------------------------------------------
' Procedure: RefreshTableLinks
' Purpose: Refresh table links to back-ends in the same folder as front end.
' Note: Linked Tables can be in more than one back-end.
' Return: Returns a zero-length string if all tables are relinked.
' Return: Or returns a string listing tables not relinked and errors.
'----------------------------------------------------------------------------

Public Function RefreshTableLinks() As String
On Error GoTo ErrHandle

Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim strCon As String
Dim strBackEnd As String
Dim strMsg As String
Dim intErrorCount As Integer

Set db = CurrentDb

'Loop through the TableDefs Collection.
For Each tdf In db.TableDefs
'Verify the table is a linked table.
If Left$(tdf.Connect, 10) = ";DATABASE=" Then
'Get the existing Connection String.
strCon = Nz(tdf.Connect, "")
'Get the name of the back-end database using String Functions.
strBackEnd = Right$(strCon, (Len(strCon) - (InStrRev(strCon, "\") - 1)))
'Verify we have a value for the back-end
If Len(strBackEnd & "") > 0 Then
'Set a reference to the TableDef Object.
Set tdf = db.TableDefs(tdf.Name)
'Build the new Connection Property Value.
tdf.Connect = ";DATABASE=" & CurrentProject.Path & strBackEnd
'Refresh the table link.
tdf.RefreshLink
Else
'There was a problem getting the name of the back-end.
'Add the information to the message to notify the user.
intErrorCount = intErrorCount + 1
strMsg = strMsg & "Error getting back-end database name." & vbNewLine
strMsg = strMsg & "Table Name: " & tdf.Name & vbNewLine
strMsg = strMsg & "Connect = " & strCon & vbNewLine
End If
End If
Next tdf

ExitHere:
On Error Resume Next
If intErrorCount > 0 Then
strMsg = "There were errors refreshing the table links: " _
& vbNewLine & strMsg & "In Procedure RefreshTableLinks"
RefreshTableLinks = strMsg
End If
Set tdf = Nothing
Set db = Nothing
Exit Function

ErrHandle:
intErrorCount = intErrorCount + 1
strMsg = strMsg & "Error " & Err.Number & " " & Err.Description
strMsg = strMsg & vbNewLine & "Table Name: " & tdf.Name & vbNewLine
strMsg = strMsg & "Connect = " & strCon & vbNewLine
Resume ExitHere

End Function

위 프로시저는 오류가 발생했을 경우에만 메시지를 반환합니다. 이 경우 데이터베이스를 열 때마다 팝업 되는 MsgBox 대신 “직접 실행 창”에 테이블 재연결 성공 여부를 기록 할 수 있습니다. 테이블 재연결이 하나 이상 실패하거나 오류가 있는 경우 팝업으로 사용자에게 알리려면 MsgBox를 사용하도록 코드를 구성하면 됩니다. 

아래의 코드는 프로시저를 호출하고 오류를 표시 할 때 MsgBox를 사용하는 방법을 보여줍니다.
Dim strMsg As String

'Run the Procedure, getting any error messages.
strMsg = RefreshTableLinks()

'strMsg will be a zero-length string if there is no error message.
If Len(strMsg & "") = 0 Then
Debug.Print "All Tables were successfully relinked."
Else
'Notify the user of the errors.
MsgBox strMsg, vbCritical
End If

이 프로시저를 데이터베이스를 열 때 마다 실행되게 하는 것이 좋습니다. 표준 모듈에서 RefreshTableLinks 펑션을 넣어 프로시저를 호출 할 수 있는 코드를 추가하기만 하면 됩니다. 테이블 재연결이 실패하거나, 데이터베이스의 손상이 생기거나(아주 드믄 케이스입니다.) 파일 중 하나를 다른 폴더로 옮기려 하거나 데이터베이스 파일의 이름을 변경하고자 하기 전까지는 알아서 테이블을 재연결 해줍니다.

이 코드는 프로그램 파일에 연결 된 데이터베이스 테이블만을 액세스에 연결합니다. 자세한 내용을 보시려면 액세스 2010 또는 액세스 2007의 “DAO TableDef 연결 속성”과 “DAO TableDef RefreshLink 메소드”에 대해 읽어 보면 됩니다.

List of Articles
번호 제목 글쓴이 날짜 조회 수
공지 액세스-일반 길벗출판사 / 실무액세스 예제파일(64비트용) [4] 돌직구 2021-01-13 30240
공지 액세스-일반 길벗출판사 / 액세스 2013 무작정 따라하기 정오표 돌직구 2014-10-09 80478
공지 액세스-일반 길벗출판사 / 액세스 2010 무작정 따라하기 정오표 file 돌직구 2012-10-26 125917


  주소  12925 경기도 하남시 미사대로 540, B동 917호 (현대지식산업센터 한강미사2차) ㈜팀데이터이십일  |  고객센터 전화번호  02-467-2998  |  대표이사  염기웅
개인정보관리책임자  염기웅 (ml_privacy@td21.com)  |  사업자등록번호  120-86-79260  |  통신판매업신고번호  제 2021-경기하남-1166 호  [사업자 정보 확인]
  TD21의 사전 서면 동의 없이 TD21 사이트 일체의 정보, 콘텐츠 및 UI 등을 상업적 목적으로 전시, 전송, 스크래핑 등 무단 사용할 수 없습니다.