Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 即使ApplyUpdates在内部,仍然会出现错误弹出窗口尝试…除了_Delphi_Odbc - Fatal编程技术网

Delphi 即使ApplyUpdates在内部,仍然会出现错误弹出窗口尝试…除了

Delphi 即使ApplyUpdates在内部,仍然会出现错误弹出窗口尝试…除了,delphi,odbc,Delphi,Odbc,找到解决方案,请参阅下面我的评论 D5,odbc到mysql数据库 此代码: with QryCmdPerf do begin Close; ParamByName('ACCTID').AsInteger:= AcctId; ParamByName('FROMDT').AsString:= MySQLDate(FromDt); ParamByName('TODT').AsString:= MySQLDate(ToDt); Open; first

找到解决方案,请参阅下面我的评论

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
(特别是“ApplyUpdate”)如果PnL字段已经具有值97979,则会导致弹出窗口显示文本“Update Failed”(更新失败),这显然是因为以下代码:

procedure TUpdateSQL.ExecSQL(UpdateKind: TUpdateKind);
begin
  with Query[UpdateKind] do
  begin
    Prepare;
    ExecSQL;
    if RowsAffected <> 1 then DatabaseError(SUpdateFailed);
  end;
end;
过程TUpdateSQL.ExecSQL(UpdateKind:TUpdateKind);
开始
使用Query[UpdateKind]do
开始
准备
ExecSQL;
如果RowsAffected 1,则数据库错误(SUpdateFailed);
结束;
结束;
在DBTables.pas中。无论如何,我希望能够发布ApplyUpdate,如果它不进行任何更新,就不必担心弹出窗口。但是如果“尝试……除了”不起作用,那会怎样呢


TIA

这里有两件事可能会出错

选择1 首先,一些“非常糟糕的代码”可能会对异常调用堆栈的展开造成短路。例如,
applyUpdate
或其子例程之一也可能有一个
try…除了直接调用
Application.HandleException的
块之外

为了测试这一点,如果您在
QryCmdPerf.Close
上设置断点,是否达到了该断点?
如果没有,则直接调用了
Application.HandleException
(或者更糟的
Application.ShowException

解决此问题需要一个连接到Application.OneException事件的自定义异常处理程序。您可能必须设置临时状态才能知道何时可以忽略此特定异常。
是的,它很混乱,这就是为什么直接调用
Application.HandleException
是“非常糟糕的代码”

选择2 如果您确实到达了断点,但是再次引发了异常,那么解决该异常应该简单得多


Close
方法可能试图保存任何挂起的更改,因此可以有效地再次应用更新。调用
CancelChanges
或等效程序,而不是简单地关闭数据集。

您将调试器显示的对话框与程序显示的对话框混淆。请看我几年前写的这篇文章:

它描述了几种避免调试器干扰的方法:

  • 使用“高级断点”临时禁用引发异常的代码周围的调试器
  • 将调试器配置为忽略某些异常类型。(请更仔细地阅读调试器的消息,以查看您正在处理的异常类。)
  • 将调试器配置为在出现任何异常时不中断
  • 完全关闭集成调试器

简单的回答是,您必须为onUpdate错误设置一个eventhandler,否则任何数量的“try…except”块都不会阻止弹出窗口。长话短说,这似乎是odbc的一个缺陷。复制品就在这里:为任何想看一看的人准备的。您可以跳过MySQL,任何odbc数据库都可以。

TQuery中发现的“OnUpdate错误”处理程序,如果设置为某个值,则不会出现“更新失败”弹出窗口。我想这是强迫人们使用onUpdate错误处理程序的一种方法…Dave,如果这回答了你的问题,那么请将其添加到回答部分。当其他人带着和你一样的问题来到这里时,他们会看这个。堆栈溢出不允许我回答我自己的问题,它告诉我新用户(我显然是)不能回答他们自己的问题。啊,你说得对。对于信誉点数低于100的用户,有8小时的等待时间。真的是8点。请添加您的解决方案。这是正确的答案。我确实到达了“关闭”,但它是在弹出窗口之后,也就是说,如果我在ApplyUpdate上放置了一个断点,然后在步骤(f8)中,我得到弹出窗口,单击其“确定”按钮,然后调试器转到下一行,即“除外”中的“关闭”“第条。无论如何,正如我在原始帖子的评论中所说,如果使用“OnUpdateError”处理程序,即使只使用伪代码,也可以消除弹出窗口。谢谢你的努力,tho。我很好奇为什么你在对
应用程序.HandleException
短路后仍然点击
QryCmdPerf.Close
断点<代码>TBDEDataSet.CachedUpdateCallBack
由一个BDE DLL调用。如果引发了
EDatabaseError
(您可以在
OnUpdateRecord
事件处理程序中轻松强制执行),则调用
应用程序.HandleException
,并将
DBIERR\u UPDATEABORT
返回到DLL。这反过来又将其传递回
TBDEDataSet.ApplyUpdate
,并最终引发一个EAPort(静默)异常。另请参见+1哦,是的!有时你对一个概念如此熟悉,以至于忘记了它的存在这对于初学者来说是一个非常常见的误解。事实上,我已经在Delphi上工作了10多年了,我确实知道在IDE中运行exe和在IDE之外运行exe的区别。我尝试在没有odbc和mysql的情况下使错误发生,但我做不到,因此我猜odbc和/或mysql有一个特殊之处,即当您尝试用字段已有的值更新字段时,就会出现我上面描述的问题。这是复制品:。记住,你必须用数字字段已有的值更新它,否则它只会更新。@Craig:我不是初学者,请先设置我提供的复制程序,然后再假设你已经看到Delphi提供的每一个bug。@Craigyong和@RobKennedy,如果你想用skype进入我的机器查看,那很好,我们可以通过stackoverflow聊天设置一些东西,我猜+1小更正,这不是ODBC问题。这是
TBDEDataSet
的问题。对于BDE原生悖论,您应该也会遇到同样的问题
TBDEDataSet.CachedUpdateCallBack
在某些情况下会短路异常堆栈以调用
Application.HandleException
。这是一种处理异常的狡猾方法,异常应该是allo