php - ODBC_CONNECT 游标类型与 PHP 中使用 freeTDS 和 unixODBC 的 SQLGetData 冲突

标签 php sql-server odbc freetds unixodbc

我有一个在 Gentoo Linux 上运行的 PHP 项目,它使用 FreeTDS 和 UnixODBC 连接到 Windows 服务器上的 MSSQL 数据库。我已经让这个项目使用这个确切的代码很多年了,但最近我不得不更新 PHP,因为 Gentoo 在 portage 中不再有版本 5.3 ebuild,并且需要进行其他系统更新。

当前使用的各种软件的版本是:
PHP 版本为 5.6.17
FreeTDS 版本为 0.91
UnixODBC 版本为 2.3.2-r1

但是现在,一些曾经完美运行的完全相同的查询返回了此错误。

PHP Warning: odbc_fetch_object(): SQL error: [unixODBC][Driver Manager]SQLGetData is not allowed on a forward only (non-buffered) cursor, SQL state SL008 in SQLGetData in /home/XXXXX/XXXX.php on line Y

并非所有查询都会返回此错误,只有部分查询会返回此错误,但相同的查询始终会返回相同的错误。

一个会返回此错误的简单 PHP 程序如下:

$con = odbc_connect(DBNAME,UNAME,PW,SQL_CUR_USE_ODBC)
$query = "SELECT * FROM SomeTable"
$Output = odbc_exec($con,$query);
$return_array = array();
while($row = odbc_fetch_object($Output)){
#
        foreach($row as &$value){
                $value = mb_convert_encoding($value, "UTF-8", "Windows-1252");
        }
        unset($value);
        $return_array[] = $row;
}
echo json_encode($return_array,JSON_UNESCAPED_UNICODE);
odbc_close($con);
?>

现在这肯定与使用SQL_CUR_USE_ODBC时提供给odbc_connect的第4个参数有关,错误如我上面所说。当它更改为 SQL_CUR_USE_IF_NEEDED 时,它会返回错误:

Warning: odbc_fetch_object(): No tuples available at this result index in /home/XXXXX/XXXX.php on line Y []

SQL_CUR_USE_DRIVER 具有相同的结果,或者留空。

同样,两天前,这是所有查询的所有功能代码。因此,从 PHP 5.3 到 php > 5.3 的任何版本都发生了一些变化。从 5.4 到 7.0(portage 中有一个 PHP 7 ebuild),每个版本的 PHP 都被尝试过,并且都产生相同的错误。

在此事上的任何帮助或指导将不胜感激。

最佳答案

我发现的第一个主要提示是,只有当我们对文本列和其他列执行 SELECT 时,才会发生这种情况。单独对文本列使用 SELECT 不会引发错误。选择除文本列之外的所有其他列都不会引发错误。我们刚刚从 SQL Server 2000 迁移到 2008,因此我非常愿意尝试 VARCHAR(MAX),以支持我们在 2000 年必须使用的文本列。

ALTER TABLE tbl_name ALTER COLUMN col_name VARCHAR(MAX) [NOT] NULL 为我们修复了所有这些错误消息。即使返回了几 KB 的文本,它也可以很好地传输 VARCHAR(MAX)。旧的 Text 实现将列大小保留为 2GB,因此我假设 FreeTSD 0.91 有一些大小限制。

关于php - ODBC_CONNECT 游标类型与 PHP 中使用 freeTDS 和 unixODBC 的 SQLGetData 冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35486567/

相关文章:

php - 如何使 PHP shell_exec 可以访问 GPG key

php - 为每个事件构建标签列表

java - Jdbc Odbc 错误。我无法连接到 ODBC 驱动程序

sql - 为 ODBC 数据源编写 SQL 查询

excel - 未找到数据源名称,未指定默认驱动程序”。获取连接失败 "DestinationConnectionOLEDB"

php - 如何使用 PHP 和 Python 进行 STDIN 和 STDOUT 以使用 html2text 并获取 Markdown 格式的文本?

php - 使用 PHP 将文件写入 Linux 的问题

sql-server - 无法 SQLBulkCopy 错误 40197,%d 代码为 4815(连接强制关闭)

sql - 在存储过程中传递动态订单

php - 使用 WAMP/PHP 5.3.4 时出现 MSSQL 错误(表示未启用)