PHP PDO MSSQL存储过程

时间:2015-09-25 04:40:28

标签: php stored-procedures pdo odbc

我在尝试使用PHP PDO在MSSQL2000上运行存储过程时遇到问题。我已经尝试了所有组合,但除了无效的游标状态错误之外,无法获得任何结果。

该过程位于另一个应用程序使用的数据库中。我只是伸手去抓取信息,以便在PHP上显示。因此,修改存储过程(甚至改为SET NOCOUNT ON)是禁止的。

存储过程有两个参数 - 开始日期和结束日期。还有一个RETURN_VALUE参数。

我可以在SQL查询分析器中运行以下命令并转储数据行:

EXEC [availability_enquiry] '08-24-2015 0:0:0.000', '08-26-2015 0:0:0.000'

看起来非常直接,但是当我尝试编码并运行它时,我得到的只是:

$dbConn = null;
$connectionString = sprintf('%s:Driver=%s;Server=%s;Database=%s;TrustedConnection=yes;', 'odbc', '{SQL Server Native Client 10.0}', 'mypc', 'testdb');
$dbConn = new PDO($connectionString, 'root', '123qew');
$dbConn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$sql = "EXEC [availability_enquiry] '08-24-2015 0:0:0.000', '08-26-2015 0:0:0.000'";
$stmt = $dbConn->query($sql, PDO::FETCH_ASSOC);
$data = $stmt->fetch();
print_r($data); 

我得到了一个PDO Expection:'stmt-> fetch()行上的'无效游标状态'。

$stmt = $dbConn->prepare($sql);
$stmt->execute();
$data = $stmt->fetch();
print_r($data); 

仍然得到一个PDO Expection:'无效的游标状态'。必须与fetch有关。尝试别的东西:

$data = array();
do {
  $results[count($results)] = $stmt->fetchAll(PDO::FETCH_ASSOC);
}
while($stmt->nextRowset());

仍然没有!?有什么想法吗?

UPDATE1:

尝试了另一种方法:

$sql = "{CALL availability_enquiry (:startdate, :enddate)}";
$stmt = $dbConn->prepare($sql);
$startdate = "2015-08-24T00:00:00";
$enddate = "2015-08-26T00:00:00";
$stmt->execute(array(
  ':startdate'=>$startdate,
  ':enddate'=>$enddate
));
$data = $stmt->fetch();
print_r($data); 

也尝试过:

$startdate = "2015-08-24T00:00:00";
$stmt->bindParam(':startdate', $startdate, PDO::PARAM_STR);
$enddate = "2015-08-26T00:00:00";
$stmt->bindParam(':enddate', $enddate, PDO::PARAM_STR);
$stmt->execute();

但两者都给我一个'无效的转换规范字符值'错误消息。用我自己和新建议的日期格式试了一下。

如果我使用与存储过程使用的表中相同的日期格式:

$startdate = "2015-08-11 09:42:18.890";

我收到“无效的游标状态”错误消息。我希望这更近一步了?

0 个答案:

没有答案