CodeIgniter mssql driver 補完 XD

最近用 CodeIgniter 搭配 MS SQL Server 在寫程式, 把原來是針對 MySQL 的程式拿來改成用 SQL Server 當資料庫, 不過卻碰上滿多問題的, 特別是 SQL Statement 的部份, 有幾個看起來不會有問題的 statement 全都因為資料庫換成了 SQL Server 而產生了錯誤。

不過在 CodeIgniter 上面用 ActiveRecord 其實已經去除掉一些可能會發生 Statement 不相容的問題了, 不過後來才發現, 原來 CodeIgniter 雖然支援許多資料庫, 但是其實對於 MS SQL Server 的支援並不完整, 當然是碰到了才知道, 原來 insertid 根本沒有實作, 後來到 CodeIgniter 的論壇找了一下, 有人已經提出來了這個問題, 也有人提供實作好了的 insertid patch。可以看到這一篇

一開始先看到 systemdatabasedriversmssqlmssqldriver.php 這個檔案, 可以看到他的 insertid 函式是空的, 好吧! 他有寫明 XD

function insert_id()  
{
    // Not supported in MS SQL?
    return 0;
}```

OK 接下來就照著論壇上的方式做, 不過他裡面有點小脫誤, 這裡貼上我跑過可以正常運作的 code, 首先把 insert_id function 改成下面這樣

function insertid()
{ $ver = self::
parsemajorversion($this->version()); $sql = ($ver >= 8 ? "SELECT SCOPEIDENTITY() AS lastid" : "SELECT @@IDENTITY AS lastid"); $query = $this->query($sql); $row = $query->row(); return $row->last_id; }```

接著是修改 _version function 變成下面這個樣子

function _version()  
{
    return "SELECT @@VERSION AS ver";
}```

最後增加一個函式如下 _parse_major_version

function parsemajorversion($version)
{ preg
match('/([0-9]+).([0-9]+).([0-9]+)/', $version, $verinfo); return $verinfo[1]; // return the major version b/c that's all we're interested in. }```

其實在論壇上看到的 code 有問題的地方只在 insert_id 函式的第一行, 應該是呼叫的時候錯 call 了 version 這個函式, 其實應該是 _version 才對 XD anyway 反正我寫這篇只是自己 memo 用, 想必這個部份應該也已經 commit 了, 下一版的 CI 就會補上相關的部份。

tzangms

Read more posts by this author.

Subscribe to Oceanic / 海海人生

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!