【发布时间】:2013-10-31 17:06:25
【问题描述】:
当将单元格从 Excel 复制/粘贴到 Access 子表单中时,如果没有创建父记录,则会导致错误 - 正如预期的那样。
问题在于,发生此错误后,访问被锁定在所有后续输入数据导致事务中不支持的操作错误的状态。当您打开表格时,您可以看到新添加的数据还没有在表格中 - 因此看起来好像 Access 实际上正在进行某种事务。
我尝试点击“保存”..“刷新”..甚至添加 AfterInsert 事件以强制执行 commitTrans(),但没有运气 - Access 声称没有正在进行的事务
如果手动输入记录,则不会出错。该问题似乎仅在粘贴记录时出现。我猜 Access 正在创建一个事务来处理多个记录操作,并且没有从错误中正确恢复。
我可以删除“必需”标志,它会起作用 - 但是你有孤儿记录。我在想也许可以使用 After Insert Data Macro 添加一个具有默认批次名称的新批次,并将新的 BatchID 自动填充到 Items 表中。不过,我不确定如何做到这一点。
我确实尝试使用更改前数据宏删除“必需”标志并捕获错误 - 但虽然它减少了错误 - 它仍然产生相同的事务中不支持的操作 错误。
我在 Microsoft 知识库中查找了该错误,但没有找到任何特定于我的情况的内容。我在stackoverflow中搜索了错误消息,但一无所获。
我创建了一个新数据库并且能够复制该问题。
复制步骤
设置数据库
- 在 Access 2010 中创建一个新的 ACCDB 数据库
- 创建一个名为“Batches”的表,其中包含以下字段:
- BatchID(自动编号)(主键)
- 批次名称(文本)
- 创建一个名为“Items”的表,其中包含以下字段:
- RecordID(自动编号)(主键)
- BatchID(长整数)
- 将必需属性设置为True
- 数据 - 文本
- 创建关系,将 Batches.BatchID 链接到 Items.BatchID
- 包括批次中的所有记录,以及项目中的匹配记录
- 实施参照完整性
- 级联更新/删除
- 创建一个名为“表单”的表单
- 将记录源设置为批次
- 在 BatchID 和 Batch 名称文本框中添加
- 添加子表单/子报表控件
- 将源对象设置为“Table.Items”
- 将链接主字段设置为“BatchID”
- 将链接子字段设置为“BatchID”
- 设置“在空母版上过滤”= 是
- 创建示例数据(使用表单)
- 批量创建新记录。
- 设置 BatchName = "Test"
- 在项目中创建新记录。
- 参考批次记录。
- 设置数据 =“测试”
- 批量创建新记录。
如您所见,手动操作很好。
从 Excel 复制和粘贴数据
- 在 Excel 中
- 从 A1-A10 向下每个单元格输入一个字母:A,B,C,D,E,F,G,H,I,J
- 突出显示单元格 A1-A10
- 复制(Control+C)
- 在 Access 中,使用表单:
- 添加新的批次记录。它应该在 BatchID TextBox 中显示“(新)”
- 请勿输入批次名称
- 在子表单中,单击新记录的记录选择器 (*) 以选择整行。键入 Control+V 进行粘贴。
-
单击“确定”“您必须在“Data.BatchID”字段中输入一个值。 错误
- 此错误可能会重复出现。继续点击确定
- 如果它询问“是否要抑制更多错误消息...”,请回答是
- 对于 “Microsoft Access 无法粘贴的记录已插入到名为“粘贴错误”的新表中。通知 单击“确定”
- 用“TestName”填写批次名称文本框
- 尝试优雅地恢复。点击逃生。更改记录。
此时 - 您应该会看到输入的 BatchID、批次名称和新数据。一切似乎都按预期工作。如果您尝试刷新或导航到另一批记录 - 您将收到错误 Operation not supported in transactions。 Access 将继续显示此错误消息,直到我们关闭并重新打开表单。您粘贴的数据不会进入数据库。
通常,有点技术知识的人会意识到某些事情进展不顺利并关闭数据库并重新打开......但不幸的是,我有用户在任何弹出框上玩“打地鼠”然后尝试继续 - 所以我想让事情尽可能地防弹。
所需的解决方案
我想要解决这个问题的方法,最终不会导致访问、重复值等其他怪癖。
根据我自己的经验,使用 VBA 来“修复”密钥并不可靠。数据宏似乎更可靠 - 但设置起来可能很棘手 - 它们还不是很主流(我想说应该有一个 ms-access-data-macros 标签在stackoverflow上,但还没有)
【问题讨论】:
-
能否附上或链接ACCDB和xls的示例文件
-
您在游戏说明的哪一部分遇到了困难?我想澄清这个问题,以便可以遵循。至于附件 - Stackoverflow 不支持文件附件。当链接到另一个网站(即文件托管)时,原始问题往往比附件更有效 - 因此发现问题的人无法访问附件。
-
我无法重新创建您的结果,即使您使用的是
.accdb文件的副本。当我粘贴时,我得到“您必须在 'Items.BatchID' 字段中输入一个值。”信息。在我关闭它之后,子表单仍然很脏,但之后我所做的任何事情都会重新显示该消息,直到我点击 [Esc] 来撤消子表单更改。然后事情就恢复正常了。我在 32 位和 64 位 Access 2010 上都试过了,只是想看看它是否有任何区别(它没有)。 -
我也无法重新创建。但我肯定知道在某些情况下会出现这样的错误,因为我在访问 2000 时遇到了这种错误。但我不记得我们是如何提升它以及如何解决它的。
-
好的,我现在可以重新创建它了。建议改进说明:“在子表单中,单击新记录的记录选择器 (
*) 以选择整行,然后键入 [Ctrl-V] 进行粘贴。” (之前我只是单击了新记录上的Data字段然后粘贴,因为这是我要粘贴数据的字段。)