CakePHP ODBC驱动程序连接到Microsoft SQL Server;如何删除反引号?

时间:2011-02-15 04:44:01

标签: sql-server cakephp odbc backticks

我有一个CakePHP应用程序通过ODBC连接到远程MSSQL服务器,但它没有按计划运行。每个查询都会因为它试图在标识符周围添加反引号而死亡,这对于MSSQL来说是不正确的。

例如,我有一个名为Item的模型用于名为items的表,当我调用

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

它尝试使用查询

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

...我在第1行`附近收到有关无效语法的错误。
反正有没有阻止这种行为并删除反引号?或者使用像SQL Server似的方括号?

2 个答案:

答案 0 :(得分:2)

我最近仔细研究了odbc驱动程序,打算在CakePHP 1.3中使用它来对抗MSSQL 2008。除非你准备在那时投入大量的工作,否则目前是不可行的。

您当前的问题是您需要使用[和]覆盖默认引号。这些设置在dbo_odbc.php文件的顶部

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

执行此操作后,您将遇到的下一个问题是默认使用LIMIT,因此您需要提供从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. 在describe函数中,odbc_field_type调用未返回a 字段类型。如果你描述模型中的字段,我不确定这是多么重要,但它看起来并不乐观。
  2. 更重要的是,在字段函数中,用于生成字段列表的蛋糕通过递归爆炸来实现。用于生成一系列AS别名的语法。如果递归级别为零,这很好,但是如果递归越深,你最终会得到一个类似'this.that.other AS this_dot_that.other AS this_dot_that_dot_other'的字段列表,这是无效的MSSQL语法。
  3. 这些都不是无法解决的,但此时我认为重新加载我的服务器并使用MSSQL驱动程序比使用ODBC驱动程序继续追逐问题更简单,但是YMMV

    补充说:这个问题似乎引起了一些关注:所以任何进一步采取这种做法的人都可以将他们的代码附加到这个答案上 - 希望我们可以在我们之间组建一个解决方案。

答案 1 :(得分:0)