在毫秒访问中自动上传 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 表格

SQL数据库列自动生成编号?

BigQuery - 通过应用脚本上传带有模式自动检测的 csv

每次在 Google Cloud Storage 上上传 CSV 时如何触发自动更新 Google BigQuery 数据集

VBA访问需要在保存新记录之前获取自动编号

afterupdate 在主键中留下空白