[Memo]PHPからMT経由でMicrosoft SQL ServerにオブジェクトをINSERTする

| コメント(0) | トラックバック(0)

メモっとかないとな。普通にやると、

Error Code: 544 Message: [Microsoft][SQL Server Native Client 11.0][SQL Server]Cannot insert explicit value for identity column in table 'mt_entry' when IDENTITY_INSERT is set to OFF. ]

INSERT文に entry_id があると、どうもこいつが出るようで

INSERT INTO mt_entry(entry_id,entry_author_id,...
SET IDENTITY_INSERT mt_entry ON

とすると、今度は

Error Code: 515 Message: [Microsoft][SQL Server Native Client 11.0][SQL Server]Cannot insert the value NULL into column 'entry_id', table...

NULLなので、あかん、と出る(そりゃそうだ)。SQL文は mt/php/extlib/adodb/adodb-active-record.inc.php (function Insert())が生成しているので、INSERT文にentry_idが入るのは避けられない。SET IDENTITY_INSERT テーブル名 ON して、任意の値を入れられるようにして最大値に ++ したものを突っ込むように。IDの重複があればエラーになるので、上書きとかにはならんのですが、エラーの際には大きめの値をセットし直して突っ込むように(綺麗じゃないけど。保険)。

Enterprise.pack/php/mtdb.mssqlserver.php で function Insert を定義しなおすのが根本解決なんだろうけどな(メモっとかないとまたハマるからさっ)。

<?php
define( "MT_DIR", 'C:\mt\\' );
define( "TIME_OFFSET", 9 );

// create_entry( 1, 'title', 'text' );

function create_entry( $blog_id, $title, $text ) {
    $offset = TIME_OFFSET;
    $offset = $offset * 60 * 60;
    require_once( MT_DIR . 'php\mt.php' );
    try {
        $mt = MT::get_instance( $blog_id, MT_DIR . 'mt-config.cgi' );
    } catch ( Exception $e ) {
        sleep( 1 ); // Retry
        $mt = MT::get_instance( $blog_id, MT_DIR . 'mt-config.cgi' );
    }
    $title = $mt->db()->escape( $title );
    $text = $mt->db()->escape( $text );
    require_once( MT_DIR . 'php\lib\class.mt_entry.php' );
    $sql = 'SET IDENTITY_INSERT mt_entry ON';
    $mt->db()->Execute( $sql );
    $e = new Entry();
    $e->class = 'entry';
    $e->blog_id = $blog_id;
    $e->author_id = 1;
    $e->status = 1;
    $e->current_revision = 0;
    $e->title = $title;
    $e->text = $text;
    $ts = gmdate( "Y/m/d H:i:s", time() + $offset );
    $e->authored_on  = $ts;
    $e->modified_on = $ts;
    $e->created_on = $ts;
    $sql = 'select max(entry_id) from mt_entry';
    $res = $mt->db()->Execute( $sql );
    $max = $res->_array[0][''];
    $max++;
    $e->id = $max;
    try {
        $e->Insert();
    } catch ( Exception $e ) {
        // $e->getMessage();
        $max += 10;
        $e->id = $max;
        $e->Insert();
    }
    $sql = 'SET IDENTITY_INSERT mt_entry OFF';
    $mt->db()->Execute( $sql );
}
?>

何か最近こんなんばっか...

トラックバック(0)

トラックバックURL: http://junnama.alfasado.net/cgi/mt/mt-tb.cgi/708

コメントする

Facebook

Twitter

このブログ記事について

このページは、Junnama Nodaが2013年8月20日 20:19に書いたブログ記事です。

ひとつ前のブログ記事は「MTOSはWordPressの夢を見るか? Movable TypeはEnterpriseの夢を見るか? 」です。

次のブログ記事は「MT6のData APIから取得したJSONをキャッシュしたりMTMLで出力したり...」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 6.2.6