ADODB+MSSQLでのDatetime型について
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;
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;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;ADONewConnection($DSN); $rs = $db->AutoExecute($tblname,$record,'UPDATE',id= $id);
で成功した。





Leave a Reply