所以我导航到以下MSDN Resource Page,解决了如何使用ADO对象的问题。我的问题是我无法让它发挥作用。
我要做的是打开一个CSV文件并逐行读取,然后创建SQL INSERT语句以将记录插入到Access 2010中的现有表中。我试图找到一种更简单的方法这,但这似乎是我唯一的选择。用附带的工具做到这一点,但到目前为止,我还没有运气。
这里的主要问题是我的CSV文件标题不一致。我想将5个文件导入同一个表,但每个文件将根据包含数据的字段而有所不同。在提取期间忽略那些没有数据的字段。这就是为什么我不能使用DoCmd.TransferText。
之类的东西所以,现在我需要创建一个脚本来打开文本文件,读取第一行中的头文件并根据特定文件的配置创建一个SQL INSERT语句。
我有一种感觉,我对如何评估这个问题有很好的处理,但无论我尝试什么,我似乎无法使用ADO工作。
任何人都可以解释我是如何实现这一目标的吗?我的关键点是让Access DB通过ADO从CSV文件接收信息。
答案 0 :(得分: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
这是我保存该程序的模块的声明部分:
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文件。还要考虑添加错误处理。
答案 1 :(得分:0)
我认为以前的答案不必要地复杂。您只需发送一个 XMLHTTP
请求即可。这会将 CSV 数据作为字符串提取,然后可以将其解析为表格。
我已经发布了一个在 answer to a similar question 中执行此操作的 VBA 子例程。我在哪里找到这些技术的文档在代码注释中。我已经在 Access 2019 中运行了它,并且可以正常工作。