0

我遇到了一个奇怪的问题,它sqlsrv_query()返回一个有效的语句资源,但sqlsrv_fetch_array()随后返回 false。我在 MS SQL Server Management Studio 中测试了我的查询 ( $q),所以我知道它返回的结果具有一定数量的行。我的代码是...

$r = @sqlsrv_query($dbcMssql, $q, array(), array('Scrollable'=>'static'));    // works
$rowCount = sqlsrv_num_rows($r);    // this shows there are correct number of rows
$row = sqlsrv_fetch_array($r, SQLSRV_FETCH_ASSOC);    // $row is FALSE

我在另一个 MSSQL 数据库上使用了相同的代码,它工作没有任何问题。此 MSSQL DB 的唯一区别是它使用 BIGINT 作为其主键,并且某些列名不同(这并不重要)。

我究竟做错了什么?

更新:

虽然$stmt不是假的,但我还是查看了错误,它给了我

        [0] => IMSSP
        [SQLSTATE] => IMSSP
        [1] => -35
        [code] => -35
        [2] => Invalid type
        [message] => Invalid type

IMSSP 让我相信,根据文档http://php.net/manual/en/function.sqlsrv-errors.php,是我的 SQL for PHP 2.0 驱动程序导致了问题。我看到 PHP 3.0 的 SQL 已经发布。这可能是我想的问题.. 因为我尝试查询的数据库是 MSSQL 的更新版本(2008 年?与 2005 年),而不是我以前使用的数据库,没有任何问题。但是,这个驱动程序只用 VC9 编译(2.0 可用于两者),而我的 PHP 5.3 是用 VC6 编译的。所以它不会加载。这是否意味着我需要使用源代码重新编译它或使用 VC9 版本重新安装 PHP?

我不知道如何重新编译,所以我想重新安装 VC9 版本的 PHP 5.3 是我现在要走的路。

4

2 回答 2

2

您的查询可能有问题。您可以使用 检索错误消息sqlsrv_errors(),例如:

$stmt = sqlsrv_query($tsql);
if ($stmt === false) {
    die(print_r(sqlsrv_errors(), true));
}
于 2012-06-15T07:58:09.873 回答
1

当查询返回 PDO 无法处理的列类型时,会发生此错误“无效类型”。例如,当您尝试

SELECT default_value FROM sys.parameters

因为该列是 sql_variant 类型。如果有意义,不如将该列转换为 varchar 或其他内容,或者从查询中删除它。

于 2014-04-01T09:22:55.643 回答