在毫秒访问中自动上传 csv 数据,并包括自动编号主键 ID 字段
Posted
技术标签:
【中文标题】在毫秒访问中自动上传 csv 数据,并包括自动编号主键 ID 字段【英文标题】:Automate load of csv data in ms access, and include autonumer primary key ID field 【发布时间】:2018-07-19 13:24:01 【问题描述】:我在使用 DoCmd.transfertext
脚本加载的 ms 访问表中添加主键自动编号 ID 字段时遇到问题。我尝试了一个 sql 脚本,甚至手动执行它,但我收到以下错误:“超出文件共享锁定计数。增加 MaxLocksPerFile 注册表项”。
我曾尝试使用DAO.DBEngine.SetOption dbmaxlocksperfile,1500000
来解决这个问题,但后来我收到另一个错误,说我已达到内存限制,请注意数据集有 900 000 行。
有趣的是,如果我使用文本导入向导手动加载文件,我可以将向导设置为添加主键 ID 字段,并且效果很好。我知道DoCmd.TransferText
不允许添加自动编号主键字段,所以我想知道如何最好地使用自动编号 ID 字段加载我的数据?
请参阅下面的代码:
Function Data_Load()
Dim strSQL
DoCmd.TransferText acImportDelim, "xxx Import Specification", "xxx", "C:\xxx.csv", True
DAO.DBEngine.SetOption dbMaxLocksPerFile, 1500000
strSQL = "ALTER TABLE PDQ ADD COLUMN ID AUTOINCREMENT"
Set rs = CurrentDb.CreateQueryDef("strSQL")
DoCmd.RunSQL (strSQL)
DAO.DBEngine.SetOption dbMaxLocksPerFile, 9500
End Function
【问题讨论】:
由于导入向导可以执行此操作(并且有效),因此可能值得尝试保存手动导入,并使用DoCmd.RunSavedImportExport
运行它。您可能必须添加解决方法以确保导入源和目标始终相同。
我刚刚测试过,效果很好。 :) 我在回答中添加了一些解决方法的想法。
如果主键已经存在于表中并且也在 csv 文件中定义。应该怎么办?
【参考方案1】:
既然导入向导可以做到这一点(并且有效),那就使用它吧!
一次性准备:
将示例导入文件复制到将运行所有已保存导入的通用位置 手动导入表“myTable”,并将其保存在最后,例如“myTable_Import”。然后你可以用DoCmd.RunSavedImportExport
运行它:
Sub TestSavedImport()
On Error Resume Next
DoCmd.DeleteObject acTable, "myTable"
On Error GoTo 0
' copy your actual import file to the generic path\file
' that you used during the manual import
' ...
' run saved import
DoCmd.RunSavedImportExport "myTable_Import"
' rename to actual target name
DoCmd.Rename "RealTableName", acTable, "myTable"
End Sub
【讨论】:
以上是关于在毫秒访问中自动上传 csv 数据,并包括自动编号主键 ID 字段的主要内容,如果未能解决你的问题,请参考以下文章
如何将上传的 CSV 或 XLS 文件中的数据自动导入 Google 表格
BigQuery - 通过应用脚本上传带有模式自动检测的 csv
每次在 Google Cloud Storage 上上传 CSV 时如何触发自动更新 Google BigQuery 数据集