문제

두 개의 MS-Access .MDB 파일을 비교하여 포함 된 데이터가 둘 다 동일인지 확인하고 싶습니다.

어떻게 할 수 있습니까?

도움이 되었습니까?

해결책

나는 로컬 MDB가 웹 사이트에 입력 한 데이터에서 그에 적용된 업데이트가 필요한 경우에 여러 번 코드로 이런 종류의 작업을 여러 번 수행했습니다. 어떤 경우에는 웹 사이트가 MDB에 의해 주도되었으며, 다른 경우에는 MySQL 데이터베이스였습니다. MDB의 경우 방금 다운로드했습니다. MySQL의 경우 웹 사이트에서 스크립트를 실행하여 내보내기 및 FTP 텍스트 파일을 실행했습니다.

이제 요점은 로컬 MDB의 데이터를 웹 사이트에서 다운로드 한 데이터와 비교하고 로컬 MDB를 업데이트하여 웹 사이트의 변경 사항을 반영하고 싶다는 것입니다 (아니요, 단일 데이터 소스를 사용할 수 없었습니다. - 내가 제안한 첫 번째 일 이었지만 실현 가능하지 않았습니다).

MDB를 로컬 데이터베이스를 호출하고 MDB B를 비교하기 위해 다운로드중인 MDB B라고합시다. 당신이 확인 해야하는 것은 다음과 같습니다.

  1. MDB A에는 존재하지만 MDB B에 존재하지 않는 기록은 삭제 후보일 수도 있고 아닐 수도 있습니다 (특정 데이터에 따라 다름).

  2. MDB B에는 존재하지만 MDB A에는 존재하지 않는 기록이 있습니다. 이들은 MDB B에서 MDB A까지 추가됩니다.

  3. 둘 다에 존재하는 레코드는 필드별로 필드를 비교해야합니다.

1 단계와 #2는 외부 조인을 사용하여 누락 된 레코드를 찾는 쿼리로 상당히 쉽게 달성됩니다. 3 단계에는 일부 코드가 필요합니다.

코드의 원칙은 두 MDB의 모든 테이블의 구조가 동일하다는 것입니다. 따라서 DAO를 사용하여 TableDefs 컬렉션을 걷고 레코드 세트를 열고 필드 컬렉션을 걸어 데이터를 업데이트하거나 차이점 목록을 출력하는 각 테이블의 각 열에서 SQL 문을 실행합니다.

코드의 기본 구조는 다음과 같습니다.

  Set rs = db.OpenRecordset("[SQL statement with the fields you want compared]")
  For Each fld In rs.Fields
    ' Write a SQL string to update all the records in this column
    '   where the data doesn't match
    strSQL = "[constructed SQL here]"
    db.Execute strSQL, dbFailOnError
  Next fld

이제 여기서 주요 복잡성은 각 필드에 대한 WHER 절이 달라야한다는 것입니다. 텍스트 필드는 숫자 및 데이터 필드와 다르게 처리해야합니다. 따라서 필드 유형에 따라 Where 절을 작성하는 선택된 사례를 원할 것입니다.

  Select Case fld.Type
    Case dbText, dbMemo
    Case Else
  End Select

NZ ()를 사용하여 텍스트 필드를 비교하지만 숫자 필드 또는 날짜 필드에 NZ (Numericfield, 0)를 사용하면서 NZ (Textfield, '')를 사용하려고합니다.

내 예제 코드는 실제로 위의 구조를 사용하여 where 절을 정의하지 않습니다. ZLS (텍스트 필드)와 연결된 필드로 제한되어 있기 때문입니다. 아래는 읽기가 매우 복잡하지만 기본적으로 위의 구조에 대한 확장입니다.

테이블의 각 필드에 대한 SQL 업데이트를 실행하기 때문에 업데이트 효율성을 위해 작성되었으며, 이는 각 행에 대한 SQL 업데이트를 실행하는 것보다 훨씬 효율적입니다. 반면에 업데이트를 원하지 않지만 차이점 목록을 원한다면 모든 것을 다르게 취급 할 수 있습니다. 그러나 그것은 출력에 따라 꽤 복잡해집니다.

두 개의 MDB가 동일하다면 먼저 각 테이블의 레코드 수를 확인하고, 일치하지 않은 경우, MDB가 동일하지 않다고 말하고 알려줍니다. RecordCounts가 동일하다면 필드별로 필드를 점검해야합니다. Column-By-Column SQL이 동적으로 작성된 것으로 가장 잘 수행된다고 생각합니다. MDB가 동일하지 않다고 사용자에게 알리십시오.

복잡한 부분은 차이점을 기록하고 사용자에게 알리려면, 이에 들어가면 이미 내적 할 수없는 게시물이 더 길어질 것입니다!

