Ms access 在Access中使用ADO导入CSV数据

Ms access 在Access中使用ADO导入CSV数据,ms-access,vba,csv,ado,Ms Access,Vba,Csv,Ado,因此,我浏览了以下内容,介绍了如何使用ADO对象。我的问题是我不能让它工作 我试图做的是打开一个CSV文件并逐行读取,然后创建SQL INSERT语句将记录插入Access 2010中的现有表中。我试图找到一种更简单的方法,但这似乎是我唯一的选择。使用附带的工具执行此操作,但到目前为止,我没有任何运气 这里的主要问题是我的CSV文件标题不一致。我想将5个文件导入到同一个表中,但根据包含数据的字段的不同,每个文件都会有所不同。提取过程中忽略了那些没有数据的字段。这就是为什么我不能使用DoCmd.T

因此,我浏览了以下内容,介绍了如何使用ADO对象。我的问题是我不能让它工作

我试图做的是打开一个CSV文件并逐行读取,然后创建SQL INSERT语句将记录插入Access 2010中的现有表中。我试图找到一种更简单的方法,但这似乎是我唯一的选择。使用附带的工具执行此操作,但到目前为止,我没有任何运气

这里的主要问题是我的CSV文件标题不一致。我想将5个文件导入到同一个表中,但根据包含数据的字段的不同,每个文件都会有所不同。提取过程中忽略了那些没有数据的字段。这就是为什么我不能使用DoCmd.TransferText之类的东西

因此,现在我需要创建一个脚本,该脚本将打开文本文件,读取第一行中的标题,并根据特定文件的配置创建一个SQL INSERT语句

我有一种感觉,我对如何处理这个问题有很好的把握,但是无论我做什么尝试,我似乎都无法使用ADO使事情正常工作


谁能解释一下我是如何做到这一点的?我的症结在于让Access DB通过ADO从CSV文件接收信息。

与其逐行读取CSV文件,然后对每行执行操作,我认为您应该将该文件作为ADO记录集打开。并为访问目标表打开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
这是我保存该过程的模块的声明部分:

Option Compare Database
Option Explicit
#Const ProjectStatus = "DEV" '"DEV" or "PROD"
更改这些常量的值,以便在系统上进行测试:

Const cstrDestination As String = "tblMaster"
Const cstrFile As String = "temp.csv"
Const cstrFolder As String = "C:\share\Access"
注意:文件夹名称不包含尾随的反斜杠

您需要调整该过程,以将文件名作为参数传递,而不是将其作为常量。而且,如果您的CSV文件存储在多个目录中,您还需要将文件夹名称作为参数传递


希望向您展示如何处理一个文件就足够了,然后您可以从这里开始处理所有CSV文件。还考虑添加错误处理。

< P>我认为前面的答案是不必要的复杂。您所需要做的就是发送一个
XMLHTTP
请求。它以字符串的形式获取CSV数据,然后可以将其解析为表


我发布了一个VBA子例程,它在一个。我在代码注释中找到了这些技术的文档。我已经在Access 2019中运行了它,它很有效。

您的方法似乎是正确的。发布你到目前为止所拥有的(失败的部分),社区应该能够更好地帮助你。关于这个方法的快速问题。为什么要同时使用ADO和DAO?不能创建两个ADO连接吗?或者DAO是否为MS程序提供了更强大的功能集?今晚晚些时候我会试试这个。如果我能让它为一个文件工作,我有一个脚本,我可以用来迭代所有已经存在的文件夹/文件,我只需要从中调用工作函数。我会让你知道事情的进展,谢谢你的帮助!对于存储在Jet/ACE中的数据,DAO可以比ADO快得多。顶部的If语句是怎么回事?这些是条件编译指令。将该代码放在模块中,将光标放在
#如果
,然后按F1阅读帮助主题的详细信息。基本上,我想向您展示如何将ADO用于早期绑定(在DEV块下)或后期绑定(在PROD块下)。我使用
#Const ProjectStatus
在它们之间切换。早期绑定在开发过程中很方便,但需要引用。我切换到后期绑定进行生产并删除引用。