フォーラム


ゲスト  

ようこそ ゲスト さん。このフォーラムに投稿するには 登録が必要です。

ページ: [1]
トピック: デバッグしやすい SQL の書き方
DEKO
管理者
投稿数: 2691
デバッグしやすい SQL の書き方
on: 2013/05/19 14:36 Sun

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

ページ: [1]
WP Forum Server by ForumPress | LucidCrew
バージョン: 1.7.5 ; ページロード: 0.023 sec.