Using ADO in Access to import CSV data

后端 未结 1 1932
醉话见心
醉话见心 2021-01-03 15:55

So I navigated to the following MSDN Resource Page that addresses how to use ADO objects. My problem is that I cannot get it to work.

What I am trying to do is open

1条回答
  •  北海茫月
    2021-01-03 16:21

    Instead of reading the CSV file line-by-line, then doing something with each line, I think you should open the file as an ADO recordset. And open a DAO recordset for your Access destination table.

    You can then iterate through the fields in each row of the ADO recordset and add their values into a new row of the DAO recordset. As long as the destination table includes fields with the same names and compatible data types as the CSV fields, this can be fairly smooth.

    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
    

    This is the Declarations section of the module where I saved that procedure:

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

    Change the values for these constants to test it on your system:

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

    Note the folder name does not include a trailing backslash.

    You will want to adapt that procedure to pass the file name as a parameter instead of leaving it as a constant. And, if your CSV files are stored in more than one directory, you will want to pass the folder name as a parameter, too.

    Hopefully showing you how to do it for one file will be enough and you can then take it from here to handle all your CSV files. Also consider adding error handling.

    0 讨论(0)
提交回复
热议问题