1

我已经设法执行原始 SQL(即没有 ResultSetMapping),并且可以调用和执行 MSSQL 存储过程。

我的代码如下:

$em = $this->get('doctrine')->getManager();
$stmt = $em
    ->getConnection()
    ->prepare('EXEC someSP :id,null,:uid');
$stmt->bindValue('id', '629674');
$stmt->bindValue('uid', '217');
$stmt->execute();
$results = $stmt->fetchAll();

不,效果很好;但是我遇到的问题是,如果 SP 返回多个结果集,则上述仅返回第一个结果集。有没有办法循环并获取每个结果集?

4

3 回答 3

1

我不得不处理类似的问题,这就是我想出的。这个函数来自扩展 Doctrine\ORM\EntityRepository 的类,所以我可以访问 _em 属性,一般情况下你可以使用它$this->get('doctrine')->getManager();来获取实体管理器。

protected function execMultiSetQuery($query, $params, $connection = 'default') {
    // Init
    $conn = $this->_em
        ->getConnection($connection)
        ->getWrappedConnection();

    // Processing
    if ($conn instanceof \Doctrine\DBAL\Driver\PDOConnection) {
        $stmt = $conn->prepare($query);
        $stmt->execute($params);

        // Loop through the row sets
        $results = array();
        do {
            try {
                $results[] = $stmt->fetch(\PDO::FETCH_ASSOC);
            }
            catch (\Exception $e) {}
        } while($stmt->nextRowset());

        $stmt->closeCursor(); // Clean up
        return $results;
    }
    else {
        return false;
    }
}
于 2014-01-22T20:52:17.440 回答
0

您可以尝试逐个迭代每个集合。但实际上 fetchAll 应该和下面一样,尽管尝试一下不会有什么坏处......

$em = $this->get('doctrine')->getManager();
$stmt = $em
    ->getConnection()
    ->prepare('EXEC someSP :id,null,:uid');
$stmt->bindValue('id', '629674');
$stmt->bindValue('uid', '217');
$stmt->execute();
do{
    $results[] = $stmt->fetchAll()
} while($stmt->nextRowset());
于 2013-06-04T20:27:46.017 回答
0

好的,我能够做到这一点,但我必须围绕连接创建自己的包装器:

它充其量是一种解决方法,但代码基本上使用 conf.yml 中的 DBAL 参数创建一个新的 PDO 连接。他们准备并执行语句并返回所有结果集。

代码可在这里免费使用: https ://github.com/scott-davidjones/Symfony2DBALSPWrapper

于 2013-06-05T12:26:23.210 回答