如何读取类型为uniqueidentifier的输出参数?

问题描述 投票:1回答:1

我正在尝试使用PDO在SQL Server上执行存储过程。一切运行正常,但是当我尝试读取输出参数(其类型为UNIQUEIDENTIFIER)时,我唯一得到的是NULL。

我已经尝试使用PHP 7.0在Debian 9上运行我的脚本,在PHP 7.2上运行Ubuntu 18.10并更改我的参数的PDO类型,但没有成功。

$order_uid = null;
$sql = "EXEC spInsertOrder ?, ?, ?, ?...";
$stmt = $db->prepare($sql);

$stmt->bindParam(29, $order_uid, PDO::PARAM_INPUT_OUTPUT | PDO::PARAM_STR, 50);
if ($stmt->execute() === false) {
    echo $stmt->errorCode();
    print_r($stmt->errorInfo());
}

我希望得到SQL Server发出的UUID,而不是这个错误提出:

致命错误:未捕获PDOException:SQLSTATE [IMSSP]:指定了参数5的无效类型。只能使用布尔值,整数,浮点数,字符串和流作为参数。

php sql-server pdo uniqueidentifier
1个回答
1
投票

在阅读OUTPUT参数的值之前,需要考虑以下事项:

  • 如果存储过程执行SELECT语句,则需要在访问输出参数的值之前使用PDOStatement::nextRowset使用所有结果。
  • 如果您的语句执行INSERT或UPDATE语句,请将SET NOCOUNT ON作为过程的第一行,以阻止SQL Server将受影响的行的计数作为结果集返回。
  • 将PHP变量设置为null

工作示例(使用PHP 7.1.12和SQL Server的PHP驱动程序(PDO)4.3.0 + 9904测试):

T-SQL:

CREATE PROCEDURE [dbo].[sp_UID]
    @id UNIQUEIDENTIFIER OUTPUT
AS BEGIN
    SET NOCOUNT ON
    SET @id = NEWID()
END

PHP:

<?php
# Connection info
$server   = 'server\instance,port';
$database = 'database';
$uid      = 'uid';
$pwd      = 'pdw';

# Connection
try {
    $dbh = new PDO("sqlsrv:server=$server;Database=$database", $uid, $pwd);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch( PDOException $e ) {
    die("Error connecting to SQL Server. ".$e->getMessage());
}

# Stored procedure
try {
    $sql = "{CALL sp_UID(?)}";
    $uid = null;

    $stmt = $dbh->prepare($sql);
    $stmt->bindParam(1, $uid, PDO::PARAM_STR | PDO::PARAM_INPUT_OUTPUT, 36);
    $stmt->execute();
    // If your procedure returns result set, you need to fetch result and then get the value for your output parameter
    /*
    do {
        while ($row = $stmt->fetch( PDO::FETCH_ASSOC )) {
        }
    } while ($stmt->nextRowset());  
    */
} catch( PDOException $e ) {
    die( "Error executing stored procedure: ".$e->getMessage());
}
$stmt = null;

# End
$dbh = null;
echo $uid;
?>

输出:

F689A035-C3DB-4D4E-88FB-52F5DA133FA8
© www.soinside.com 2019 - 2024. All rights reserved.