2013-06-04 76 views
1

我設法執行原始SQL(即沒有ResultSetMapping)並且可以調用並執行MSSQL存儲過程。Symfony2 Doctrine原始SQL存儲過程通過多個結果集循環

我的代碼如下:

$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返回多個結果集,則上面只返回第一個結果集。有什麼方法可以循環訪問並獲取每個結果集?

回答

0

確定我能做到這一點,但我不得不創建圍繞連接我自己的包裝:

它是一種在最好的情況下工作,但代碼基本上使用conf.yml中的DBAL參數創建一個新的PDO連接。它們準備並執行語句並返回所有結果集。

代碼是免費使用這裏: https://github.com/scott-davidjones/Symfony2DBALSPWrapper

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()); 
+0

感謝您的答覆,我試過,但沒有運氣:(王建宇,山西高等學校認爲這可能是從MS的PDO_SQLSRV驅動程序的工作方式..你還挺有爲了做到'''sqlsrv_next_result'''到移動到下一個結果集,但不知道如何在symfony2/doctrine2 –

+0

中做到這一點你不能只是從類似於我已經改變了我的答案在上面使用你的代碼從你的包裝代碼內做到這一點? – Chausser

+0

不幸的不是nextRowset()在Doctrine中不存在或者至少我無法讓它工作.. –

0

我不得不處理類似的問題,這是我想出了。該功能來自擴展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; 
    } 
}