2017-08-14 16 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の考えは正しい - アップデートステートメントからプロシージャを実行することは可能です。例えば。次の文は、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

関連する問題