1

パラメータがなくても問題なく動作しますが、パラメータがある場合は次のエラーが発生します-

SQLSTATE[42000]: 構文エラーまたはアクセス違反: 8018 [Microsoft][SQL Server 用 ODBC ドライバー 11][SQL Server]無効なパラメーター 4 (''): データ型 0x23 は非推奨のラージ オブジェクトまたは LOB ですが、マークされています出力パラメータとして。非推奨の型は、出力パラメーターとしてサポートされていません。現在のラージ オブジェクト t を使用します (SQLExecute[8018] at /builddir/build/BUILD/php-5.3.3/ext/pdo_odbc/odbc_stmt.c:254)

これは、Centos 6、ODBC Driver 11 for SQL Server® - RedHat Linux、unixODBC-2.3.0、MSSQL Server 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

追加情報 -

odbc.ini ファイル -

   [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
4

1 に答える 1

1

最後に、これに対する解決策を見つけました.MicrosoftドライバーはCまたはC++アプリケーション用に開発されており、PDOパラメーターバインディングは期待どおりに機能しません. 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'];
于 2013-08-27T08:12:01.193 に答える