【问题标题】:How can I catch errors in TDataSet.UpdateRecord?如何在 TDataSet.UpdateRecord 中捕获错误?
【发布时间】:2011-08-10 10:47:55
【问题描述】:

我的应用程序使用 QuantumGrid (v6.56) 和 TSimpleDataSet 作为其数据源。

问题:如果用户在数字字段中输入非数字值,则会引发异常。代码未到达 OnBeforePost 处理程序。

如果在之前 OnBeforePost 抛出异常,应用程序如何捕获错误(并向用户显示消息)?


堆栈跟踪:

exception class   : EDatabaseError
exception message : '...' is not valid Integer value for Field <somefieldname> 

main thread ($504):
00526c7e +082 EditBooking.exe DB                               DatabaseError
00526d0f +04b EditBooking.exe DB                               DatabaseErrorFmt
0052c428 +07c EditBooking.exe DB                               TIntegerField.SetAsString
0052af30 +00c EditBooking.exe DB                               TField.SetText
0052abf9 +021 EditBooking.exe DB                               TField.SetEditText
007c3a3f +053 EditBooking.exe cxDBData                           
007e14a8 +018 EditBooking.exe cxGridDBDataDefinitions          TcxGridDBDataController.UpdateData
006f8159 +039 EditBooking.exe cxCustomData                     TcxCustomDataProvider.DoUpdateData
007c1c18 +008 EditBooking.exe cxDBData                         TcxDBDataLink.UpdateData
0053325d +021 EditBooking.exe DB                               TDataLink.UpdateRecord
005333f8 +0d8 EditBooking.exe DB                               TDataLink.DataEvent
007c1683 +00f EditBooking.exe cxDBData                         TcxDBDataLink.DataEvent
00533973 +03f EditBooking.exe DB                               TDataSource.NotifyLinkTypes
005339a2 +01e EditBooking.exe DB                               TDataSource.NotifyDataLinks
005339cf +023 EditBooking.exe DB                               TDataSource.DataEvent
005392ad +131 EditBooking.exe DB                               TDataSet.DataEvent
00553d7c +058 EditBooking.exe DBClient                         TCustomClientDataSet.DataEvent
00539396 +042 EditBooking.exe DB                               TDataSet.UpdateRecord
0053a356 +006 EditBooking.exe DB                               TDataSet.Post
0055677c +054 EditBooking.exe DBClient                         TCustomClientDataSet.Post

【问题讨论】:

  • OnUpdateData 数据源位于数据集和网格之间的事件?
  • -1 - 您的要求或试图实现的目标并不明显。如果这是关于向用户生成无效条目的消息,您可以评论显示如何执行此操作的答案,或者可以评论要求澄清目标的评论。如果您准备捕获异常,请将“post”调用包含在 try-except 中。否则,这个问题是关于什么的?
  • 在其OnSetText 事件中检查该字段的-to become- 值(如在我删除的答案中)与发布方法无关。即使网格偶尔决定自行发布,它也应该工作。无论如何,对于 TDBNavigator,您可以轻松地为 BeforeAction 事件放置一个处理程序并检查那里的值(如果 'Button' 是 'nbPost'),并在必要时中止..
  • @Sertac 编辑了问题以使其更清晰
  • 查看调用堆栈,我仍然认为删除答案中的方法应该有效..

标签: delphi validation exception dbexpress


【解决方案1】:

您需要在 cxGrid 中设置列​​的“Properties”属性,在那里您可以分配 CurrencyEdit,以便用户只能输入数字,同样在设置“Properties”后,您可以使用 OnValidate 事件来验证用户输入.

【讨论】:

  • 是的,我曾尝试使用 SpinEdit,但首先遇到了同样的问题 - 用户可以在网格中输入非数字值并单击导航器的 Post 按钮,这会导致错误。我重新安装了 6.56 版本,它的工作方式有所不同:如果用户输入非数字值,则可以单击 Post 按钮,但不会执行 dataset.post,因此不会发生错误。
【解决方案2】:

在您的示例中,确实没有达到 OnBeforePost 事件。

您提到了 cxGrid,但事实是,您的问题很容易重现。

获取一个链接在 TFloatField 上的简单 TDBEdit,并尝试输入值“7.7.7.7.7.7.7.7”。浮点字段接受小数分隔符,但不会验证仅存在 1。因此,输入它也会导致以类似方式引发错误,无论是在您退出该字段时,还是在发布时,如果您有一个允许您这样做的快捷方式。

如果您想在“途中”拦截它,那么 TField.OnSetText 可能是您最好的选择。

【讨论】:

    猜你喜欢
    • 2018-12-08
    • 2018-08-06
    • 1970-01-01
    • 2019-11-08
    • 2010-11-21
    • 2019-03-27
    • 2012-02-11
    • 2020-12-18
    • 2016-05-28
    相关资源
    最近更新 更多