0

我有一个 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 似乎喜欢使用方括号?

4

2 回答 2

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 调用未返回字段类型。如果您描述模型中的字段,我不确定这有多重要,但这听起来并不乐观。
  2. 更重要的是,在用于生成字段列表 cake 的 fields 函数中,它通过递归分解 . 生成一系列 AS 别名的语法。如果您的递归级别为零,这很好,但随着更深层次的递归,您最终会得到一个类似于“this.that.other AS this_dot_that.other AS this_dot_that_dot_other”的字段列表,这是无效的 MSSQL 语法。

这些都不是无法解决的,但此时我决定重新加载我的服务器并使用 MSSQL 驱动程序比继续使用 ODBC 驱动程序追逐问题更简单,但是 YMMV

补充:这个问题似乎得到了一些关注:所以任何人如果更进一步,他们可以将他们的代码附加到这个答案中 - 希望我们可以在我们之间组装一个解决方案。

于 2011-09-12T17:01:37.183 回答
0

你为什么不只使用 mssql dbo https://github.com/cakephp/cakephp/blob/master/cake/libs/model/datasources/dbo/dbo_mssql.php

于 2011-02-15T09:21:48.497 回答