繁体   English   中英

如何在MS Access 2007中更新表

[英]How to update table in MS Access 2007

我正在尝试从临时表更新MS Access 2007中表中的记录。 临时表从外部工具获取新数据。 新数据(2列)应该放入持久表中。

我尝试了以下两个查询,但是当我查看查询的数据表视图时,它们都显示空记录。 (顺便说一句,是否有更好的方法可以在访问中调试SQL?)第二个查询还显示了与table1中一样多的行,而不是仅由外部工具编辑的行数。 (在两种情况下,每一行的结果都是空的)

至少具有正确记录数量的版本:

UPDATE (table1 INNER JOIN table2 ON table1.key = table2.key)
SET table1.value1 = table2.value1, table1.datevalue = table2.datevalue
WHERE ((table1.value1) IS NULL);

该版本的记录数与表1中的记录数相同:

UPDATE table1
SET table1.value1 = (SELECT value1
FROM table2
WHERE ((table1.value1 IS NULL)
AND (table1.key = table2.key))),
table1.datevalue = (SELECT datevalue
FROM table2
WHERE ((table1.key = table2.key)
AND (table1.value1 IS NULL)))

在我的测试工具操纵1分的记录,所以我希望看到一行与从表2 value1DATEVALUE查询的输出,但输出显示value1DATEVALUE空项(1或表1(记录量))。

show empty records when I look at the Datasheet view of the Query

如果在表模式下打开“更新查询”,则只会看到单元格的当前值。 您应该运行(执行)查询以更新值。 无法检查更新查询的预览(据我所知)。

为了完全回答您的问题,默认情况下,MS Access .exe程序中的操作查询(包括UPDATEINSERT将引发消息提示,以通知用户将更新或插入多少行以及用户是否要继续执行该操作。 动作查询的其他视图可能不会通知受影响的记录。

访问GUI消息

如果从以下位置调用操作查询,则会弹出此消息:

如果不使用MS Access .exe(因为Access既是应用程序又是数据库),则仍然可以使用DAO的Database.RecordsAffected属性(它是MS Access对象库的一部分)通过代码影响多少条记录。 任何COM界面语言都可以运行相同的进程,包括VBA,Python,PHP,Java等。

VBA示例 (注意:VBA是MS Access和其他Office应用程序的单独组件)

Sub RunUpdate()    
   Dim db as DAO.Database

   Set db = CurrentDb()
   db.Execute "mySavedUpdateQuery"

   MsgBox CStr(db.RecordsAffected) & " records were affected."    

   Set db = Nothing
End Sub

Python范例

import os
import win32com.client

access_file = r'C:\Path\To\MyDatabase.accdb'

try:
    oApp = win32com.client.Dispatch("Access.Application")
    oApp.OpenCurrentDatabase(access_file)

    db = oApp.Currentdb()
    db.Execute("EmployeesUpdateQ")
    print("{} records were affected.".format(db.RecordsAffected))

except Exception as e:
    print(e)

finally:
    oApp.Quit()
    db = None; oApp = None
    del db; del oApp

行数问题

您的两个查询将更新不同数量的记录。 第一个版本在外部级别上保持JOINWHERE条件,因此将影响table1中记录的过滤数量。

UPDATE (table1 t1 INNER JOIN table2 t2 ON t1.[key] = t2.[key])
SET t1.value1 = t2.value1, 
    t1.datevalue = t2.datevalue
WHERE ((t1.value1) IS NULL);

第二版本使用具有JOINWHERE条件的子查询,但在外层没有任何查询,因此table1的所有记录都将受到影响,但是特定值可能会更新为NULL 实际上,如果子查询返回多个值,您可能会收到异常错误:

UPDATE table1
SET table1.value1 = (SELECT value1
                     FROM table2
                     WHERE ((table1.value1 IS NULL)
                       AND  (table1.[key] = table2.[key]))),

    table1.datevalue = (SELECT datevalue
                        FROM table2
                        WHERE ((table1.[key] = table2.[key])
                          AND  (table1.value1 IS NULL)))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM