Драйвер ODBC CakePHP для подключения к Microsoft SQL Server; как убрать спины? - PullRequest
0 голосов
/ 15 февраля 2011

У меня есть приложение CakePHP, подключающееся к удаленному серверу MSSQL через ODBC, но оно не работает, как планировалось.Каждый запрос умирает из-за того, что он пытается поставить обратные пометки вокруг идентификаторов, что неправильно для MSSQL.

Например, у меня есть модель с именем Item для таблицы с именем items, и когда я вызываю

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

, она пытается использовать запрос

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

... и я получаю ошибку о недопустимом синтаксисе рядом с ` в строке 1.
Есть ли способ предотвратить такое поведение и убрать галочки?Или же использовать квадратные скобки, как SQL Server, похоже, нравится?

Ответы [ 2 ]

2 голосов
/ 12 сентября 2011

Недавно я внимательно ознакомился с драйвером odbc, намереваясь использовать его против MSSQL 2008 в CakePHP 1.3.Если вы не готовы выполнить значительный объем работы, то в настоящее время это неосуществимо.

Ваша непосредственная проблема заключается в том, что вам нужно переопределить кавычки по умолчанию с помощью [и].Они установлены в верхней части файла 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. В описывающей функции вызов odbc_field_type не возвращаеттип поля.Я не уверен, насколько это важно, если вы описываете поля в модели, но это не звучит многообещающе.
  2. Что еще более важно, в функции fields, которая используется для генерации торта списка полей, работает рекурсивновзрыва.синтаксис для генерации серии псевдонимов AS.Это нормально, если ваш уровень рекурсии равен нулю, но при более глубокой рекурсии вы получите список полей, который выглядит примерно так: 'this.that.other AS this_dot_that.other AS this_dot_that_dot_other', что является недопустимым синтаксисом MSSQL.

Ни один из них не является неразрешимым, но на этом этапе я решил, что проще перезагрузить мой сервер и использовать драйвер MSSQL, чем продолжать преследовать проблемы с драйвером ODBC, но YMMV

ДОБАВЛЕНО:Этот вопрос, кажется, привлекает немного внимания: поэтому любой, кто пойдет дальше, может добавить свой код к этому ответу - и, надеюсь, мы сможем найти решение между нами.

0 голосов
/ 15 февраля 2011

почему вы просто не используете mssql dbo https://github.com/cakephp/cakephp/blob/master/cake/libs/model/datasources/dbo/dbo_mssql.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...