PDO与MSSQL驱动程序如何获取输出参数?

时间:2013-12-10 09:15:30

标签: php sql-server pdo freetds

PDOMSSQL driver一起使用时,您实际上使用FreeTDS作为低级别驱动程序。有一些不同的方法可以执行存储过程 - 语言查询RPC call

FreeTDS还支持TDS协议版本4.2和7.x.它们之间的主要区别之一是存储过程调用的行为。 Microsoft将协议4.2的行为更改为7.0 不从语言查询返回输出参数。 语言查询主要将文本查询发送到包含在TDS数据包中的服务器。

使用PDO(来自php.net

进行语言查询的示例
    $stmt = $dbh->prepare("CALL sp_takes_string_returns_string(?)");
    $value = 'Hello!';
    $stmt->bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000); 
    $stmt->execute();
    print "The output is $value\n";

实际上你会发送类似“EXEC sp_takes ....”的内容。如果您使用MSSQL运行上面的示例,您将获得TDS7.х中的空输出参数和4.2的预期结果。为什么我们不能使用4.2并且开心?它有很多limitations

    当然,只有
  • ASCII。
  • 不支持RPC和BCP。
  • varchar字段限制为255个字符。如果您的表定义了更长的字段,它们将被截断。
  • 不支持动态查询(也称为prepared statements)。

所以,4.2不是变种。

RPC调用示例(来自php.net odbtp extension

    $stmt = mssql_init('sp_takes_string_returns_string');
    $value = 'Hello!';
    mssql_bind($stmt, 1, $value, SQLVARCHAR, true,  false,   4000);
    mssql_execute($stmt);
    print "The output is $value\n";

使用上面的示例和php中的本机mssql扩展,您可以使用TDS 7.2获得正确的结果。实际上,您使用该代码发送二进制RPC数据包。

问题

是否有办法使用PDO和MSSQL驱动程序对存储过程进行RPC调用?

2 个答案:

答案 0 :(得分:2)

当我第一次回答时,我或者错过了FreeTDS,或者这个问题已经更新了。 无论哪种方式......

FreeTDS不支持MSSQL Server 7 SP3或更高版本中的输出参数。这是由于SQL Server中的更改。

---以下的旧回应---

我知道这并不是你想要的 我经历了一些旧文件到我唯一一次链接到MSSQL并将其拉出来。

igraph

我希望这会有所帮助

答案 1 :(得分:-4)

试试这个

 try {
    $hostname = "myhost";
    $port = 10060;
    $dbname = "tempdb";
    $username = "dbuser";
    $pw = "password";
    $dbh = new PDO ("dblib:host=$hostname:$port;dbname=$dbname","$username","$pw");
  } catch (PDOException $e) {
    echo "Failed to get DB handle: " . $e->getMessage() . "\n";
    exit;
  }
  $stmt = $dbh->prepare("select name from master..sysdatabases where name = db_name()");
  $stmt->execute();
  while ($row = $stmt->fetch()) {
    print_r($row);
  }
  unset($dbh); unset($stmt);