3

如标题所示,我遇到了一个奇怪的现象。我有一个包含两个子表单的表单。在两个子表单上,我都有一个按钮,可以触发对相关子表单的重新查询。如果在加载表单后,我立即单击此按钮(重新查询表单),当我尝试将 OnCurrent 事件中当前记录的主键值保存到变量时,出现错误“3021:无当前记录”。奇怪的是,在调试器中相关值是这样的:

  Form.CurrentRecord=1
  Form.RecordSet.Absoluteposition=-1
  Form.RecordSet.RecordCount=14
  Form.RecordSet.EOF=False
  Form.RecordSet.BOF=False

另请注意,当表单被加载时,在加载事件中它仍然可以正常工作,并且我可以保存主键值,它是第一条记录中包含的主键。

在 Form_Load 和我单击该重新查询按钮之间的某个地方,表单的状态变得不同步。我最近刚刚从 Access 2003 切换到 2007,据我所知,这个错误以前没有发生过(尽管我可能只是在加载后没有点击这个按钮)。

现在我有一个解决方法,但我真的很想了解这是如何发生的。

4

3 回答 3

1

如果这是 ADO,请检查正在使用哪个 OLE DB 提供程序,例如(猜测)

Debug.Print Form.RecordSet.ActiveConnection.Provider

如果碰巧是 3.51 版本,请参阅:

信息:ADO 中 JET 数据库的 AbsolutePosition 属性

...如果您使用的是 ACE 提供程序,也许这是一个回归错误?!

于 2009-05-26T10:49:08.930 回答
0

您必须通过 MoveFirst 或其他方式将记录指针放在表单的 Recordset 中的特定记录上。并且返回值似乎是从零开始的,而不是从 1 开始的。

我无法重现您返回-1 的错误。您是否将表单的记录集设置为 ADO 记录集?如果是这样,那就可以解释了——DAO 记录集永远不会为这些值中的任何一个返回 -1,但我相信在 .MoveLast 之前 ADO RecordCount 返回 -1。也许 AbsolutePosition 在 ADO 中也是如此。

你想达到什么目的?我没有看到使用表单的 Recordset 对象的任何实用程序,因为它更容易分配记录源和导航 RecordsetClone(与表单的 Recordset 相比,它与表单的编辑/显示缓冲区绑定得更紧密,特别是当 Recordset 有被分配了一个 ADO 记录集)。

于 2009-05-22T23:46:33.503 回答
0

当我尝试转到“设计视图”时,我遇到了完全相同的问题。我不需要快速点击,我可以等一个小时然后这样做然后砰!有这个错误。

请注意,如果子表单仍然为空(即确实不包括任何记录,这是我第一次打开窗口时的情况),我只会收到错误消息。所以我一直认为这是正常的。

当光标当前未指向特定位置时,AbsolutePosition 设置为 -1。此外,这个值是从零开始的(正如其他人所提到的:第一行是 AbsolutePosition 0)。但是,即使您关注子表单中的特定行,该位置也可能为 -1。这意味着它是无用的。

如果您需要知道当前光标位置,您想要使用的是 CurrentRecord。这是一个从 1 开始的数字。我想如果列表为空,则 CurrentRecord 可能设置为 0 或 -1,表示没有行可用。

我在一个用于计算不同列的复杂总数的函数中使用了所有这些,这里是页面http://linux.m2osw.com/msaccess-sum-focus-recordset-problem

于 2011-06-19T04:03:07.167 回答