2014-01-20 7 views
1

이것은 내 코드이지만 1700 만 행을 모두 mdb로 내보내는 데 약 1 시간이 걸립니다. 이 목적을 위해 mysql 또는 sql 서버를 사용할 수 없습니다. Access db에서이 작업을 수행해야하며이 프로세스가 일주일에 한 번 실행됩니다. Plz은이 작업ADS를 사용하여 큰 csv 파일을 mdb로 가져올 때

Sub insertDataIntoMDB() 
Dim Dbfilepath As String 
Set cnn = CreateObject("ADODB.Connection") 
Set rs = CreateObject("ADODB.Recordset") 
Set rst = CreateObject("ADODB.Recordset") 

     Dim arrData() As String 
     Dim s As String 
     Dim i As Integer 


     Dbfilepath = ThisWorkbook.Path & "\DB\Interface.accdb" 
     cnn.Open "Provider= Microsoft.ACE.OLEDB.12.0;" & " Data Source=" & Dbfilepath & ";" & "Persist Security Info =False;" 

     q1 = "DELETE * FROM MYTABLE" 
     Set rs = cnn.Execute(q1) 

     'q1 = "ALTER TABLE MyTable ALTER COLUMN ID autonumber(1,1)" 
     'Set rs = cnn.Execute(q1) 

     p = UserForm1.csvFolder & "\" & sItem & ".csv" 

     Open p For Input As #1 
     Do While Not EOF(1) 

      Close #1 


      Line Input #1, s 
      arrData = Split(s, ",") 
      q1 = "INSERT INTO MyTable(F1,F2,F3) values(" & arrData(0) & "," & arrData(1) & "," & arrData(2) & ")" 
      Set rst = cnn.Execute(q1) 
     Loop 
     Close #1 
     rs.Close 
     rs`enter code here`t.Close 
     Set rst = Nothing 
     cnn.Close 
     Set rs = Nothing 
     Set cnn = Nothing 


End Sub 
+0

(MYTABLE) 및 CSV 파일로 작업하는 모든 테이블에 대해 더 자세히 알려주십시오. 어떻게 생겼습니까? (구조, 데이터) 등 –

+0

MS Access를 사용하고 싶지 않은 이유가 무엇입니까? 예 : DoCmd.TransferText? – user1917229

답변

0

바로 여기 당신이 데이터 손상에 대한 거대한 둔화 가능성이 사용할 수있는 가장 빠른 방법을 제안한다.

q1 = "INSERT INTO MyTable(F1,F2,F3) values(" & arrData(0) & "," & arrData(1) & "," & arrData(2) & ")" 
Set rst = cnn.Execute(q1) 

특히 VBA에서는 문자열 연결이 느립니다. 따라서 "something" & "something"을 작성하고 루프에 넣으면 성능이 저하 될 수 있습니다.

또한 일반적으로 ADO보다 DAO가 더 빠릅니다.

And maybe this question and its answers

당신이 ADO를 사용하여 당신이 그 다음으로 UpdateBatch를 호출 다음에 그 레코드에 데이터를 추가 SELECT 문으로 레코드 집합을 열 수도 있습니다 주장하는 경우

Read this answer
. 행운

You can read more discussion here

좋은!