【问题标题】:How to choose Delphi ADO Cursor location and Cursor Type如何选择 Delphi ADO 光标位置和光标类型
【发布时间】:2017-04-19 13:53:30
【问题描述】:

我们已将 Delphi 项目(银行应用程序)从 BDE 迁移到 ADO,并且我们保留了所有默认属性,并且在单元测试时存在问题。

一个问题是“无法找到要更新的行。自上次读取后,某些值可能已更改”

更新表格时出现问题。表员工有更新触发器,它正在根据一些检查更新同一个表(员工)。触发器是否更新表系统抛出上述错误。

最推荐的解决方案: ADODataSet1.Properties['Update Criteria'].value :=adCriteriaKey; 没用。

谷歌搜索后,我们了解到有一些属性,如光标位置和光标类型,在使用 ADO 时很重要。

我们刚刚将光标位置从 clUseClient 更改为 clUseServer,它开始工作(魔术),我们不知道它为什么工作。

现在我们非常困惑要使用什么光标位置或光标类型。

关于我的申请:

1) 列表视图或 DBGrid 向用户显示记录。

2) 我们正在使用数据感知控件(更多控件)。

3) 有很多插入、更新和删除

3) 大约有 1000 名用户在使用此应用程序。

4) 同一用户可以在同一屏幕/记录上工作。

在通过Client-Side Cursors Versus Server-Side Cursors 之后,我们计划使用服务器端游标。

【问题讨论】:

  • 您应该重新考虑使用服务器端游标。它们会消耗服务器上的大量资源,尤其是在有 1000 多个并发用户的情况下。总是从客户端游标开始更有意义,只有在别无选择时才使用服务器端游标。避免遇到您所询问的问题并不是使用问题的好理由。
  • @MartynA:谢谢你的建议。 :)
  • @KenWhite:我会检查的。
  • 一个 MCVE(包括数据结构和触发代码)在这里会有所帮助。如果您有表的 PK,Update Criteria=adCriteriaKey 应该适用于并发更新。您需要在数据集Open 之后(在数据集Edit 之前)设置它。您也可以在发布数据集之前尝试ADODataSet1.Recordset.Resync(adAffectCurrent, adResyncAllValues),但我更喜欢adCriteriaKey 解决方案(否则使用adCriteriaUpdCols)。

标签: sql-server delphi delphi-7 ado


【解决方案1】:

首先我建议你忘记 ADO 并使用 FireDAC(或 UniDAC)

当您使用触发器或有时您为字段设置默认值时会出现此问题,因为 ADO 在客户端找不到要更新的记录

如果您将光标位置设置为服务器端,您将失去一些好的功能,例如本地排序、本地过滤和本地索引,您的记录将不会保留在内存中,并且数据集的速度将会降低,服务器端位置也可能对服务器的资源产生不良影响

您使用的是什么关系型数据库?

您可以创建一个存储过程并调用它进行更新并继续使用客户端光标位置

Cursor-Location 必须与适当的 Cursor-Type 结合才能获得良好的结果,本文将帮助您:

http://etutorials.org/Programming/mastering+delphi+7/Part+III+Delphi+Database-Oriented+Architectures/Chapter+15+Working+with+ADO/Working+with+Cursors/

【讨论】:

  • 我们正在使用 MSSQL 服务器。所以你说游标应该解决“无法定位行进行更新。自上次读取以来,某些值可能已更改”。我会立即尝试并通知您。
  • 使用存储过程它正在工作:),但我们正在使用数千个查询:(。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-07
  • 1970-01-01
相关资源
最近更新 更多