2008-10-24 4 views
3

먼저 몇 가지 배경 정보 : (Access 데이터베이스)데이터 집합을 사용하여 한 데이터베이스에서 다른 데이터베이스로 데이터를 전송하는 방법은 무엇입니까? 평소처럼

데이터베이스 A는 - 나는 단지 두 개의 열에서 필요한 정보가있는 테이블을 보유하고있다. 이 두 열의 정보는 데이터베이스 A에 액세스 할 수없는 사람들이 사용할 응용 프로그램에 필요합니다.

데이터베이스 B (액세스 데이터베이스) - 두 개의 열만있는 테이블을 포함합니다 (테이블에서 필요한 것까지 거울 에이). 데이터베이스 B는 응용 프로그램의 모든 사용자가 액세스 할 수 있습니다. 한 가지 문제는 열 이름이 데이터베이스 A의 테이블에있는 것과 동일하지 않다는 것입니다.

필요한 작업은 일주일에 한 번씩 자동으로 실행되는 유틸리티를 통해 필요한 데이터를 전송하는 것입니다. 두 데이터베이스가 완전히 동기화되어있을 필요는 없습니다. 전송 유틸리티는 두 데이터베이스 모두에 액세스 할 수있는 사용자 계정에서 실행됩니다 (분명히).

는 여기에 내가 (다시 더 나은 방법이 있는지, 멀리 제안 해주십시오) 촬영 한 접근 방식 : 그것은 필요한 테이블에만 두 개의 열입니다 데이터베이스 A.에서

  1. 잡고 데이터입니다.

  2. DataReader 개체와 WriterStream 개체를 사용하여 [tablename] .txt 파일에 데이터를 씁니다. 나는 schema.ini 파일을 사용하고 데이터 열이 데이터베이스 B와 같은 이름을 갖도록 할 수 있도록했습니다.

  3. 테이블을 미러링하는 DataTable을 포함하는 DataSet 개체를 만듭니다. 데이터베이스 B.

  4. text, hdr = yes 및 fmt = delimited의 확장 속성이있는 Microsoft.Jet.OLEDB.4.0 공급자를 사용하여 .txt 파일의 정보를 DataTable에 빨아들입니다. .ini 파일 설정 및 .txt 파일 설정). DataAdapter를 사용하여 DataTable을 채 웁니다.

  5. 이 갱신 될 필요가 테이블에있는 현재의 모든 데이터를 포함하도록

  6. 가 데이터베이스 B의 정보에 빨아 데이터베이스 B.에서 테이블을 반영 DataTable을을 포함, 다른 DataSet 개체를 만들기 다시 DataAdapter를 사용하여이 DataTable (서로 다른 데이터 소스를 사용하기 때문에 5 단계와는 다른)을 채 웁니다.

  7. 데이터베이스 A (또는 .txt 파일)의 데이터를 보유하는 DataTable을 기술적으로 병합합니다.

  8. 데이터베이스 B의 테이블을 변경하여 업데이트하십시오.

나는 업데이트, 삭제 및 삽입이 로직이 사용되지 않습니다, 그러나 데이터베이스 B. 이야기에 대한 repsonsible 인 데이터 어댑터에 대한 수동 명령을 작성한 데이터 집합 -에서 - 데이터베이스 - B.Merge (데이터 집합 때문에 -From-TxtFile [tableName])은 HasChanges 플래그를 반전하지 않습니다. 즉, DataSet-From-Database-B.Update는 명령을 실행하지 않습니다.

DataSet-From-TxtFile에서 데이터를 가져 와서 병합하여 데이터베이스 B에 적용 할 수있는 방법이 있습니까? 여기서 중요한 단계를 놓치고 있습니까?

데이터베이스 B의 테이블에서 모든 레코드를 삭제 한 다음 텍스트 파일의 모든 레코드를 삽입 할 수 있다는 것을 알고 있습니다. (데이터 세트의 각 레코드를 반복하고 트리거 할 수 있도록 row.SetAdded를 적용해야하는 경우에도 마찬가지입니다. HasChanges 플래그)하지만, 매번 변경 사항 만 적용해야합니다.

저는 C#과 2.0 Framework (하나의 테이블 만 처리하기 때문에 DataSet 및 DataAdapters 대신 DataTables 및 TableAdapters를 사용할 수 있음을 알고 있습니다. 데이터베이스 B에 필요한 경우

TIA

답변

3

동기화 문제 ...

여기 @Mitchel이 맞다고 생각합니다. 두 데이터베이스에 연결하고, 각각 테이블과 B 테이블을로드하는 프로그램을 작성하십시오. 그런 다음 A에있는 각 요소 (열 쌍)에 대해 B에 있는지 확인한 다음 B에 삽입하십시오. 그런 다음 B에있는 각 요소에 대해 A에 있는지 확인하십시오. 그렇지 않으면 B에서 제거하십시오 B. 나는 먼저 파일에 갈 필요가 없다.

의사 코드 :

DataTable A = load table from A 
DataTable B = load table from B 

foreach row in A 
    col1 = row[col1] 
    col2 = row[col2] 
    matchRow = B.select("col1 = " + col1 + " and col2 = " + col2) 
    if not matchRow exists 
     add new row to B with col1,col2 
    end 
end 

foreach row in B 
    col1 = row[col1] 
    col2 = row[col2] 
    matchRow = A.select("col1 = " + col1 + " and col2 = " + col2) 
    if not matchRow exists 
     remove row from B 
    end 
end 

update B 
+0

두 데이터베이스에서 열 이름이 다르기 때문에이 파일이 작성되었으므로 DataAdapter가 어떻게 반응하는지 확신 할 수 없었습니다. 파일을 사용하면 schema.ini 파일을 사용하고 텍스트 파일에 열 머리글을 써서 일치시킬 열 이름이있는 DataSet에 데이터를 강제로 적용 할 수 있습니다. –

+0

의사 코드가 좋습니다. 그것을하는 "수동"방법처럼 보이는 것은 실제로 그렇게 될 것이라고 생각했던 것만 큼 많은 고통이 아닙니다. 감사합니다 tvanfosson. –

0

이유는 단순히 수동 삽입을하고, 레코드를 데이터 판독기 및 루프를 사용?

오히려, 데이터 세트로 작업 병합 이상 등 내가 SQLServer를 사용하고 단지 여러 뷰가 전체를 피하기 위해 거기에 어떤 정보를 볼 수있는 제어와 하나의 테이블을했을 잠시 제쳐두고

+0

나는이를 생각했지만, 내가 과거에 비슷한 시도 기억하고 훨씬 느린 것 같았다. 또한 특정 레코드가 데이터베이스 A에서 삭제 될 수 있으므로 데이터베이스 B에서 제거해야 할 수도 있습니다. 병합이 해당 레코드를 처리할지 여부는 확실하지 않습니다. –

관련 문제