通过Zend Framework执行MSSQL存储过程

时间:2010-09-17 03:54:47

标签: php sql sql-server zend-framework stored-procedures

请求: 请给我一个工作示例,说明如何使用Zend Framework从MSSQL服务器上的存储过程中检索(在数组中?)返回的行,并将参数传递给存储过程。

说明: 我在ZF文档中找不到关于如何在MSSQL服务器上执行SP的任何内容。我知道通过普通的PHP可以实现。但是,由于我的项目使用ZF,我不想有额外的代码来打开与服务器等的连接等。通过ZF代码挖掘我看到的东西,如“bindParam”和“执行”和“准备”。但是我不知道这些是如何工作的,或者我对它们的处理方式。因此,对所请求的示例代码的一些解释当然非常好。

顺便说一句,我正在使用Zend_Db_Adapter_Pdo_Mssql。

谢谢!

5 个答案:

答案 0 :(得分:1)

这是我在Debian上使用php5-sybase驱动程序所做的。这是普通的PHP,所以可能这不是你想要的,但也许它会给你一些线索。即使通过普通PHP做到这一点对我来说也是非常棘手的!

<?php

$db = mssql_connect('vm8', 'user', 'password');
mssql_select_db('myDatabase', $db); 
$stmt = mssql_init('dbo.usp_square_input', $db);

$var = 9;
mssql_bind($stmt, '@x', $var, SQLINT1, false, false, 50);
$result = mssql_execute($stmt);
if ($result) {
  $row = mssql_fetch_array($result, MSSQL_NUM);
  echo $row[0];
  mssql_free_result($result);
}

?>

注意:“vm8”这个东西来自一个名为/etc/freetds/freetds.conf的文件,除非我在那里创建“vm8”别名,否则什么都不会有效。

没有工作(虽然非SP的东西很好!?!?!)。

$db = mssql_connect('192.168.8.8', 'user', 'password');

但是我在/etc/freetds/freetds.conf中创建了“vm8”部分(我自己的名字)之后就像这样....

[vm8]
    host = 192.168.8.8
    port = 1433
    tds version = 8.0

然后,一旦我更改了连接主机名以使用该部分标题,我的存储过程就起作用了:

$db = mssql_connect('vm8', 'user', 'password');

呼。

这里的参考是我的SP:

CREATE PROCEDURE [dbo].[usp_square_input] 
   @x bigint
AS 
SELECT @x * @x AS squared ;

答案 1 :(得分:1)

好的,花了几个小时挖掘问题后我想出了以下代码 - 我不使用纯PHP,仍然相应地使用框架。 Seens很好并且运行正常,我甚至还得到了结果集!希望它有所帮助:

class Model_DbTable_Cases extends Zend_Db_Table_Abstract 
{
  // ... code ...

public function addRelocationServiceCase($maincase_id, $product_id)
{
  try {
    $stmt = $this->getAdapter()->prepare("EXEC Web_AddRelocationCase ?, ?");    

    $stmt->bindParam(1, $maincase_id, PDO::PARAM_STR);
    $stmt->bindParam(2, $product_id, PDO::PARAM_STR);
    $stmt->execute();

    $rows = $stmt->fetchAll();

    die(var_dump($rows));
    Zend_Debug::dump($rows);

    $stmt->closeCursor();
  }
  catch (Zend_Db_Adapter_Exception $e) {
    print $e->__toString();
  }
  catch (PDOException $e) {
    print $e->__toString();
  }
  catch (Zend_Exception $e) {
    print $e->__toString();
  }     
}
}   

答案 2 :(得分:0)

不是这样的吗?

$statement = $adapter->prepare("yourSpHere()");
$statement->execute();
$results = $statement->fetchAll();

答案 3 :(得分:0)

我很遗憾地说你无法在ZF AFAIK的当前状态下运行存储过程 为什么......看看这里

  

缺少什么?

     

长跑如何?   功能请求Zend Db,比如   存储过程,字符集和   支持无法运行的查询   准备好了吗?关于什么   澄清a之间的区别   模型和数据层?

来源:http://www.phparch.com/2010/06/25/zend-db-2-0-kicks-off/

更新: 在我回答你之后,我从谷歌获得了这个链接,我认为值得一提

http://zend-framework-community.634137.n4.nabble.com/mssql-pdo-lastInsertID-with-a-stored-procedure-td672685.html

答案 4 :(得分:0)

当你说没有来自MS SQL STORED PROC的结果时 - 它是不正确的(如果它当然返回任何值)。

但如果存在此类操作,它还会返回插入,更新或删除的应用计数。

如果你在过程开始时制作临时表 - 试着猜猜你会得到什么。

所以你需要在proc的前面插入SET NOCOUNT ONN,不要返回这样的结果。