2011-02-15 59 views
0

我有一個CakePHP應用程序通過ODBC連接到遠程MSSQL服務器,但它不能按計劃工作。每個查詢都會死掉,因爲它試圖對標識符進行反引號操作,這對MSSQL不正確。連接到Microsoft SQL Server的CakePHP ODBC驅動程序;如何刪除反引號?

舉個例子,我有一個一個表叫Item模式叫items,當我打電話

$this->Item->find('all') 

它試圖使用查詢

SELECT `Item`.`id`, `Item`.`name`, `Item`.`descrtiption` FROM `items` AS `Item` WHERE 1 

...和我得到在第1行`附近出現關於無效語法的錯誤。
有沒有辦法阻止此行爲並刪除反引號?或者像SQL Server似的使用方括號似乎喜歡?

回答

2

最近,我仔細地看了一眼周圍的ODBC驅動程序與CakePHP的1.3使用它針對2008年MSSQL的意圖。除非您準備投入大量工作,否則目前不可行。

您的直接問題是您需要用[和]覆蓋默認引號。這些設置在這裏的dbo_odbc.php文件

var $startQuote = "["; 
var $endQuote = "]"; 

頂部一旦你做到這一點,下一個問題你會遇到的是默認使用極限的,所以你需要提供自己的限制功能複製從dbo_mssq覆蓋

/** 
* Returns a limit statement in the correct format for the particular database. 
* 
* @param integer $limit Limit of results returned 
* @param integer $offset Offset from which to start results 
* @return string SQL limit/offset statement 
*/ 
    function limit($limit, $offset = null) { 
     if ($limit) { 
      $rt = ''; 
      if (!strpos(strtolower($limit), 'top') || strpos(strtolower($limit), 'top') === 0) { 
       $rt = ' TOP'; 
      } 
      $rt .= ' ' . $limit; 
      if (is_int($offset) && $offset > 0) { 
       $rt .= ' OFFSET ' . $offset; 
      } 
      return $rt; 
     } 
     return null; 
    } 

然後你會遇到兩個問題,我都解決了這兩個問題。

  1. 在描述函數中,odbc_field_type調用不返回 字段類型。如果你在模型中描述這些領域,我不確定這是多麼的重要,但這聽起來並不樂觀。
  2. 更重要的是,在字段函數用於生成一個字段列表蛋糕的作品遞歸爆炸的作品。語法來生成一系列AS別名。如果遞歸級別爲零,這很好,但如果遞歸更深,最終會出現類似'this.that.other AS this_dot_that.other AS this_dot_that_dot_other'的字段列表,這是無效的MSSQL語法。

這些都不是無法解決的,但在這一點上,我決定是簡單的重裝我的服務器,並使用MSSQL的驅動程序不是繼續用ODBC驅動程序追prblems,但情況因人而異

新增:這個問題似乎得到了一些關注:所以任何進一步考慮這個問題的人都可以將他們的代碼附加到這個答案上 - 希望我們能夠在我們之間組合一個解決方案。

+0

我們沒有那麼多的數據從數據庫中提取出來,所以我們最終只是自己編寫查詢。糟糕的做法,但它符合我們的需求。我將此標記爲答案,因爲這是對問題的最好解釋,並且確實提供了提供可行解決方案的大部分方法。 – 2011-09-13 04:32:35

相關問題