Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 对于ALTER INDEX all ON tbl REORGANIZE查询,sqlsrv_查询返回什么?为什么sqlsrv_num_行返回FALSE?_Php_Sql Server_Codeigniter_Sqlsrv_Codeigniter 4 - Fatal编程技术网

Php 对于ALTER INDEX all ON tbl REORGANIZE查询,sqlsrv_查询返回什么?为什么sqlsrv_num_行返回FALSE?

Php 对于ALTER INDEX all ON tbl REORGANIZE查询,sqlsrv_查询返回什么?为什么sqlsrv_num_行返回FALSE?,php,sql-server,codeigniter,sqlsrv,codeigniter-4,Php,Sql Server,Codeigniter,Sqlsrv,Codeigniter 4,我创建了一个pull请求,将数据库\resulterface::getNumRows()函数添加到CodeIgniter 4。我做的一些已经破坏了单元测试。具体而言,SQLSRV表优化测试是barfing,因为此框架尝试从对此表优化查询的SQLSRV响应中获取结果数组: ALTER INDEX all ON db_作业重组 跟踪所有被调用的代码也有点棘手,但这里有一个例外: 1) CodeIgniter\Database\Live\DbUtilsTest::testUtilsOptimizeD

我创建了一个pull请求,将
数据库\resulterface::getNumRows()
函数添加到CodeIgniter 4。我做的一些已经破坏了单元测试。具体而言,SQLSRV表优化测试是barfing,因为此框架尝试从对此表优化查询的SQLSRV响应中获取结果数组:

ALTER INDEX all ON db_作业重组
跟踪所有被调用的代码也有点棘手,但这里有一个例外:

1) CodeIgniter\Database\Live\DbUtilsTest::testUtilsOptimizeDatabase
CodeIgniter\Database\Exceptions\DatabaseException: Error retrieving row count

/home/runner/work/CodeIgniter4/CodeIgniter4/system/Database/SQLSRV/Result.php:198
/home/runner/work/CodeIgniter4/CodeIgniter4/system/Database/BaseResult.php:193
/home/runner/work/CodeIgniter4/CodeIgniter4/system/Database/BaseUtils.php:177
/home/runner/work/CodeIgniter4/CodeIgniter4/tests/system/Database/Live/DbUtilsTest.php:105
仔细分析,我们可以看到调用函数时使用了表名“db_job”,并使用
SQLSRV\Utils::optimizeTable
var来构造我上面提供的查询。然后,此sql被馈送到一个db对象,该对象调用
CodeIgniter\Database\SQLSRV\Connection::query()
,该对象通过继承和各种函数调用将sql路由到
BaseConnection::query()
它将sql提供给
BaseConnection::simpleQuery
它将sql提供给
SQLSRV\Connection::execute
它最终将sql提供给
SQLSRV\u query
并通过调用堆栈返回该函数的结果。所以我想这就引出了我的第一个问题:

问题1:如果此ALTER命令a)成功或b)失败,
$stmt
的值是多少?

$stmt=sqlsrv_query($connID,'alterindex-all-ON-db_作业重组');
根据,此功能:

成功时返回语句资源,发生错误时返回false

无论返回的值是什么,都返回到调用堆栈的
BaseConnection::query
的第625行,如果成功,它将存储为
$this->resultID
,并作为第676行的第二个参数提供给构造函数,构造函数将有效地返回
new SQLSRV\Result($this->connID,$this->resultID)
。需要明确的是,connID指的是SQLSRV db连接,resultID指的是上述SQLSRV_查询调用返回的
$stmt
的任何值

生成的
$query
变量是此函数中system\Database\SQLSRV\Result的一个实例:

公共函数优化表(字符串$tableName)
{
如果($this->optimizeTable===false)
{
if($this->db->DBDebug)
{
抛出新的DatabaseException('您正在使用的数据库平台不支持的功能');
}
返回false;
}
$query=$this->db->query(sprintf($this->optimizeTable,$this->db->escapeIdentifiers($tableName));
如果($query!==false)
{
$query=$query->getResultArray();
返回当前($query);
}
返回false;
}
SQLSRV\Result的实例不会为false,因此代码将尝试调用
SQLSRV\Result::getresultaray
,它通过继承调用
BaseResult::getresultaray
。试图从优化表的查询或任何类型的ALTER查询中获取ResultArray似乎是错误的,但是MySQL服务器将返回一系列记录以响应优化查询。另外,我们刚才运行的sqlsrv_查询函数只是返回一些sqlserver语句或资源作为其结果

我想这就引出了我的第二个问题: 问题2:如何从sqlsrv\u查询的
$stmt
结果判断上述ALTER语句是否成功?

奇怪的是,这些特殊性以前都没有引起任何问题。出现此问题的原因似乎是,我不推荐在中从未设置的未使用的BaseResult::numRows属性,并用新的getNumRows方法替换了该属性及其所有引用。在我的新版本中,我们现在检查getNumRows而不是numRows。这对于MySQLi、SQLite3和PostGreSQL来说效果很好,但在SQLSRV中会出现问题,因为前面提到的
SQLSRV\u查询的
ALTER语句的
SQLSRV\u num\u行
返回
false
,根据文档,这表示错误。以下是
SQLSRV\Result::getNumRows
函数的代码:

公共函数getNumRows():int
{
//$this->resultID包含ALTER语句的sqlsrv\u查询结果
//而$retval出现错误
$retval=sqlsrv\u num\u行($this->resultID);
如果($retval==false)
{
抛出新的DatabaseException('检索行计数时出错');
}
返回intval($retval);
}
这使我想到:
问题3:尝试从ALTER INDEX查询的结果中获取结果或调用sqlsrv_num_行是否有意义?

我没有任何具体的建议来帮助您前进,但我使用过的db框架通常都有某种“执行非查询”功能允许您运行不用于生成结果集的命令的功能。例如CodeIgniter有类似的概念吗?您需要将
CI\u DB\u sqlsrv\u驱动程序的
scrollable
属性设置为
sqlsrv\u CURSOR\u键集
sqlsrv\u CURSOR\u静态
sqlsrv\u CURSOR\u客户端缓冲
中的一个。函数'sqlsrv_num_rows'需要客户端、静态或键集游标,如果使用正向游标或动态游标,则将返回false。(默认情况下,向前光标。)。我认为,这就是对代码中意外行为的解释。我没有任何具体的建议来帮助您前进,但我使用过的db框架通常具有某种“执行非查询”功能,允许您运行不打算生成结果集的命令。例如CodeIgniter有类似的概念吗?您需要设置
CI\D的
scrollable
属性