繁体   English   中英

PHP PDO Microsoft SQL Server:SQLSTATE [24000]:[Microsoft] [用于SQL Server的ODBC驱动程序11]-无效的游标状态

[英]PHP PDO Microsoft SQL Server: SQLSTATE[24000]: [Microsoft][ODBC Driver 11 For SQL Sever] - Invalid Cursor State

我有这个php脚本,应该向系统添加新的运行。 每次运行它时,它都会告诉我我的光标状态无效。 我不知道为什么会发生此错误。 在进行下一部分代码之前,我已经进行了closeCursor()调用。 这是php脚本,它在第42行上抛出错误(我的CreatePersonalRun存储过程的execute命令):

if (isset($emailAddress, $caloriesBurnt, $dateRecorded, $deleted, $endTime, $startTime, $runType, $routeId)) {

$getAthleteID = $dsn->prepare("{CALL sp_GetAthleteId(?)}");
$getAthleteID->bindParam(1, $emailAddress, PDO::PARAM_STR);
$getAthleteID->execute();
$athleteData = $getAthleteID->fetch(PDO::FETCH_ASSOC);
$athleteId = $athleteData["AthleteID"];
$getAthleteID->closeCursor();
$runType = 0;
$deleted = false;
if ($athleteId != null) {
    $getAthleteID->closeCursor();
    $addRun = $dsn->prepare("{CALL sp_CreatePersonalRun(?,?,?,?,?,?,?,?)}");
    $addRun->bindValue(1, $athleteId);
    $addRun->bindValue(2, $caloriesBurnt);
    $addRun->bindValue(3, $dateRecorded);
    $addRun->bindValue(4, $deleted);
    $addRun->bindValue(5, $endTime);
    $addRun->bindValue(6, $routeId);
    $addRun->bindValue(7, $startTime);
    $addRun->bindValue(8, $runType);
    $addRun->execute(); //This is where the error is thrown
    if ($addRun->rowCount() > 0) {
        echo json_encode(array("code" => 100, "message" => "Run has been added to the system successfully!"));
    } else {
        echo json_encode(array("code" => 200, "message" => "Something went wrong with adding the run to the system"));
    }

} else {
    echo json_encode(array("code" => 200, "message" => "Athlete does not exist"));
}

我的getAthleteId存储过程的代码:

ALTER PROCEDURE [dbo].[sp_GetAthleteId]

@emailAddress nvarchar(400)

AS

SELECT * FROM Athlete WHERE EmailAddress = @emailAddress;

形成此SOURCE原因以获取Invalid cursor state错误,

通过SQLFetch或SQLFetchScroll将光标定位在StatementHandle上。 如果SQLFetch或SQLFetchScroll没有返回SQL_NO_DATA,则驱动程序管理器将返回此错误;如果SQLFetch或SQLFetchScroll返回了SQL_NO_DATA,则驱动程序将返回此错误。

在StatementHandle上打开了一个游标。

与StatementHandle关联的已准备语句包含一个定位的update或delete语句,并且光标位于结果集的开始之前或结果集的结束之后。

因此,请检查存储的过程是否返回任何结果,并尝试将$getAthleteID->fetch(PDO::FETCH_ASSOC)替换为

$getAthleteID->fetchAll(PDO::FETCH_ASSOC);

我整个上午都在为此苦苦挣扎,直到找到答案:

确保已为存储过程设置了SET NOCOUNT ON-所有这些行都显示“(x个受影响的行)”只是混淆了PDO驱动程序的内容,并导致未创建结果集。

高温超导

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM