我遇到一个奇怪的问题,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作为其主键,并且一些列名称不同(不重要)。
我做错了什么?
更新:
Whilte $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 for PHP 3.0已经发布。这可能是我想的问题..因为我试图查询的数据库是MSSQL(2008?vs 2005)的新版本,而不是我之前使用过的没有任何问题的版本。但是,这个驱动程序只使用VC9编译(2.0可用于两者),我的PHP 5.3使用VC6编译..所以它不会加载。这是否意味着我需要使用源代码重新编译它或使用VC9版本重新安装PHP?
我不知道如何重新编译,所以我想重新安装VC9版本的PHP 5.3就是我现在的方式。
答案 0 :(得分:2)
您的查询可能有问题。您可以使用sqlsrv_errors()
检索错误消息,例如像这样:
$stmt = sqlsrv_query($tsql);
if ($stmt === false) {
die(print_r(sqlsrv_errors(), true));
}
答案 1 :(得分:1)
此错误'无效类型'当查询返回PDO无法处理的列类型时发生。例如,当你尝试
时,你会得到这个SELECT default_value FROM sys.parameters
因为该列是sql_variant类型。如果它有意义,而是将该列CAST到varchar或其他任何内容,或者从查询中删除它。