1

utf8 でエンコードされた xml ファイルのコンテンツを文字列パラメーターとして受け取る mydac ストアド プロシージャ コンポーネントを使用した Delphi アプリケーションがあります。このxmlコンテンツをコピーしてファイルからプロシージャに貼り付けると、navicatやその他のdb管理プログラムで動作します

CALL sp_saveit('<xml>garry&#39;s<otherdata> data data....</xml>);

しかし、デルファイから呼び出そうとすると、エラーがスローされます

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CALL sp_saveit('<?xml version=\"1.0\" encoding="UTF-8"?><Main><Detail z') at line 1

これらの手順に従っています:

  1. Delphi は LoadfromFile を使用してファイルの内容を検索し、TStringStream に読み込みますMyStream.LoadFromFile(Sp_xmlfile);
  2. 次に、コンテンツをストアドプロシージャに渡していますT_ContentsSP.ParamByName('XmlFile').AsWideString := MyStream.DataString;

また、このデータを Delphi の zlib で圧縮して blob として送信しようとしましたが&#39;、' で変更しようとしましたが、結果は同じでした。

Delphiでspのパラメータとして単一引用符と二重引用符を含む長い文字列を送信するにはどうすればよいですか?

ps : 私の英語でごめんなさい。

4

1 に答える 1

1

あなたの投稿から、定数値 ( I put this xml content copy-paste) とパラメーター ( T_ContentsSP.ParamByName('XmlFile')) を使用しようとしたことがわかります。また、別のコマンドではなく、使用しているコマンドのエラー テキストを表示するようにしてください。

パラメータを使用する場合、特別な準備は必要ありません。データ アクセス コンポーネントは、透過的にパラメータ値を DBMS に送信します。トレース出力がある場合は、どのライブラリが DBMS に送信しているか、トレースを確認してください。パラメータの使用は、リテラルの使用よりも常に優先されます。

定数を使用している場合は、( more ):

  • 定数内の各一重引用符を二重にし、先頭に「\」を追加します。したがって、 a'は になり\''ます。
  • 二重引用符は、特別な処理を必要としません。
  • '&' はデータ アクセス ライブラリのマクロ指定子である可能性があるため、おそらくマクロ処理を無効にします。
于 2012-08-19T06:56:06.613 に答える