我已经使用 realestateconz/mssql-bundle 和免费 TDS 成功使我的 symfony 应用程序连接到 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)
*/
SOLUTION
我最终在 PDO::execute 函数周围添加了一个包装器
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;
}
}