我得到了下表:
CREATE TABLE [dbo].[TestDB] (
[col1] INT NOT NULL,
[col2] VARCHAR(50) NOT NULL
);
现在我想添加条目:
$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,将打印消息并终止脚本。
我的问题
如果我想添加多个条目,我会同时发送所有查询。
$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,查询将一直执行到出现错误为止。
我的问题:
- 如何随时检查查询是否失败
- 如何确保查询要么完整执行,要么根本不执行
您的transaction必须在出现任何错误时回滚。
在事务开始时使用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"; ...