2016-07-13 12 views
3

ich eine gespeicherte Prozedur, die einige Integer-Parameter verwendet:PDO :: bindParam/bindValue schafft den falschen Parameter Typ

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

ich den folgenden Code bin mit dieser gespeicherten Prozedur aufzurufen:

$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 

Welche der folgenden SQL erzeugt aus einem Profiler packte:

declare @p1 int 
exec sp_prepexec @p1 output,N'@P1 TEXT,@P2 TEXT',N'exec dbo.redacted_name @[email protected],@[email protected]','73','42' 
select @p1 
exec sp_unprepare @p1 
go 

Ausführung dieser SQL verursacht th e folgende Fehler auf Microsoft SQL Server-11.0.5343:

Msg 206, Ebene 16, Status 2 Prozedur redacted_name, Zeile 0
Operand-Typenkonflikt: Text mit

int unvereinbar ist

Welche macht Irgendein Sinn, weil TEXT != INT In Anbetracht dessen, dass ich PDO speziell gesagt habe, dass ich eine INT überlasse, warum erzeugt PDO zwei TEXT Variablen? Und was kann ich tun, um es zu umgehen?

+0

haben Sie versucht mit bindParam()? – Robert

+0

@Robert Ja. Gleiches Problem. Ich habe die Frage mit 'bindValue' gepostet, weil dadurch der Code etwas kürzer wird (keine Variablen erforderlich). –

+0

Es gibt "Treiberoptionen" Argument für BindParam() vielleicht würde es helfen – Robert

Antwort

1

Ich schlage vor, Sie untersuchen auf "Treiberoptionen" Argument für BindParam() vielleicht würde es helfen.

Es gibt Fälle, in denen das Problem auftreten kann.

+0

Ich war nicht in der Lage, eine Möglichkeit zu finden, MSSQL-spezifische Optionen in PHP unter Linux zu kompilieren. = [ –

1

Heute bekomme ich die gleiche Art von Problem. Ich habe etwas wie: Ungültiger Zeichenwert für Cast-Spezifikation: 206 [Microsoft] [ODBC-Treiber 13 für SQL Server] [SQL Server] Operandentyp Konflikt: Text ist nicht kompatibel mit Int.

ich PHP 7.0 mit PDO mit Microsoft ODBC auf Linux CentOS 7 mit einer Verbindungszeichenfolge verwenden wie:

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

Um das Problem zu beheben, wird genau Stored proc param Fall erforderlich.

Gespeicherter proc param @CustomerID int wird mit "ID" definiert, dann müssen Sie @CustomerID =? und nicht @CustomerID = ...

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

aussehen wie die Fahrer versuchen, den Zieltyp, um herauszufinden, um proc Argument sucht Groß- und Kleinschreibung Übereinstimmung mit.

+0

Es ist schon eine Weile her, seit ich diese Frage gestellt habe, danke für die Antwort! Leider habe ich seither den Arbeitgeber gewechselt und habe daher keine Möglichkeit zu überprüfen, ob dies das Problem in diesem speziellen Projekt lösen würde. Ich habe deine Antwort jedoch an einen ehemaligen Kollegen weitergeleitet. Habe eine Verbesserung! –