2017-11-30 15 views
0

Windows 양식 응용 프로그램이 있습니다. 일부 데이터 조작을 위해 MS Access 데이터베이스를 사용하고 있습니다. 한 데이터베이스에서 다른 데이터베이스로 데이터를 복사하려고합니다. 테이블 이름, 스키마 및 데이터 유형은 두 테이블에서 동일합니다.MS 액세스 데이터베이스에서 대량 삽입이 작동하지 않는 경우 선택

원본 데이터베이스에서 데이터를 선택하여 대상 데이터베이스에 데이터를 대량 삽입하려면 다음 쿼리를 사용하고 있습니다.

INSERT INTO [Table1] IN 'C:\Data\Users.mdf' SELECT * FROM [Table1] 

데이터가 삽입 된 후 삽입 된 데이터를 가져 오기 위해 대상 테이블을 쿼리하고 있습니다. OleDbConnection을 사용하여 데이터베이스 작업을 수행하고 있습니다.

내가 직면 한 문제는 데이터를 가져 오기 위해 SELECT 문을 실행할 때 위에서 언급 한 INSERT 쿼리를 실행 한 후 데이터를 가져 오지 못한다는 것입니다. 그러나 디버깅 모드에서 데이터를 가져올 때 확인합니다.

INSERT 문이 실행 된 후 잠시 기다리면 데이터가 올바르게 전달됩니다. 그래서 대량 삽입 작업을 완료하는 데 약간의 시간 (지연?)이 필요하다고 가정합니다.

INSERT 쿼리를 실행 한 후 Task.Delay(20000)을 제공했지만 시도하지 않았습니다. 누군가가 나를 도울 수 있었는지, 어떻게이 문제를 해결할 수 있습니까? 어떤 도움을 주셔서 감사합니다.

+0

데이터의 양은 어느 정도입니까? 그리고 그것을 살펴보고 데이터가 제대로 들어가고 있는지 확인하기 위해 테이블을 열었습니까? 아마 원본 테이블을 대상 데이터베이스로 가져 와서 적절히 다시 작성한 쿼리를 실행할 것입니다. 그런 다음 적어도 두 개의 개별 데이터베이스 간의 통신에서 발생할 수있는 문제점을 제거합니다. –

+0

약 7 lakh 기록이 있습니다. 그러나이 문제를 10 개의 레코드로 복제 할 수 있습니다. INSERT 작업이 수행되기 전에 원본 데이터베이스와 대상 데이터베이스 모두에 대한 데이터베이스 연결이 열려 있습니다. –

+0

전체 절차를 게시하는 것이 좋습니다. –

답변

0

나는 이것을 처리 할 좋은 방법을 찾지 못했지만 같은 것을 해결하려고 노력했다. 데이터가 테이블에 삽입 된 후 삽입 된 테이블에 데이터가 있는지 여부를 확인하기 위해 다른 쿼리가 실행됩니다. 이것은 다음과 같이 do..while 루프에서 발생합니다. 작업이 완료 될 때마다 테이블이 삭제됩니다.

 var insertQuery = "INSERT INTO [Table1] IN 'C:\Data\Users.mdf' SELECT * FROM [Table1]"; 
     ExecuteQuery(insertQuery, connProd); 

     var count = 10; 

     do 
     { 
      var selectQuery = "SELECT TOP 1 * FROM " + tableProdCopy; 
      var dtTopRowData = GetQueryData(selectQuery, connOther); 

      if (dtTopRowData != null && dtTopRowData.Rows.Count > 0) 
      { 
       count = 0; 
       break; 
      } 

      System.Threading.Thread.Sleep(2000); 

      count = count - 1; 
     } while (count > 0); 


     private DataTable GetQueryData(string query, OleDbConnection conn) 
     { 
      using (OleDbCommand cmdOutput = new OleDbCommand(query, conn)) 
      { 
       using (OleDbDataAdapter adapterOutput = new OleDbDataAdapter(cmdOutput)) 
       { 
        var dtOutput = new DataTable(); 

        adapterOutput.Fill(dtOutput); 

        return dtOutput; 
       } 
      } 
     } 



     private void ExecuteQuery(string query, OleDbConnection conn) 
     { 
      using (OleDbCommand cmdInput = new OleDbCommand(query, conn)) 
      { 
       cmdInput.ExecuteNonQuery(); 
      } 
     }