从 CSV 导入更新现有访问记录,MS Access 原生或 VB.NET

Update Existing Access Records from CSV Import , native to MS Access or in VB.NET

我是我所在组织的票务系统的应用程序管理员。 我们正在添加一个新客户,需要将他们的客户记录导入我们的系统。

但是,我们无法直接从直接数据库连接获取这些记录。

我们仅限于进入他们的票务系统,并且运行将现有记录导出到 CSV 文件。

为了使它与我们的系统一起工作,我将这些 CSV 文件输入到 MS Access 数据库中,我们的系统将读取该数据库并在我们的票务系统中记录 import/update。

但是,我找不到从 CSV 中的记录更新 MS Access 数据库中的记录的方法。

我可以将记录导入 table,但它会跳过任何已经存在的记录(客户数据中包含一个字段,用作唯一标识符/主键以区分新的/现有记录)。

任何已经包含此主键的记录都将被简单地跳过,它不会更新包含该键的 ms access 数据库中的记录。

除了创建基本的 table 和表单外,我没有太多使用 MS Access 的经验;这超出了我的正常工作范围。

我需要找到一种方法来获取包含记录的 CSV 文件,这些记录可能已经存在也可能不存在于此 ms 访问数据库中,如果 CSV 中没有包含则创建新记录,或者如果记录包含在中则更新记录CSV 文件。

如何完成并不一定重要,我可以使用 vb.net 或宏来实现,如果您可以提供一种方法来实现。

我知道这有点偏离指导方针,我试图找到自己的方法,但未能想出任何代码来测试,post 作为起点(我很抱歉)。

本质上,您必须执行一系列操作查询:使用过滤器和联接的追加、更新和删除。您可以将查询保存为存储查询并通过 DoCmd.OpenQuery 调用它们,或者您可以将它们写入 VBA 作为要传递到 DoCmd.RunSQL sqlStatementCurrentDb.Excecute sqlStatement

的字符串

导入

首先,使用 DoCmd.TransferText acImportDelim 将 CSV 导入临时文件 table。确保在导入之前从临时 table 中清除以前的 csv 数据。

DELETE FROM tempTable;

更新

然后,更新临时和实时之间的现有记录 table,但更新实时现有客户的条件 table。在 Access SQL 中,联接可用于更新查询,但您可以 运行 进入 不可更新 查询:

UPDATE tempTable INNER JOIN liveTable 
ON tempTable.CustomerID = liveTable.CustomerID
SET liveTable.Col1 = tempTable.Col1,
    liveTable.Col2 = tempTable.Col2,
    liveTable.Col3 = tempTable.Col3, 
    ... ;

或者,绕过不可更新的查询:

UPDATE liveTable
SET liveTable.Col1 = DLookUp("Col1", "tempTable", "CustomerID=" & liveTable.CustomerID),
    liveTable.Col2 = DLookUp("Col2", "tempTable", "CustomerID=" & liveTable.CustomerID),
    liveTable.Col3 = DLookUp("Col3", "tempTable", "CustomerID=" & liveTable.CustomerID), 
    ... 
WHERE CustomerID IN 
    (SELECT CustomerID FROM tempTable);

完成后,清除刚刚从临时 table 更新的记录(以免与追加步骤和重复条目冲突):

DELETE FROM tempTable 
WHERE CustomerID IN 
      (SELECT CustomerID FROM liveTable);

追加

最后,将来自 temp table 的新记录附加到实时 table 但客户不在实时 table 的条件可以使用 LEFT JOIN ... NULL:

INSERT INTO (Col1, Col2, Col3 ...) 
SELECT Col1, Col2, Col3 ... 
FROM tempTable LEFT JOIN liveTable 
ON tempTable.CustomerID = liveTable.CustomerID
WHERE liveTable.CustomerID Is Null;