ADODBのなかにGetInsertSQL()GetUpdateSQL()という関数があるがそれを使おうとしたときのメモ

MSSQLをADODBを使ってUpdateやInsertSQL文を生成してくれるという関数なのだが、

$record = array (
 id => 1,
 name => 'りんご',
 dt => '2008/5/10'
);
$DSN = DRIVER . '://' . USER . ':'
  . PW . <a href="mailto:'@'">'@'</a> . HOST . '/' . DB;
$db = &amp; amp;
amp;
ADONewConnection($DSN);
$rs=$db->Execute("Select * from Fruits where id = -1");
$InsertSql = $db->GetInsertSQL($rs, $record);
$rs = $db->Execute($InsertSql);

とするとインサートされるはずなのだが、どうもうまくいかないのでデバッグ=1にしてどんなSql文が生成されているのか見てみたら・・・
Insert into Fruits (id,name,dt) values (‘1′,’りんご’,'2008-05-10,00:00:00 AM’);

などとなっている。そのSql文をそのままSQLクエリアナライザに投げたら
CHAR データ型から DATETIME データ型への変換の結果が日付/時刻の値の範囲外です。
ステートメントは終了されました。

と帰ってきた。

Insert into Fruits (id,name,dt) values (‘1′,’りんご’,'2008-05-10,00:00:00 AM’);
日付と時間の間にある ,が原因でインサート出来ない。アップデート文も同じ現象だった。

そこでGetInsertSQL()GetUpdateSQL()のラッパークラスであるAutoExecute() というクラスに手をだしてみた。
すると、きれいに変換され生成されたSqlは

Insert into Fruits (id,name,dt) values (‘1′,’りんご’,'2008-05-10 00:00:00′);
となりInsertが成功していた。しかもその名のとおりAutoなExecuteなので自動生成されたSql文をExecuteする必要がない。

$record = array(id=>1,name=>'りんご',dt=>'2008/5/10');
$DSN = DRIVER . '://' . USER . ':' . PW . '@' . HOST . '/' . DB;
$db = &amp;amp;amp;ADONewConnection($DSN);
$rs = $db->AutoExecute($tblname,$record,'INSERT');

ADODB内を詳しく調べてみたがAutoExecute内でGetInsertSQLとGetUpdateSQLが呼ばれていることはわかったが、どこで日付の変換がされているかはわからなかった。

GetUpdateSQLも同じように

$record = array(name=>'りんご',dt=>'2008/5/10');
$DSN = DRIVER . '://' . USER . ':' . PW . '@' . HOST . '/' . DB;
$db = &amp;amp;amp;ADONewConnection($DSN);
$rs = $db->AutoExecute($tblname,$record,'UPDATE',id= $id);

で成功した。