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

时间:2016-07-13 14:14:31

标签: php sql-server pdo

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

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,Level 16,State 2,Procedure redacted_name,Line 0
  操作数类型冲突:文本与int

不兼容

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

2 个答案:

答案 0 :(得分:1)

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

在某些情况下可能会出现问题。

答案 1 :(得分:1)

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

我在Linux CentOS 7上使用带有Microsoft ODBC的PHP 7.0和一个连接字符串,如:

$pdo = new PDO('odbc:driver=SQL Server Native Client 11.0;server=MyServer;database=MyDB;MARS_Connection=yes', 'user', 'pass');

要解决此问题,需要准确的存储过程参数。

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

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

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