更新可能な問い合わせかどうかチェックするには?

解決


こいち  2011-12-01 08:24:50  No: 41290

お世話になります
Delphi2007、FireBied1.5を使用しています。

TIBDatabase
TIBQuery
TDataSetProvider
TClientDataSet
を使用して、画面で入力したSQLでSELECTしたデータをDBGridに
表示するような汎用的なプログラムを作ろうとしています。

DBGridで編集した内容を更新させたいために、TClientDataSetの
ApplyUpdateを使用したいと思っています。

ボタンを押したらApplyUpdateを実行したいと思っているのですが
問い合わせのSQLが更新不可(複数のテーブルの連結など)であった場合は
更新処理を出来ない(ボタンを使用不可)ようにしたいと思っています。

SQLを発行時に、更新不可能な問い合わせかどうか確認する方法はあるのでしょうか?

宜しくお願いいたします。


DEKO  2011-12-01 14:49:27  No: 41291

こんにちは。

単純にやるのなら、
・SQL 文の先頭が "SELECT" で始まる (空白行/コメントを除いて)。
・"JOIN" や "GROUP BY" が含まれない。
を判定して、True なら更新可能な SQL という事になると思います。

# 構文チェックには IBScript 内のクラスが使えると思います。


こいち  2011-12-02 16:32:05  No: 41292

DEKO様

ありがとうございます。

if (Pos(' GROUP ',UpperCase(sSql)) <> 0 ) or
   (Pos(' JOIN ', UpperCase(sSql)) <> 0) then
begin
 btnUpdate.enabele := False;
end;

といったやり方で、GROUP化と結合された問い合わせは回避出来るようになりました。
プロシージャを使った問い合わせとかまだ問題はありますが、解決とさせて頂きます。

もし、よろしければIBScriptのクラスを使った例等をご教授頂けないでしょうか?


DEKO  2011-12-03 06:21:29  No: 41293

> もし、よろしければIBScriptのクラスを使った例等をご教授頂けないでしょうか?

自分で使う分には構文チェックを行う事もない (エラーの出ない SQL しか用意しない) ため、
正直マトモに使ったことはないのですが、
IBConsole のソース内部で IBExtract 等が使われていますので、
そちらを参照してみてはいかがでしょうか?

[IBConsole ソースコード]
http://ibconsole.cvs.sourceforge.net/ibconsole/ibconsole/#dirlist

[IBScript examples (D5, D6, BCB5)]
http://cc.embarcadero.com/Item/17110


こいち  2011-12-05 15:59:14  No: 41294

DEKO様

ありがとうございます。

お返事が遅くなってすいません。
参考にさせて頂きます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加