如果這對任何在收到以下錯誤後來到這裡的人有幫助的話
SQLState: 24000 [Microsoft][ODBC SQL Server Driver]無效的游標狀態
PDOStatement :: closeCursor() 並沒有為我解決問題。 然而,在我的預存程序開頭添加 SET NOCOUNT ON 就可以了。
(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.9.0)
PDOStatement::closeCursor — 關閉遊標,讓敘述可以再次執行
PDOStatement::closeCursor() 會釋放與伺服器的連線,以便可以發出其他 SQL 陳述式,但會將陳述式保留在可再次執行的狀態。
這個方法對於不支援在先前執行的 PDOStatement 物件仍有未提取的列時執行 PDOStatement 物件的資料庫驅動程式很有用。如果您的資料庫驅動程式有此限制,問題可能會以序列錯誤的形式出現。
PDOStatement::closeCursor() 的實作方式可以是選擇性的驅動程式特定方法(允許最大效率),或者如果未安裝驅動程式特定函式,則使用泛型 PDO 回退機制。PDO 泛型回退機制在語義上與在 PHP 指令碼中編寫以下程式碼相同:
<?php
do {
while ($stmt->fetch())
;
if (!$stmt->nextRowset())
break;
} while (true);
?>
此函式沒有參數。
如果屬性 PDO::ATTR_ERRMODE
設定為 PDO::ERRMODE_WARNING
,則會發出層級為 E_WARNING
的錯誤。
如果屬性 PDO::ATTR_ERRMODE
設定為 PDO::ERRMODE_EXCEPTION
,則會擲出 PDOException 例外。
範例 #1 PDOStatement::closeCursor() 範例
在以下範例中,$stmt PDOStatement 物件傳回多列,但應用程式只提取第一列,使 PDOStatement 物件處於有未提取列的狀態。為了確保應用程式可以與所有資料庫驅動程式一起使用,作者在執行 $otherStmt PDOStatement 物件之前,在 $stmt 上插入了對 PDOStatement::closeCursor() 的呼叫。
<?php
/* 建立一個 PDOStatement 物件 */
$stmt = $dbh->prepare('SELECT foo FROM bar');
/* 建立第二個 PDOStatement 物件 */
$otherStmt = $dbh->prepare('SELECT foobaz FROM foobar');
/* 執行第一個敘述 */
$stmt->execute();
/* 只擷取結果中的第一列 */
$stmt->fetch();
/* 某些驅動程式可能需要以下 closeCursor() 呼叫 */
$stmt->closeCursor();
/* 現在我們可以執行第二個敘述 */
$otherStmt->execute();
?>