2016-07-28 44 views
2

我已经成功地使我的symfony应用程序使用realestateconz/mssql-bundle和免费TDS连接到MSSQL数据库。PDO dblib没有捕获警告

我的问题是,当我尝试执行一个存储过程时,该过程抛出一个异常,如果出现问题,但PDO报告什么都没有回来。

如果我使用mssql_ *函数做同样的事情,我会从MSSQL得到正确的错误消息的警告。

什么是PDO的做法不同?

下面是两个代码示例;

//PDO Version 
try { 
    $conn = new PDO($dsn, $user, $pass); 
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
} catch (PDOException $e) { 
    var_dump($e->getMessage()); 
    die; 
} 

$stmt = $conn->prepare("INSERT INTO importex_parteneri (id_importex, cif_cnp, denumire) VALUES (1, 9671891, 'Nexus Media')"); 
$result = $stmt->execute(); 
var_dump($result); //true 

$stmt = $conn->prepare("exec dbo.importex_parteneri_exec 1"); 
$result = $stmt->execute(); 
var_dump($result); //true 

的mssql_ *例如

$connection = mssql_connect($server, $user , $pass); 
mssql_select_db($nexus_bazadate, $connection); 

$result = mssql_query("INSERT INTO importex_parteneri (id_importex, cif_cnp, denumire) VALUES (1, 9671891, 'Nexus Media')"); 
var_dump($result); 

$result = mssql_query("exec dbo.importex_parteneri_exec 1"); 
var_dump($result); 

/* 
* The output is 
* 
* bool(true) 
PHP Warning: mssql_query(): message: Error 50000, Level 16, State 1, Procedure importex_parteneri_exec, Line 181, Message: PRT012 - Eroare import par9671891 (severity 16) in /home/vagrant/cv.dev/web/test.php on line 19 
PHP Warning: mssql_query(): General SQL Server error: Check messages from the SQL Server (severity 16) in /home/vagrant/cv.dev/web/test.php on line 19 
bool(true) 
*/ 
SOLUTION

我最终加入了wraper各地PDO ::执行函数功能

execute(\PDOStatement $stmt, array $params = array()) 
{ 
    $result = $stmt->execute($params); 

    $err = $stmt->errorInfo(); 
    switch ($err[0]) { 
     case '00000': 
     case '01000': 
      return true; 
     default: 
      //case HY000 
      return false; 
    } 
} 

回答

2

我可能是错的,但我不知道回想一下以某种自动化方式处理PDO中SQL警告的本地方式。根据user comment您可以手动测试的SQLSTATE错误代码,这将是:

  • '00000'(成功)
  • '01000'(成功与警告)

如果它的实际工作,这是当然很烦人要手动做。如果你在PDO之上有一个自定义层,你可以在你的自定义exec方法中做到这一点。

+0

谢谢。我仍然很奇怪,在errInfo中,我得到HY000 SQL状态,错误代码为50000,消息为General SQL Server错误:检查来自SQL Server [50000](严重性16)[(null)]的消息。 但是,PDO说没关系。 – Stev

+0

请记住,我们正在谈论**警告**。如果他们造成脚本中止,他们就不会如此行事。 –

+1

我收到的SQL状态是HY000,它是一般的SQL Server错误。所以这不是SQL方面的警告。 PDO应该将其视为错误。 (dbutil.c:85):_ dblib_handle_info_message(0x2ee1b20,0x4347450,0x7ffd5cd22bf0) 10:53:06.860421 3782(dbutil.c:86):msgno 50000可能是免费的TDS可以处理这个错误: 10:53:06.860418 3782 :“错误50000,级别16,状态1,过程importex_parteneri_exec,行23,消息:PRT001 - Eroare导入parteneri:Lipsa日期” – Stev