如何读取类型为 uniqueidentifier 的输出参数?
How do I read an output param whose type is uniqueidentifier?
我正在尝试使用 PDO 在 SQL 服务器上执行存储过程。一切运行良好,但当我尝试读取输出参数(其类型为 UNIQUEIDENTIFIER)时,我得到的唯一结果是 NULL。
我已经尝试 运行 我在 Debian 9 上使用 PHP 7.0 和 Ubuntu 18.10 使用 PHP 7.2 并更改我的参数的 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 服务器发出的 UUID,但会引发此错误:
Fatal error: Uncaught PDOException: SQLSTATE[IMSSP]: An invalid type
for parameter 5 was specified. Only booleans, integers, floating point
numbers, strings, and streams may be used as parameters.
在读取 OUTPUT
参数的值之前,您需要考虑以下事项:
- 如果您的存储过程执行
SELECT
语句,您需要使用 PDOStatement::nextRowset
使用所有结果,然后再访问输出参数的值。
- 如果您的语句执行 INSERT 或 UPDATE 语句,请将
SET NOCOUNT ON
作为程序的第一行以停止 SQL 服务器以 [=40=] 受影响的行数作为结果集。
- 将您的 PHP 变量设置为
null
。
工作示例(使用 PHP 7.1.12 和 PHP SQL 服务器 (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
我正在尝试使用 PDO 在 SQL 服务器上执行存储过程。一切运行良好,但当我尝试读取输出参数(其类型为 UNIQUEIDENTIFIER)时,我得到的唯一结果是 NULL。
我已经尝试 运行 我在 Debian 9 上使用 PHP 7.0 和 Ubuntu 18.10 使用 PHP 7.2 并更改我的参数的 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 服务器发出的 UUID,但会引发此错误:
Fatal error: Uncaught PDOException: SQLSTATE[IMSSP]: An invalid type for parameter 5 was specified. Only booleans, integers, floating point numbers, strings, and streams may be used as parameters.
在读取 OUTPUT
参数的值之前,您需要考虑以下事项:
- 如果您的存储过程执行
SELECT
语句,您需要使用PDOStatement::nextRowset
使用所有结果,然后再访问输出参数的值。 - 如果您的语句执行 INSERT 或 UPDATE 语句,请将
SET NOCOUNT ON
作为程序的第一行以停止 SQL 服务器以 [=40=] 受影响的行数作为结果集。 - 将您的 PHP 变量设置为
null
。
工作示例(使用 PHP 7.1.12 和 PHP SQL 服务器 (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