【问题标题】:Ms Access, ADODB, Recordset, Set PrimarykeyMs Access、ADODB、记录集、设置主键
【发布时间】:2018-09-28 09:23:49
【问题描述】:

我将 ADODB.Recordset 与 PostgreSQL 表连接起来:

Set rs.ActiveConnection = con
rs.Source = psql
rs.LockType = adLockPessimistic
rs.CursorType = adOpenKeyset
rs.index = "id"
rs.Open

我可以更新数据:

rs!somefield = "somevalue"
rs.update

我可以添加数据:

rs.AddNew
rs!someRequiredFiled = "somevalue"
rs.update

但更新数据不起作用,如果在后台更改数据:

rs!somefield = "somevalue"
// .... the same field was changed for an other user
rs.update
// -> Error, cause the field to be changed is not found anymore

我认为问题在于,Recordset 没有被告知主键。对?以及如何设置主键?

【问题讨论】:

  • 您需要提供更多细节。您使用的是服务器端游标还是客户端游标? (Debug.Print con.CursorLocation)。记录的主键是否被更改? (这是一个严重的坏习惯,主键不应该改变)
  • Connection 和 Recordsetl 的 CursorLocation 为 2。如果没有手动设置到pk,则索引为空。
  • 我添加了一行代码将 Recordset 的 cursorLocation 设置为 Client 并且更新效果很好。还解决了第二个问题:在连接的表单中更新无效 - 包括关于冲突的弹出对话框。但我认为我出售 rs.index 属性或让它为空都没关系。

标签: postgresql ms-access adodb


【解决方案1】:

使用客户端游标时,记录通常由其主键标识,或者,如果主键不存在,则记录不可更新。

使用服务器端游标时,服务器会跟踪您正在处理的记录,并且可以通过诸如主键或行版本指示器之类的东西来识别它。如果服务器正在跟踪特定的行版本,并且该行发生了更改,那么如果没有收到通知,它将失去对它的跟踪。

使用Connection.CursorLocation = adUseClient 来使用客户端光标。

Recordset.Index 属性完全用于其他用途。它用于为使用CommandType = adCmdTableDirect 打开的记录集执行Recordset.Seek 命令并使用服务器端游标。如果您打印Recordset.Supports(adIndex),您会注意到您的记录集在打开后不支持它。设置不受支持的属性可能会引发错误,或者在 ADO 中什么也不做。

【讨论】:

  • 非常感谢您的解释并为我指明了正确的方向。由我决定,深入研究数据库游标的概念。
猜你喜欢
  • 2021-11-25
  • 1970-01-01
  • 2012-10-02
  • 1970-01-01
  • 2011-01-06
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
  • 2017-09-21
相关资源
最近更新 更多