Без каких-либо параметров он будет работать нормально, но когда есть параметры, появляется следующая ошибка:
SQLSTATE [42000]: ошибка синтаксиса или нарушение доступа: 8018 [Microsoft] [драйвер ODBC 11 для SQL Server] [SQL Server] Недопустимый параметр 4 (''): Тип данных 0x23 – это устаревший большой объект или LOB, но отмечен как выходной параметр. Устаревшие типы не поддерживаются в качестве выходных параметров. Используйте текущий большой объект t (SQLExecute [8018] в /builddir/build/BUILD/php-5.3.3/ext/pdo_odbc/odbc_stmt.c:254)
Это работает на Centos 6, ODBC Driver 11 для 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
Наконец, я нашел решение для этого, драйвер Microsoft разработан для приложений C или C ++, а привязка параметров PDO не работает должным образом. Если вы передаете параметры без использования PDO, все будет работать так, как ожидалось. Замените на @paravalue = N'".$v1."'
Пример для примера – нормальное связывание параметров – SQLBindParameter
параметра PDO SQLBindParameter
– $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'];