Хранимая процедура PHP-SQLSRV с входной переменной типа `bit` - PullRequest
1 голос
/ 24 октября 2011

Мне нужно портировать проект на основе LAMP, который использует PHP-MSSQL для подключения к базе данных SQL Server. Он должен быть перенесен на компьютер на основе WAMP, который использует PHP-SQLSRV для подключения к базе данных SQL Server.

Я могу получить / установить данные, выполнив хранимые процедуры. Кажется, что большинство типов входных переменных довольно просто начать работать. Но я не могу заставить работать входные параметры типа bit.

Я пытался использовать различные значения в PHP, которые являются «правдивыми» или «ложными», но ни одно из них не поможет мне избежать ошибки:

  • «правдивые» вещи, которые не работали:

    • 1
    • "1"
    • true
    • "True"
  • «ложные» вещи, которые не работали:

    • 0
    • "0"
    • false
    • "False"

Я пытался использовать различные способы добавления элемента в массив $params, в том числе опуская необязательные аргументы, а также определяя типы данных PHP и SQL. Ничего не работает.

Мое сообщение об ошибке от SQL Server (преобразованное в объект JSON):

[{
  "0":"42000",
  "SQLSTATE":"42000",
  "1":8114,
  "code":8114,
  "2":"[Microsoft][SQL Server Native Client 10.0][SQL Server]Error converting data type varchar to bit.",
  "message":"[Microsoft][SQL Server Native Client 10.0][SQL Server]Error converting data type varchar to bit."
}]

Чтобы сгенерировать это сообщение об ошибке, я передал значение 0 или 1, ни одно из которых не является varchar или даже строкой.

Для обеспечения максимальной совместимости я не хочу изменять хранимую процедуру для преобразования / преобразования данных на SQL Server. Я хочу, чтобы это работало из PHP, сохраняя хранимую процедуру без изменений.


PHP код:

<?php
  $link = sqlsrv_connect($host,Array("Database"=>$database,"UID"=>$username,"PWD"=>$password));
  $sql = " { call StoredProcedureName ( @input_param_of_bit_type=? ) } ";
  $param1 = 1;
  $params = Array(
    Array(&$param1, SQLSRV_PARAM_IN)
  );
  $stmt = sqlsrv_prepare($link,$sql,$params);
  if ($stmt===false) {
    // handle error
    print_r(sqlsrv_errors,true);
  } else {
    if (sqlsrv_execute($stmt)===false) {
      // handle error.  This is where the error happens
      print_r(sqlsrv_errors,true);
    } else {
      // success! It never gets here, though.
    }
  }
?>

Ответы [ 2 ]

1 голос
/ 25 октября 2011

Переупорядочение порядка именованных параметров сделало эту работу.Мне пришлось использовать программное обеспечение SQL Server Management Studio и Profile Tracing, чтобы увидеть, чем отличается выполнение хранимой процедуры из php-sqlsrv от выполнения ее непосредственно из SQL Server Management Studio.

После ввода входных параметровв точном порядке, используемом SQL Server Management Studio, все работало нормально.

0 голосов
/ 25 октября 2011

Похоже, что T-SQL выше использует строковый тип по умолчанию, который отправляется на сервер способом, который не преобразуется.Лучшее решение - указать PHPTYPE и SQLTYPE в параметре:

$params = Array( Array(&$param1, SQLSRV_PARAM_IN, SQLSRV_PHPTYPE_INT, SQLSRV_SQLTYPE_BIT) );

Пожалуйста, попробуйте это изменение и посмотрите, правильно ли выполняется ваш запрос.

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...