从CSV导入更新现有访问记录,本机到MS Access或VB.NET

时间:2015-09-07 14:14:01

标签: vb.net csv ms-access sql-update insert-update

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

但是,我们被拒绝访问直接从直接数据库连接中获取这些记录。

我们仅限于进入其售票系统,并将现有记录导出为CSV文件。

为了使我们的系统能够正常运行,我正在使用这些CSV并将它们输入MS Access数据库,我们的系统将从中读取并导入/更新我们的票务系统上的记录。

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

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

只是跳过已包含此主键的所有记录,它不会更新包含该键的ms访问数据库中的记录。

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

我需要找到一种方法来获取包含可能已经存在或可能不存在于此ms访问数据库中的记录的CSV文件,并创建新记录(如果未包含在CSV中),或者更新记录(如果它们包含在CSV中)

如何完成此操作并不一定重要,我可以使用vb.net或宏来实现它,如果你能提供一种方法来实现这一点。

我明白这有点偏离准则,我试图找到自己做的方法,并且无法提出任何代码来测试和发布作为起点(我的道歉)

1 个答案:

答案 0 :(得分:2)

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

导入

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

DELETE FROM tempTable;

<强>更新

然后,更新临时表和实时表之间的现有记录,但是对于实时表中现有客户的条件。在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);

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

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

<强> APPEND

最后,将临时表中的新记录追加到实时表中,但是对于不在实时表中的客户的条件,您可以使用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;