2012-05-09 2 views
1

그래서 ADO 개체를 사용하는 방법을 설명하는 다음 MSDN Resource Page으로 이동했습니다. 내 문제는 그것이 작동하도록 할 수 없다는 것입니다.Access에서 ADO를 사용하여 CSV 데이터 가져 오기

CSV 파일을 열고 줄 단위로 읽은 다음 Access 2010의 기존 테이블에 레코드를 삽입하는 SQL INSERT 문을 만듭니다. 더 쉬운 방법을 찾으려고 노력했습니다. 이 일은 나의 유일한 선택 인 것처럼 보입니다. 포함 된 도구로이 작업을 수행했지만 지금까지는 운이 없었습니다.

여기서 중요한 문제는 일관되지 않은 제목이있는 CSV 파일이 있다는 것입니다. 동일한 테이블에 5 개의 파일을 가져오고 싶지만 각 파일은 데이터가 들어있는 필드에 따라 다릅니다. 데이터가없는 필드는 추출 중에 무시되었습니다. 이것이 DoCmd.TransferText와 같은 것을 사용할 수없는 이유입니다.

이제 텍스트 파일을 열고 첫 번째 줄의 헤더를 읽고 특정 파일의 구성에 따라 SQL INSERT 문을 작성하는 스크립트를 만들어야합니다.

나는 문제를 해결하는 방법을 잘 알고 있지만 내가 시도한 것에 상관없이 ADO를 사용하여 작업하는 것처럼 보이지 않는다고 생각한다.

아무도 내가 이것을 어떻게 달성 할 수 있는지 설명 할 수 있습니까? 필자의 주장은 Access DB가 ADO를 통해 CSV 파일에서 정보를 받도록하는 것입니다.

+0

귀하의 접근 방법이 맞는 것 같습니다. 지금까지 가지고있는 것을 게시하고 (실패한 섹션) 커뮤니티가 당신을 더 잘 도울 수 있어야합니다. – Pynner

답변

2

CSV 파일을 한 줄씩 읽는 대신 각 줄마다 무엇인가를하는 대신 파일을 ADO 레코드 집합으로 열어야한다고 생각합니다. Access 대상 테이블에 대한 DAO 레코드 집합을 엽니 다.

그런 다음 ADO 레코드 집합의 각 행에있는 필드를 반복하여 해당 값을 DAO 레코드 집합의 새 행에 추가 할 수 있습니다. 대상 테이블에 CSV 필드와 이름이 같고 호환 가능한 데이터 유형이있는 필드가 포함되어 있으면이 작업이 상당히 원활해질 수 있습니다.

Public Sub Addikt() 
#If ProjectStatus = "DEV" Then 
    ' needs reference for Microsoft ActiveX Data Objects 
    Dim cn As ADODB.Connection 
    Dim fld As ADODB.Field 
    Dim rs As ADODB.Recordset 
    Set cn = New ADODB.Connection 
    Set rs = New ADODB.Recordset 
#Else ' assume PROD 
    Const adCmdText As Long = 1 
    Const adLockReadOnly As Long = 1 
    Const adOpenForwardOnly As Long = 0 
    Dim cn As Object 
    Dim fld As Object 
    Dim rs As Object 
    Set cn = CreateObject("ADODB.Connection") 
    Set rs = CreateObject("ADODB.Recordset") 
#End If 
    Const cstrDestination As String = "tblMaster" 
    Const cstrFile As String = "temp.csv" 
    Const cstrFolder As String = "C:\share\Access" 
    Dim db As DAO.Database 
    Dim rsDao As DAO.Recordset 
    Dim strConnectionString As String 
    Dim strName As String 
    Dim strSelect As String 

    strConnectionString = "Provider=" & _ 
     CurrentProject.Connection.Provider & _ 
     ";Data Source=" & cstrFolder & Chr(92) & _ 
     ";Extended Properties='text;HDR=YES;FMT=Delimited'" 
    'Debug.Print strConnectionString 
    cn.Open strConnectionString 

    strSelect = "SELECT * FROM " & cstrFile 
    rs.Open strSelect, cn, adOpenForwardOnly, _ 
     adLockReadOnly, adCmdText 

    Set db = CurrentDb 
    Set rsDao = db.OpenRecordset(cstrDestination, _ 
     dbOpenTable, dbAppendOnly + dbFailOnError) 

    Do While Not rs.EOF 
     rsDao.AddNew 
     For Each fld In rs.Fields 
      strName = fld.Name 
      rsDao.Fields(strName) = rs.Fields(strName).value 
     Next fld 
     rsDao.Update 
     rs.MoveNext 
    Loop 

    rsDao.Close 
    Set rsDao = Nothing 
    Set db = Nothing 
    rs.Close 
    Set rs = Nothing 
    cn.Close 
    Set cn = Nothing 
End Sub 

이다 내가 그 절차 저장 모듈의 선언 구역 :

Const cstrDestination As String = "tblMaster" 
Const cstrFile As String = "temp.csv" 
Const cstrFolder As String = "C:\share\Access" 

참고 :이 상수의 값은 시스템에서 테스트하는

Option Compare Database 
Option Explicit 
#Const ProjectStatus = "DEV" '"DEV" or "PROD" 

변경 폴더 이름 뒤에 백 슬래시가 없습니다.

파일 이름을 상수로 남겨 두지 않고 매개 변수로 전달하려면이 절차를 적용해야합니다. CSV 파일이 둘 이상의 디렉토리에 저장되어있는 경우 폴더 이름도 매개 변수로 전달할 수 있습니다.

하나의 파일에 대해 파일을 저장하는 방법을 보여 주면 충분합니다. 여기에서 모든 CSV 파일을 처리 할 수 ​​있습니다. 또한 오류 처리 추가를 고려하십시오.

+0

이 방법에 대한 간단한 질문. 왜 ADO와 DAO를 모두 사용하고 있습니까? 두 개의 ADO 연결을 만들 수 있습니까? 아니면 DAO는 MS 프로그램을위한보다 강력한 기능 세트를 가지고 있습니까? 나는 오늘 밤 나중에 이것을 시도 할 것이다. 하나의 파일에서 작동하도록 할 수 있다면, 나는 모든 폴더/파일을 반복하는 데 사용할 수있는 스크립트를 가지고 있습니다. 이미 작업 함수를 호출 할 것입니다. 어떻게 일이 벌어지는 지 알려주고 도움을 주셔서 감사합니다! – toolshed

+1

DAO는 Jet/ACE에 저장된 데이터에 대해 ADO보다 상당히 빠릅니다. – HansUp

+0

질문이 하나 더 있습니다. 맨 위에있는 If 문은 무엇입니까? – toolshed

관련 문제