PropertyEditor
今日、vcl for PHPを確認してみたら、vcl_for_php_07_06_10.tar.gzがupされてたので、さっそく中身を見てみた。
例のbuildqueryの中で、特定のDBの場合に対するコードが追加されていた。
今のところoci8だけのようなので、これは前にforumで文句言ったからさっそく反映してくれたのか!と思ったら、
またエラーが出てますよ。
テストした? ('A`)
回避方法は、LimitCountとLimitStartをいずれも-1に。
でもこのプロパティ、使う意味あるのかなStoredProcで・・・。強制的にoci8用コードの中で-1にすればいいのに。
さて、前回触れたQueryですが、Oracleのバインド変数を使う場合、ADODBのSelectLimitの第四引数で指定してあげるといいらしい。
でもdbtables.inc.phpのexecutelimitファンクション(databaseクラス)の中のSelectLimitではそれを指定していません。
そこで、考えたのは新しいプロパティを作り、そこでバインド変数へ渡す値を書けばいいかなと。
Paramsと同じような感じのにしたいので、いわゆるDelphi for win32で言うところのTStrings的なヤツですね。
新しいプロパティを作るには、packageファイルにregisterPropertyEditorを追加します。
TStrings的なヤツの場合はTStringListPropertyEditorなので、以下の通り。
registerPropertyEditor("OraQuery","ParamByNames","TStringListPropertyEditor","native");
※OraQueryはQueryを継承してアテクシが作ったクラス。
次にincファイルの、「class OraQuery extends Query」の中に、以下のコードを書きます。
※この場合、OraQuery.inc.php
protected $_parambynames=array();
function getParamByNames() { return $this->readParamByNames(); }
function setParamByNames($value) { $this->writeParamByNames($value); }
function readParamByNames(){return $this->_parambynames;}
function writeParamByNames($value) {$this->_parambynames=$value;}
function defaultParamByNames() { return array();}
赤字のgetとsetのところが、publishedなプロパティin IDEらしい。
これが無いとObjectInspectorに出ないお。
※最初書いた時これに気が付かず、半日悩んだあげくnews groupで質問したアテクシ。
つまりObjectInspectorに出したくないプロパティの場合、これを書かなければいいかもしれない。
というような手順で追加したParamByNamesプロパティですが、どういう風に使うかと言うと、例えば以下のようなSQLの場合、
SELECT IDX, HOGE FROM T_TEST WHERE INX = :IDX AND HOGE = :HOGE
ObjectInspectorに書く場合、
------------------
IDX,111
HOGE, hoge123
------------------
のように、最初に変数名を書いて、その後に値。
直接コードで書く場合、
------------------
$param= array();
$param["IDX"] = 111;
$param["HOGE"] = "hoge123";
$this->OraQuery1->ParamByNames = $param;
------------------
てな感じになります。
注意するのはParamsも同じですが、必ず変数に先に入れないと駄目ぽ。
ちなみにプロパティエディタは、Delphiを持ってれば自分で自作も可能らしい。
PHPでも書くことが出来るようです。
以上のコンポーネントはコンポーネント置き場に入ってます。
| 固定リンク

コメント