2017-08-14 39 views
-2

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

+5

避免BDE,期间。你正在浪费你的时间而不是从它升级。 – MartynA

+0

它不是我的决定。 – TomR

+1

在TUpdateSQL中?不,TUpdateSQL需要一个'UPDATE'语句(这就是为什么叫做“TUpdateSQL” - 这个名字的** UpdateSQL **部分应该清楚)。 'TStoredProcedure'用于执行存储过程。 –

回答

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 

德尔福单位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 procedure,update陈述或其他陈述的影响。但DBTables计数(我的猜测)只有update语句更新的目标表中的行。 Delphi代码的更多调查可以揭示更准确的解释。

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

+0

我不知道Firebird如何计算受影响的行(请参阅我的配置文件的脚注,原因是),但似乎没有'SET NOCOUNT OFF'就像存储过程的选项一样。因此,Delphi中所有数据库组件都可能缺少受影响的行数。只要他们不克服这一点。 – Victoria

相关问题