我有下表:
CREATE TABLE [dbo].[TestDB] (
[col1] INT NOT NULL,
[col2] VARCHAR(50) NOT NULL
);
现在我想添加entrys:
$params=array(123,'someString');
$sql = "insert into testDB values(?,?)";
$stmt = sqlsrv_query( $conntask, $sql ,$params);
if( $stmt === false) {
echo $sql;
print_r($params);
die( print_r( sqlsrv_errors(), true) );
}
如果出现错误,$ stmt将为false,将打印该消息并终止脚本。
如果我想添加多个entrys,我会同时发送所有查询。
$params=array(123,'someString','notANumber','someOtherString');
$sql = "insert into testDB values(?,?) insert into testDB values(?,?)";
$stmt = sqlsrv_query( $conntask, $sql ,$params);
if( $stmt === false) {
echo $sql;
print_r($params);
die( print_r( sqlsrv_errors(), true) );
}
在此示例中,第一个插入将成功,第二个插入将失败,因为我尝试将字符串放入int列。
现在$ stmt不是false,并且在错误发生之前执行查询。
答案 0 :(得分:2)
您的转型必须在任何错误时回滚。
在事务开始时使用 SET XACT_ABORT ON
命令,然后添加BEGIN TRANSACTION
命令可以解决您的问题。
SMSS方面的用法
SET XACT_ABORT ON;
BEGIN TRANSACTION
-- your queries here
COMMIT TRANSACTION
PHP方面的用法
...
$sql = "SET XACT_ABORT ON; " .
"BEGIN TRANSACTION " .
"insert into testDB values(?,?) insert into testDB values(?,?)" .
"COMMIT TRANSACTION";
...