SQL を記述する場合、多くのサンプルでは、
var strSQL: string; begin strSQL := 'Select * From TBL_EMPLOYEE WHERE ID=10'; Query1.SQL.Text := strSQL; ...
end;
このような記述になっていると思います。SQL が簡単なものならこれでもいいのですが、複雑な SQL だと困ったことになります。
var strSQL: string; begin strSQL := 'Select * From TBL_EMPLOYEE ' + 'Where ' + '(ID = 10) and ' + '(NAME like "%A%")'; Query1.SQL.Text := strSQL; ...
end;
DB によっては SQL のエラーを行番号 (と文字位置) で返してくれるのですが、このようなコードだと 1 行なので、どこにエラーがあるのか判りにくくなります。それに、行末の半角 SP を忘れがちです。では、行末に改行コードを入れてみましょう。
var strSQL: string; begin strSQL := 'Select * From TBL_EMPLOYEE'#$0D#$0A+ 'Where'#$0D#$0A + '(ID = 10) and'#$0D#$0A + '(NAME like "%A%")'; Query1.SQL.Text := strSQL; ...
end;
SQL のエラーは見つかりやすくなったかもしれませんが、ゴチャゴチャして読みにくいですね。多くの DB コンポーネントの SQL プロパティが何故 TStrings で定義されているのかを考えてみましょう。
begin with Query1.SQL do begin Clear; Add('Select * From TBL_EMPLOYEE'); Add('Where '); Add(' (ID = 10) and '); Add(' (NAME like "%A%") '); end; ...
end;
視認性もよく、エラー行も判り易くなりました。SQL を DB クライアントツールに投げてみたい場合でも、矩形コピー (Alt + Shift + カーソル) で簡単にコピーできますし、Query1.SQL.SaveToFile() でSQL を外部ファイルとして吐いて確認する事も可能です。
…しかしながら、この方法にはちょっと問題があるのです。それに関しては別トピックで。
See Also:
[SQL インジェクション]
http://ht-deko.minim.ne.jp/delphiforum/?vasthtmlaction=viewtopic&t=1162
[SQL のパフォーマンスを低下させないためには?]
http://ht-deko.minim.ne.jp/delphiforum/?vasthtmlaction=viewtopic&t=1164
|