2013-08-26 12 views
1

이면 오류가 발생하지만 매개 변수가 없어도 매개 변수가 있으면 다음 오류가 발생합니다.PHP가있는 RedHat Linux에서 SQL Server® 용 Microsoft® ODBC 드라이버 11 - 저장 프로 시저 용 PDO와 바인드 매개 변수가

SQLSTATE [42000] : 구문 오류 또는 액세스 위반 : 8018 [Microsoft] [SQL Server 용 ODBC 드라이버 11] [SQL Server] 잘못된 매개 변수 4 ('') : 데이터 형식 0x23은 사용되지 않는 대형 개체 또는 LOB입니다. 출력 매개 변수로 표시됩니다. 사용되지 않는 유형은 출력 매개 변수로 지원되지 않습니다. 대한이 를 CentOS 6에서 실행되는 현재의 큰 개체 t (/builddir/build/BUILD/php-5.3.3/ext/pdo_odbc/odbc_stmt.c:254에서 SQLExecute를 [8018])

, ODBC 드라이버 (11)를 사용하여 SQL Server® - 레드햇 리눅스, 인 unixODBC - 2.3.0, MSSQL 서버 2008 R2

연결 문자열 : 사용

$con = new PDO("odbc:dsnName", 'sa','saa'); 
    $con->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); 
    $con->setAttribute(\PDO::ATTR_DEFAULT_FETCH_MODE, \PDO::FETCH_ASSOC); 

샘플 저장 프로 시저 :

$stmt = $con->prepare("SET NOCOUNT ON DECLARE @return_value int 

    EXEC @return_value = [sp_insert_into_t_contact_test] 
    @paravalue = ? 

    SELECT 'returnV' = @return_value"); 
    $stmt->bindParam(1, $v1 = 5, PDO::PARAM_STR, 100); 
    $stmt->execute(); 
    $return =$stmt->fetch(); 
    echo $return['returnV']; 

간단한 저장 프로 시저가 "123"

[dbo].[sp_insert_into_t_contact_test] 
     @paravalue varchar(100) 
    AS 
    return 123 

추가 정보 돌아갑니다 -

[dsnName] 
    Driver=SQL Server Native Client 11.0 
    Description=My Sample ODBC Database Connection 
    Trace=Yes 
    Server=192.168.2.60 
    Port=1433 
    Database=NSCDB_3 

ODBCINST.INI

[SQL Server Native Client 11.0] 
    Description=Microsoft ODBC Driver 11 for SQL Server 
    Driver=/opt/microsoft/msodbcsql/lib64/libmsodbcsql-11.0.so.2270.0 
    Threading=1 
    UsageCount=1 

답변

1

마지막으로 나는 해결책을 발견 - odbc.ini 파일이

이를 위해 Microsoft 드라이버는 C 또는 C++ 응용 프로그램 용으로 개발되었으며 PDO 매개 변수 바인딩은 문제가되지 않습니다. k 예상대로. PDO을 사용하지 않고 매개 변수 을 전달하면 모든 것이 예상대로 작동합니다. @paravalue = N'".$v1."'

포어 예로 교체 - 일반 매개 변수 바인딩 - SQLBindParameter PDO 매개 변수 바인딩 - $stmt->bindParam(1, $v1 = 5, PDO::PARAM_STR, 100);

수정 대구 단편 :

 $stmt = $con->prepare("SET NOCOUNT ON DECLARE @return_value int 

     EXEC @return_value = [sp_insert_into_t_contact_test] 
     @paravalue = N'".$v1."' 

     SELECT 'returnV' = @return_value"); 
     $stmt->execute(); 
     $return =$stmt->fetch(); 
     echo $return['returnV'];