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;
}
}
谢谢。我仍然很奇怪,在errInfo中,我得到HY000 SQL状态,错误代码为50000,消息为General SQL Server错误:检查来自SQL Server [50000](严重性16)[(null)]的消息。 但是,PDO说没关系。 – Stev
请记住,我们正在谈论**警告**。如果他们造成脚本中止,他们就不会如此行事。 –
我收到的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