如何在TDataSet.UpdateRecord中捕获错误?

时间:2011-08-10 10:47:56

标签: delphi validation exception dbexpress

我的应用程序使用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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

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

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