PDO dblib没有捕获警告

时间:2016-07-28 09:00:39

标签: php sql-server pdo

我已成功使用realestateconz / mssql-bundle和Free TDS将我的symfony app连接到MSSQL数据库。

我的问题是,当我尝试执行存储过程时,如果出现问题,该过程会抛出异常,但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)
 */

我最终在PDO :: execute function function

周围添加了一个包装器
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;
    }
}

1 个答案:

答案 0 :(得分:2)

我可能错了,但我不记得在某种程度上以某种方式自动化方式看到以PDO方式处理SQL警告的原生方式。根据{{​​3}},您可以手动测试SQLSTATE错误代码,它将是:

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

如果它确实有效,那么手工操作当然很烦人。如果您在PDO上有自定义图层,则可以始终使用自定义exec方法执行此操作。