PDO::bindParam/bindValue 创建错误的参数类型


PDO::bindParam/bindValue creates the wrong parameter type

我有一个采用一些整数参数的存储过程:

CREATE PROCEDURE [dbo].[redacted_name]
    @CustomerID int , 
    @ContactPersonID int,
    @ChangeContactPersonId int = null,
    @Name varchar(50)  = NULL
    -- snip
AS
BEGIN
  -- snip
END

我使用以下代码调用此存储过程:

$db = $this->db();
$statement = $db->prepare("exec dbo.redacted_name @CustomerId=?,@ContactPersonId=?");
$statement->bindValue(1, 73, PDO::PARAM_INT);
$statement->bindValue(2, 42, PDO::PARAM_INT);
$statement->execute();
//snip

它会生成以下 SQL,从探查器中获取:

declare @p1 int
exec sp_prepexec @p1 output,N'@P1 TEXT,@P2 TEXT',N'exec dbo.redacted_name  @customerId=@P1,@contactPersonId=@P2','73','42'
select @p1
exec sp_unprepare @p1
go

执行此 SQL,会导致 Microsoft SQL Server 11.0.5343 上出现以下错误:

Msg 206,级别 16,状态 2,过程 redacted_name,第 0
行 操作数类型冲突:文本与 int 不兼容

这是有道理的,因为TEXT != INT考虑到我特别告诉PDO我正在传递INT,为什么PDO会生成两个TEXT变量?我能做些什么来解决这个问题?

我建议您调查 BindParam() 的"驱动程序选项"参数,也许它会有所帮助。

在某些情况下,这可能是问题所在。

今天我遇到了同样的问题。我得到了类似的东西:强制转换规范的字符值无效:206 [Microsoft][SQL Server 的 ODBC 驱动程序 13][SQL Server]操作数类型冲突:文本与 int 不兼容。

我在 Linux CentOS 7 上使用带有 PDO 的 PHP 7.0 和 Microsoft ODBC 以及连接字符串,如下所示:

$pdo = new PDO('odbc:driver=SQL Server Native Client 11.0;server=MyServer;database=MyDB;MARS_Connection=是"、"用户"、"通过");

要解决此问题,需要确切的存储过程参数大小写。

存储的 proc 参数@CustomerID int 是用"ID"定义的,那么你必须使用 @CustomerID = ? 而不是 @CustomerId = ?...

$statement = $db->prepare("exec dbo.redacted_name @CustomerID=?, @ContactPersonID=?");

看起来驱动程序尝试通过使用区分大小写的匹配查看 proc 参数来确定目标类型。