다음은 더 큰 서브 루틴의 코드의 일부일뿐입니다. 저장된 쿼리 qddfoldmembers (MDB a)를 QDFNewMembers (MDB B)의 데이터로 업데이트합니다. 첫 번째 인수 인 STRSQL은 비교하려는 필드로 제한되는 일부 명령문이며, strtmpdb는 다른 MDB의 경로/파일 이름입니다 (예에서 MDB B). 이 코드는 strtmpdb에 qdfnewmembers와 qddoldmembers가 이미 만들어 졌다고 가정합니다 (원래 코드는 저장된 querydef를 즉시 씁니다). 직접 테이블 이름 일 수 있습니다 (저장된 쿼리를 사용하는 유일한 이유는 필드 이름이 작성된 두 MDB 사이에 정확히 일치하지 않기 때문입니다).

Public Sub ImportMembers(strSQL As String, strTmpDB As String)
  Const STR_QUOTE = """"
  Dim db As Database
  Dim rsSource As Recordset '
  Dim fld As Field
  Dim strUpdateField As String
  Dim strZLS As String
  Dim strSet As String
  Dim strWhere As String

  ' EXTENSIVE CODE LEFT OUT HERE

  Set db = Application.DBEngine(0).OpenDatabase(strTmpDB)

  ' UPDATE EXISTING RECORDS
  Set rsSource = db.OpenRecordset(strSQL)
  strSQL = "UPDATE qdfNewMembers INNER JOIN qdfOldMembers ON "
  strSQL = strSQL & "qdfNewMembers.EntityID = qdfOldMembers.EntityID IN '" _
                       & strTmpDB & "'"
  If rsSource.RecordCount <> 0 Then
     For Each fld In rsSource.Fields
       strUpdateField = fld.Name
       'Debug.Print strUpdateField
       If InStr(strUpdateField, "ID") = 0 Then
          If fld.Type = dbText Then
             strZLS = " & ''"
          Else
             strZLS = vbNullString
          End If
          strSet = " SET qdfOldMembers." & strUpdateField _
                     & " = varZLStoNull(qdfNewMembers." & strUpdateField & ")"
          strWhere = " WHERE " & "qdfOldMembers." & strUpdateField & strZLS _
                       & "<>" & "qdfNewMembers." & strUpdateField & strZLS _
                       & " OR (IsNull(qdfOldMembers." & strUpdateField _
                       & ")<>IsNull(varZLStoNull(qdfNewMembers." _
                       & strUpdateField & ")));"
          db.Execute strSQL & strSet & strWhere, dbFailOnError
          'Debug.Print strSQL & strSet & strWhere
       End If
     Next fld
  End If
End Sub

함수 코드 varzlstonull () :

Public Function varZLStoNull(varInput As Variant) As Variant
  If Len(varInput) = 0 Then
     varZLStoNull = Null
  Else
     varZLStoNull = varInput
  End If
End Function

그것이 이해하기에는 너무 복잡한 지 모르겠지만 누군가를 도울 것입니다.

다른 팁

당신은 시도 할 수 있습니다 AccessDiff (유료 제품). 스키마, 데이터 및 액세스 객체를 비교할 수 있습니다. GUI와 명령 줄 인터페이스도 있습니다.

공개 : 저는이 도구의 제작자입니다.

데이터베이스 테이블의 텍스트 덤프를 가져 와서 Beyond Compare (또는 다른 텍스트 비교 도구)를 사용하여 덤프 된 텍스트 파일을 비교하십시오. 조잡하지만 효과가 있습니다!

나는 아주 좋은 경험을 가지고 있습니다 교차-대사 비교기. 구조 및/또는 데이터를 비교할 수 있습니다.

Access 데이터베이스 비교 섹션을 참조하십시오 Microsoft Access 타사 유틸리티, 제품, 도구, 모듈 등 내 웹 사이트의 페이지.

"Table Diff"기능을 추가했습니다 accdbmerge 오래 전에 유틸리티. 이 답변은 원래 질문을 해결하는 데 도움이되지 않지만 앞으로도 같은 문제에 직면 한 사람에게 도움이 될 수 있습니다.

파일이 동일인지 알고 싶다면

fc file1.mdb file2.mdb 

DOS 명령 줄에서.

파일이 동일하지 않지만 동일한 테이블과 레코드가 포함되어 있다고 생각되면 가장 쉬운 방법은 두 가지 쿼리를 수행하여 두 가지 사이의 차이를 추출하기 위해 이종 쿼리를 수행하는 테이블을 통해 데이터베이스와 순환을 모두 엽니 다. 파일.

당신을 위해 이것을 할 수있는 몇 가지 도구가 있지만, 그들은 모두 Shareware 인 것 같습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top