我已成功使用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;
}
}
答案 0 :(得分:2)
我可能错了,但我不记得在某种程度上以某种方式自动化方式看到以PDO方式处理SQL警告的原生方式。根据{{3}},您可以手动测试SQLSTATE错误代码,它将是:
'00000'
(成功)'01000'
(警告成功)如果它确实有效,那么手工操作当然很烦人。如果您在PDO上有自定义图层,则可以始终使用自定义exec方法执行此操作。