gpt4 book ai didi

ms-access - "Operation not supported in transactions"在 Access 中复制/粘贴记录时

转载 作者:行者123 更新时间:2023-12-02 23:17:17 25 4
gpt4 key购买 nike

将单元格从 Excel 复制/粘贴到 Access 子窗体中时,如果没有创建父记录,将导致错误 - 正如预期的那样。

问题是,在发生此错误后, Access 被锁定在一种状态,即输入的所有后续数据都会导致 事务中不支持操作 错误。当您打开表时,您可以看到新添加的数据尚未出现在表中 - 因此看起来好像 Access 实际上在进行某种事务。

我试过点击“保存”..“刷新”..甚至添加一个 AfterInsert 事件来强制执行 commitTrans() 但没有运气 - 并且 Access 声称没有正在进行的交易

如果手动输入记录,则没有错误。该问题似乎仅在粘贴记录时发生。我猜测 Access 正在创建一个事务来处理多个记录操作,并且没有从错误中正确恢复。

我可以删除“必需”标志,它会起作用 - 但是你有孤儿记录。我在想,也许可以使用 After Insert Data Macro 来添加具有默认批次名称的新批次,并将新的 BatchID 自动填充到 Items 表中。然而,我不确定如何做到这一点。

我确实尝试使用更改前数据宏删除“必需”标志并捕获错误 - 但是虽然它减少了错误 - 它仍然产生了事务错误中不支持的相同操作。

我在 Microsoft 知识库上查找了错误,但没有找到任何特定于我的情况的信息。我在 stackoverflow 中搜索了错误消息,但一无所获。

我创建了一个新数据库并能够复制该问题。

复制步骤

设置数据库

  • 在 Access 2010 中创建新的 ACCDB 数据库
  • 创建一个名为“批次”的表,其中包含以下字段:
  • BatchID(自动编号)(主键)
  • 批次名称(文本)
  • 创建一个名为“Items”的表,其中包含以下字段:
  • RecordID(自动编号)(主键)
  • BatchID(长整数)
  • 将必需属性设置为 True
  • 数据 - 文本
  • 创建关系,将 Batches.BatchID 链接到 Items.BatchID
  • 包括批次中的所有记录,以及项目中的匹配记录
  • 强制参照完整性
  • 级联更新/删除
  • 创建一个名为“表单”的表单
  • 将记录源设置为批处理
  • 添加 BatchID 和 Batch name 文本框
  • 添加子窗体/子报表控件
  • 将源对象设置为“Table.Items”
  • 将链接主字段设置为“BatchID”
  • 将链接子字段设置为“BatchID”
  • 设置“过滤空母版”= 是
  • 创建示例数据(使用表单)
  • 批量创建新记录。
  • 设置批次名称 =“测试”
  • 在项目中创建一个新记录。
  • 引用批记录。
  • 设置数据 =“测试”

  • 正如你所看到的,手工这很好用。

    从 Excel 复制和粘贴数据
  • 在 Excel 中
  • 从 A1 到 A10,每个单元格输入一个字母:A、B、C、D、E、F、G、H、I、J
  • 突出显示单元格 A1-A10
  • 复制 (Control+C)
  • 在 Access 中,使用表单:
  • 添加新的批次记录。它应该在 BatchID 文本框中显示“(新)”
  • 不要输入批次名称
  • 在子窗体中,单击新记录的记录选择器 (*) 以选择整行。键入 Control+V 进行粘贴。
  • 单击“您必须在‘Data.BatchID’字段中输入一个值。错误的确定”
  • 此错误可能会重复。继续点击确定
  • 如果它询问“您想抑制更多错误消息吗...”回答是
  • 对于“Microsoft Access 无法粘贴的记录已插入到名为“粘贴错误”的新表中,单击“确定”。通知
  • 在批处理名称文本框中填写“TestName”
  • 尝试优雅地恢复。击中逃生。更改记录。

  • 此时 - 您应该看到输入的 BatchID、批次名称和新数据。一切似乎都按预期工作。如果您尝试刷新或导航到另一批记录 - 您将收到错误 事务中不支持操作 . Access 将继续显示此错误消息,直到我们关闭并重新打开表单。您粘贴的数据不会进入数据库。

    通常,精通技术的人会意识到某些事情进展不顺利并关闭数据库并重新打开......但不幸的是,我有用户使用任何弹出框播放“打地鼠”然后尝试继续 - 所以我想让事情尽可能地防弹。

    想要的解决方案

    我想要一个解决这个问题的方法,它最终不会导致其他具有 Access 权限、重复值等的怪癖。

    根据我自己的经验,使用 VBA 来“修复” key 是不可靠的。数据宏似乎更可靠 - 但它们设置起来可能很棘手 - 它们还不是很主流(我想说 stackoverflow 上应该有一个 ms-access-data-macros 标签,但没有然而)

    最佳答案

    建议的解决方法:

    在[批次]表中,设置Required [BatchName] 字段的属性为 Yes .

    更改 Tab Stop [BatchID] 文本框的属性设置为“否”。这将使 [BatchName] 文本框在表单打开时获得默认焦点。

    On Current表单的事件使 [BatchName] 文本框成为新记录的焦点 ( IsNull(Me.BatchID) = True )。

    当 [BatchName] 文本框失去焦点时,使表单变脏。

    Option Compare Database
    Option Explicit

    Dim DeletePending As Boolean

    Private Sub Form_Load()
    DeletePending = False
    Me.ItemSubForm.Enabled = False ' Disable Subform by default
    End Sub

    Private Sub Form_Current()
    If IsNull(Me.BatchID) Then
    Me.BatchName.SetFocus
    ' Disable Subform if BatchID is NULL
    Me.ItemSubForm.Enabled = False
    Else
    ' Enable SubForm Otherwise
    Me.ItemSubForm.Enabled = False
    End If
    End Sub

    Private Sub Form_BeforeDelConfirm(Cancel As Integer, Response As Integer)
    DeletePending = True
    End Sub

    Private Sub Form_AfterDelConfirm(Status As Integer)
    DeletePending = False
    End Sub

    Private Sub BatchName_LostFocus()
    If IsNull(Me.BatchID) And Not DeletePending Then
    Me.Dirty = True
    End If
    End Sub

    当用户单击子表单(和 [BatchName] 文本框之外)时,它们会使表单变脏并且 BatchID 获得一个值。然后他们可以粘贴,但他们不会收到 [BatchID] 的“您必须输入一个值...”消息。如果他们没有输入 [BatchName] 值,他们现在会收到提示(因为现在是 Required ),但至少他们可以从中恢复。

    2013-11-09 18:40 UTC 更新:

    在玩弄这个多一点时,我发现了两个怪癖:
  • 如果您删除了最后一个父记录,Access 会这样做,然后立即在其位置创建另一个新记录。
  • 如果您导航到"new"父记录,然后立即退出(例如,通过 PageDown 和 PageUp 键),Access 将创建一个新记录,然后将您留在该记录上,表格为脏。按 Esc 然后移出"new"记录有效,并且不会导致任何错误,但这肯定会让用户感到困惑。

  • 我已经更新了答案以尝试解决这些问题。我添加了更多 VBA 代码来跟踪“DeletePending”状态。我还添加了将 [BatchName] 设置为 Required = Yes 的要求在 [批次] 表中。如果用户移入"new"记录然后立即再次移出,后者会使它稍微更直观(尽管有点烦人)。

    关于ms-access - "Operation not supported in transactions"在 Access 中复制/粘贴记录时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19712641/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com