【问题标题】:Is it possible to execute SQL procedure in Delphi 6 BDE TUpdateSQL?是否可以在 Delphi 6 BDE TUpdateSQL 中执行 SQL 过程?
【发布时间】:2017-08-14 20:09:41
【问题描述】:

是否可以在 Delphi 6 BDE TUpdateSQL.ModifySQL 中编写 execute procedure (...with arguments...)(用于 Firebird 2.1 数据库)?我已经尝试过,但即使对于最简单的 SQL 过程,我也会收到错误消息 Update failed。那么——ModifySQL 中可以执行的语句是否有一些限制?我知道(并且我正在广泛使用),可以在 Delphi IBX TIBDataSet.ModifySQL(或 IBX 组件的其他类似属性)中编写 execute procedure(和更复杂的语句)。我应该避免在 TUpdateSQL 中执行过程还是应该考虑一些技巧?

【问题讨论】:

  • 避免 BDE,句号。你是在浪费你的时间而不是升级。
  • 在 TUpdateSQL 中?不,TUpdateSQL 需要一个 UPDATE 语句(这就是为什么它被称为 TUpdateSQL - 名称的 UpdateSQL 部分应该清楚)。 TStoredProcedure 用于执行存储过程。
  • @Ken - 下马。 TUpdateSQL 要求每个 InsertSQL/ModifySQL/DeleteSQL 都有一条 SQL 语句。请注意,TUpdateSQL 需要 UPDATE 语句,并且考虑到 ModifySQL 属性中实际需要 UPDATE 语句时,从名称上可以明显看出这一点。因此,例如,不是MODIFY 声明!现在,TStoredProc 为执行存储过程的 SQL 语句提供了一个方便的包装器,但是应该可以使用 SQL 语句(例如EXEC PROCNAME())来执行存储过程。
  • 你并不想屈尊俯就。我无意冒犯。 :shrug: 我只是指出 UPDATE 语句的使用与组件类型名称没有直接关系(它也具有 INSERT 和 DELETE 语句的属性)。也许您的 IIRC 是错误的,毕竟,“ModifySQL”不可能避免“需要 [for] 一个单独的 TUpdateSQL”。 ModifySQL 是 TUpdateSQL 的一个属性。但是,它可能会避免需要单独的 TQuery,否则您可能会使用它来执行 UPDATE(即使 UPDATE 语句不是查询。看图)
  • 您是否尝试在 UPDATE 语句中包含存储过程调用,该语句本身不会更新任何内容?

标签: sql delphi firebird bde


【解决方案1】:

René Hoffmann 的想法是对的——可以从 update 语句中执行过程。例如。 ModifySQL 接受以下语句:

update target_table set
  id = :id,
  field1 = :field1,
  field2 = (select proc.field2 from additional_actions_procedure(:field2, :param1, :param2) proc) 
where 
  id = :old_id  

Delphi Unit DBTables 包含解释为什么引发异常的代码:

procedure TUpdateSQL.ExecSQL(UpdateKind: TUpdateKind);
begin
  with Query[UpdateKind] do
  begin
    Prepare;
    ExecSQL;
    if RowsAffected <> 1 then DatabaseError(SUpdateFailed);
  end;
end;

因此会发生受影响的行计数。但显然DBTables 受影响的行数与 IBExpert 中受影响的行数不同。 IBExpert 计算受execute procedureupdate 语句或其他语句影响的真正受影响的行。但是DBTables 只计算(我的猜测)目标表中由update 语句更新的行。对 Delphi 代码的更多研究可以揭示更准确的解释。

这条评论http://www.delphisources.ru/pages/faq/base/tupdatesql_many_queries.html建议编辑DBTables文件。

【讨论】:

  • 我不知道 Firebird 如何计算受影响的行数(原因请参见我个人资料的脚注),但似乎没有 SET NOCOUNT OFF 类似的存储过程选项。因此,Delphi 中的所有数据库组件都可能缺少受影响的行数。只要他们没有克服这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-22
  • 1970-01-01
相关资源
最近更新 更多