2019年7月29日 星期一

在 PHP 中使用 ASP 的 ADO

有時候要轉 ASP 程式,不想全部改寫,尤其是資料庫存取的部分,這時在 PHP 中透過 COM() 來使用 ASP 的 ADO,就會很方便。

而且,在 PHP 中使用 odbc 的 function,無法存取 UTF-8 的資料。但使用 COM,只要在建立時,指定 UTF-8 編碼即可。

<?php

function hh($errno, $errstr, $errfile, $errline ) {
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
}

set_error_handler("hh");

$dual = new COM("ADODB.Connection", null, CP_UTF8);
$dual->Open("dual_odbc", "uid", "password");

$sql = "SELECT top 10 *, FROM cousched where ser_no <= '20000' ";
// $c_course = odbc_exec($dual, $sql);
try {
    $rs = $dual->execute($sql);
    while(!$rs->eof) {
        echo $rs->fields("cou_cname")->value()."<br>\n";
        $rs->movenext();
    }
} catch (Exception $e) {
    echo nl2br($e->getMessage())."<br>\n";
    echo nl2br($e->getTraceAsString());
    exit;
}

$dual->close();

上面的程式,有加上 error handler 的處理。可以參考下面的連結
Unexpected behavior using try-catch statement when using odbc_exec in PHP

程式中的 SQL 語法是錯的,用來測試 error handling 的功能是否正常。

執行的結果如下,
Source: Microsoft OLE DB Provider for ODBC Drivers
Description: [Microsoft][ODBC SQL Server Driver][SQL Server]關鍵字 'FROM' 附近的語法不正確。
#0 E:\Inetpub\wwwroot\ajtest\ado_tst.php(17): com->execute('SELECT top 10 *...')
#1 {main};

應急時,在使用上,蠻方便的。

在 ADODB.Command 的 execute 指令中,ASP 程式可以省略第一個參數 (row affected),但 PHP 不能省略,一定要塞一個變數,此變數不用事先定義。
$SQL = "select * from course where cou_no=? ";

$params = array($cou_no);
new COM("ADODB.Connection", null, CP_UTF8);

$cmd = new COM("ADODB.Command", null, CP_UTF8);
$cmd->CommandText = $SQL;
$cmd->ActiveConnection = $conn;
$rs = $cmd->Execute($ra, $params, 1);
$cmd->cancel();


沒有留言:

張貼留言

網誌存檔