我最近仔细查看了 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;
}
然后你会遇到两个问题,我都没有解决。
- 在 describe 函数中,odbc_field_type 调用未返回字段类型。如果您描述模型中的字段,我不确定这有多重要,但这听起来并不乐观。
- 更重要的是,在用于生成字段列表 cake 的 fields 函数中,它通过递归分解 . 生成一系列 AS 别名的语法。如果您的递归级别为零,这很好,但随着更深层次的递归,您最终会得到一个类似于“this.that.other AS this_dot_that.other AS this_dot_that_dot_other”的字段列表,这是无效的 MSSQL 语法。
这些都不是无法解决的,但此时我决定重新加载我的服务器并使用 MSSQL 驱动程序比继续使用 ODBC 驱动程序追逐问题更简单,但是 YMMV
补充:这个问题似乎得到了一些关注:所以任何人如果更进一步,他们可以将他们的代码附加到这个答案中 - 希望我们可以在我们之间组装一个解决方案。