5

次のような複数ステートメントのクエリを作成しようとしています:

// without the second insert the query works fine.
// i need 2 querys to work because later, i'll do inserts on different kind of tables.
// that's why i need 2 querys, not a single query which insert 2 records.   

with ZQuery1 do
    begin
        SQL.Clear;
        SQL.Add('insert into client (name,age) values ('+QuotedStr('john')+','+QuotedStr('20')+');');
        SQL.Add('insert into client (name,age) values ('+QuotedStr('doe')+','+QuotedStr('21')+');');
        ExecSQL;
    end;

次のエラー メッセージが表示されました: SQL エラー: SQL 構文にエラーがあります。MySQL サーバーのバージョンに対応するマニュアルを参照して、2 行目の「クライアント (名前、年齢) 値 ('doe','21') に挿入」付近で使用する正しい構文を確認してください。

私はすでにマニュアルをチェックしています。コンポーネント TZQuery および TZUpdateSql (zeos lib から) は、複数のステートメントを内部的に実行する可能性を提供します。

編集 [解決済み]

GregD に感謝します。いくつかのテストを実行した後、トランザクションは正常に機能します。それが私が将来他の人を助けるために使用する方法です。

try
    ZConnection.AutoCommit := True;
    ZConnection.StartTransaction;
    
    With ZQuery Do
    begin
        SQL.Clear;
        SQL.Add('insert into clients (name,age) values ('+QuotedStr('john')+','+QuotedStr('20')+')');
        ExecSQL;
        SQL.Clear;
        SQL.Add('insert into clients (name,age) values ('+QuotedStr('doe')+','+QuotedStr('21')+')');
        ExecSQL;
    end;
    
    ZConnection.Commit; 
except
    ZConnection.Rollback
end;

これは、AutoCommit プロパティが Zeos で実際にどのように機能するかです。

AutoCommitが True の場合、SQL ステートメントが実行されるたびにトランザクションが自動的にコミットされますが、Commit を明示的に呼び出すまでは、StartTransaction コマンドを明示的に使用して、この自動コミットを防ぐことができます。

AutoCommitが False の場合、StartTransaction を呼び出すべきではありません。その後、トランザクションは自動的に開始されますが、ステートメントが実行されるたびに自動的にコミットされるわけではありません。

procedure StartTransaction StartTransaction プロシージャは、接続されたデータベース内で新しいトランザクションを開始します。AutoCommit プロパティが TRUE の場合にのみ使用してください。AutoCommit を false に設定して呼び出そうとすると、常に SInvalidOpInNonAutoCommit が発生します。AutoCommit モードへのエスケープとして StartTransaction を使用する必要があるため、この動作は予期されたものです。StartTransaction を呼び出すと、AutoCommit は「オフ」になり、Commit または Rollback を呼び出すと、AutoCommit は再び「オン」になります。AutoCommit を false に設定して作業している場合、新しいトランザクションが自動的に作成され、それらを閉じる方法 (コミットまたはロールバック) を選択します。

procedure Commit現在のステートメントをデータベースにコミットします。非 AutoCommit モード (すべてのステートメントが自動コミットされるため、このプロシージャは役に立たない) でのみ使用するか、AutoCommit モードで StartTransaction プロシージャによって開かれたトランザクションを終了したい場合にのみ使用する必要があります。コミットすると、現在のトランザクションがあれば終了します。ステートメントをデータベースに保存したくない場合は、ロールバック手順を使用する必要があります。

procedure Rollback現在のトランザクションの以前のステートメントをすべてロールバックします。非 AutoCommit モード (すべてのステートメントが自動コミットされるため、このプロシージャは役に立たない) でのみ使用するか、AutoCommit モードで StartTransaction プロシージャによって開かれたトランザクションを終了したい場合にのみ使用する必要があります。Rollback は、現在のトランザクションがあればそれを終了します。satements を失いたくない場合は、Commit 手順を使用する必要があります。

4

4 に答える 4

1

私も ZEOS の専門家ではありませんが、ソースMultiStatementsを見て、 のプロパティTZUpdateSQLを trueに設定していますか?

于 2013-05-26T13:43:57.133 に答える