使用PHP PDO Dblib插入MSSQL时出现此错误
退出信号apache错误日志中的分段错误
当我检查免费的tds日志时,错误是
ROLLBACK TRANSACTION请求没有相应的BEGIN TRANSACTION
然而,这只发生在特定情况下,即我有一个浮点数据类型的字符串。以下是我的代码:
$conn = new PDO('dblib:host=hostname;dbname=mydbname', 'user', 'password');
$conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$conn->beginTransaction();
$query = 'INSERT INTO [TestTable] ([RecordNo], [Paymode], [VATVALUE])
VALUES (:RecordNo, :Paymode, :VATVALUE)';
$stmt = $conn->prepare($query);
try {
$stmt->execute( [":VATVALUE" => "158.4'", ":Paymode" => "CREDIT",
":RecordNo" => "ABC-312735"] );
$conn->commit();
} catch(PDOException $e) {
$conn->rollback();
}
请注意我将其设置为
的增值税值158.4'
用于复制错误。但是,当我删除交易语句时,它会抛出正确的错误,即
将数据类型varchar转换为float
时出错
有趣的是,如果我在语句中指定了错误的列名,beginTransaction()工作正常。该事务不仅适用于此转换错误和抛出信号分段错误。
我在ubuntu 16.04中使用PHP 7.0。想知道为什么回滚在所有情况下都能正常工作,比如错误的列名或表名,但在转换情况下却没有。
答案 0 :(得分:4)
SQL Server中存在错误会自动回滚您的事务,并且在此之后尝试回滚是错误的。而不是
$conn->rollback();
尝试执行批处理
if @@trancount>0 rollback;
我不知道PHP,但也许是这样的:
$conn->prepare("if @@trancount>0 rollback;")->execute();