在没有记录集循环的情况下使用 ado 和 vbscript 从 csv 更新数据库?

Posted

技术标签:

【中文标题】在没有记录集循环的情况下使用 ado 和 vbscript 从 csv 更新数据库?【英文标题】:Updating Database from csv using ado and vbscript without recordset loop? 【发布时间】:2013-06-12 01:48:41 【问题描述】:

我想使用 Vb Script & ADO 将数据从 csv 文件上传到 Access 数据库,这样我就不必打开 Access 或 Excel。

到目前为止,我在下面有一个工作脚本,但是有没有更好的方法可以批量上传数据而无需创建记录集并循环遍历每条记录?

我创建了一个示例,其中我有 2 个原始数据文件 (csv),文件 People.csv 包含字段“PERSON”和“COMPANY”,另一个文件包含“COMPANY”和“STATUS”。要更新的数据库有一个表 'tblPeople',其中包含字段 'PERSON' 和 'STATUS'。

Const ST_FILES = "C:\test\Files\"
Const ST_DB = "C:\test\db\mydb.accdb"

'Connection to Raw Files
Dim stCS: stCS = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ST_FILES & _
                ";Extended Properties=""text;HDR=YES;FMT=Delimited(,)"";"
Dim objCnFiles: set objCnFiles = CreateObject("ADODB.Connection"):objCnFiles.open stCS

'Connection to DB
stCS = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ST_DB
Dim objCnDb: set objCnDb = CreateObject("ADODB.Connection"):objCnDb.Open stCS

'Recordset of Raw Files
Dim objRS: set objRS = CreateObject("ADODB.RecordSet")
Dim stSQL: stSQL = "SELECT T1.PERSON, T2.STATUS " & _
                    "FROM People#csv T1 " & _
                    "INNER JOIN Company#csv T2 "& _
                    "ON T1.COMPANY = T2.COMPANY"
objRS.open stSQL, objCnFiles

'The part Below is the part I want to improve:
'Loops through the recordset inserting record into db line by line.
objRS.MoveFirst
Do until objRS.EOF
    stSQL = "INSERT INTO tblPeople (PERSON, STATUS) " & _
            "VALUES('" & objRS.Fields("PERSON") & "','" & _
            objRS.Fields("STATUS") & "')"

    objCnDb.Execute stSQL
    objRS.MoveNext
Loop

objRS.close
objCnFiles.close
objCnDb.close

WScript.echo "Done"
WScript.Quit

编辑:解决方案下面使用Ekkehard.Horner提供的解决方案

Const ST_FILES = "C:\test\Files\"
Const ST_DB = "C:\test\db\mydb.accdb"

'Connection to Raw Files
Dim stCS: stCS = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ST_FILES & _
                ";Extended Properties=""text;HDR=YES;FMT=Delimited(,)"";"
Dim objCnFiles: set objCnFiles = CreateObject("ADODB.Connection"):objCnFiles.open stCS

Dim stSQL: stSQL = "INSERT INTO [tblPeople] IN '" & ST_DB & "'" &_
                    "SELECT T1.PERSON, T2.STATUS " & _
                    "FROM People#csv T1 " & _
                    "INNER JOIN Company#csv T2 "& _
                    "ON T1.COMPANY = T2.COMPANY"

objCnFiles.Execute stSQL
objCnFiles.close

WScript.echo "Done"
WScript.Quit

【问题讨论】:

INSERT 语句可以在单个查询中应用多条记录,因此您可以在执行前在循环中构建VALUES 部分。此外,您可以使用GetString() 方法代替循环,该方法可以将整个表格作为文本字符串返回,您可以指定列和行分隔符等 我可能错了,但我认为使用 'INSERT INTO ... VALUES ..." 您一次只能在 Access 中插入一个值。正确的语法是什么?(我尝试了几种语法,但都无法使用)。另外感谢 GetString() 方法,我不知道它存在,看起来非常有用。 是的,抱歉。我刚刚检查了一下,我错了。 【参考方案1】:

使用“INSERT/SELECT INTO IN 'External Database'”。对于您的特定任务(文本-> mdb, 您的查询)语句看起来像

Create new table:
SELECT T1.PERSON AS PERSON, T2.STATUS AS STATUS INTO [tblPeople] IN "P:\athto\your.mdb.mdb" FROM [People#csv] T1 INNER JOIN [Company#csv] T2 ON T1.COMPANY = T2.COMPANY

Append to existing table:
INSERT INTO [tblPeople] IN "P:\athto\your.mdb.mdb" SELECT T1.PERSON AS PERSON, T2.STATUS AS STATUS FROM [People#csv] T1 INNER JOIN [Company#csv] T2 ON T1.COMPANY = T2.COMPANY

【讨论】:

谢谢。这就是我一直在寻找的。​​span>

以上是关于在没有记录集循环的情况下使用 ado 和 vbscript 从 csv 更新数据库?的主要内容,如果未能解决你的问题,请参考以下文章

delphi中的SQL语句

ADO 记录集数据未显示在表单上

在内存中,独立,断开连接的 ADO 记录集

MS Access/ADO AddNew 方法不附加记录

MS Access - ADO 记录集,使用 SQL 语句检索数据和建表

MS Access ADO 记录集和二维数组