找到解决方案,请参阅下面的评论
D5,odbc到mysql数据库
此代码:
with QryCmdPerf do begin
Close;
ParamByName('ACCTID').AsInteger:= AcctId;
ParamByName('FROMDT').AsString:= MySQLDate(FromDt);
ParamByName('TODT').AsString:= MySQLDate(ToDt);
Open;
first;
try
edit;
FieldByName('PnL').AsFloat:= 97979;
ApplyUpdates;
except
close;
end;
end; // with
如果PnL字段已经具有值97979,则(特别是“ApplyUpdates”)会导致弹出窗口显示“Update Failed”文本,显然是因为此代码:
procedure TUpdateSQL.ExecSQL(UpdateKind: TUpdateKind);
begin
with Query[UpdateKind] do
begin
Prepare;
ExecSQL;
if RowsAffected <> 1 then DatabaseError(SUpdateFailed);
end;
end;
在DBTables.pas中。无论如何,我希望能够发布ApplyUpdates,如果它没有进行任何更新,就不必担心弹出窗口。但如果“尝试......除外”不起作用,那会是什么?
TIA
答案 0 :(得分:4)
您将调试器显示的对话框与您的程序显示的对话框混淆。请看几年前我写的这篇文章:
它介绍了几种避免调试器干扰的方法:
答案 1 :(得分:2)
简短的回答是,你必须为OnUpdateError设置一个事件处理程序,否则任何数量的“try ... except”块都会阻止弹出窗口。答案很长,它似乎是odbc的一个错误。 repro在这里:http://www.codeupload.com/3919对于想要看一眼的人来说。你可以跳过MySQL的东西,任何odbc数据库都可以。
答案 2 :(得分:0)
这里有两件事可能出错。
首先,一些“非常糟糕的代码”可能会在异常时缩短调用堆栈的展开。例如。 ApplyUpdates
或其中一个子例程也可能有try...except
块直接调用Application.HandleException
。
要对此进行测试,如果您在QryCmdPerf.Close
上放置断点,是否可以到达它?
如果没有,则直接调用Application.HandleException
(或更差Application.ShowException
)。
解决此问题需要一个挂钩到Application.OnException事件的自定义异常处理程序。您可能必须设置临时状态以了解何时可以忽略此特定异常
是的,这很麻烦,为什么直接调用Application.HandleException
,是“非常糟糕的代码”。
如果你确实到达了断点,但是再次引发了异常,那么解决起来要简单得多。
Close
方法可能正在尝试保存任何挂起的更改,因此有效地再次应用更新。不要简单地关闭数据集,而是调用CancelChanges
或同等数据。