请求: 请给我一个工作示例,说明如何使用Zend Framework从MSSQL服务器上的存储过程中检索(在数组中?)返回的行,并将参数传递给存储过程。
说明: 我在ZF文档中找不到关于如何在MSSQL服务器上执行SP的任何内容。我知道通过普通的PHP可以实现。但是,由于我的项目使用ZF,我不想有额外的代码来打开与服务器等的连接等。通过ZF代码挖掘我看到的东西,如“bindParam”和“执行”和“准备”。但是我不知道这些是如何工作的,或者我对它们的处理方式。因此,对所请求的示例代码的一些解释当然非常好。
顺便说一句,我正在使用Zend_Db_Adapter_Pdo_Mssql。
谢谢!
答案 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/
更新: 在我回答你之后,我从谷歌获得了这个链接,我认为值得一提
答案 4 :(得分:0)
当你说没有来自MS SQL STORED PROC的结果时 - 它是不正确的(如果它当然返回任何值)。
但如果存在此类操作,它还会返回插入,更新或删除的应用计数。
如果你在过程开始时制作临时表 - 试着猜猜你会得到什么。
所以你需要在proc的前面插入SET NOCOUNT ONN,不要返回这样的结果。