C# 执行批处理 SQL 命令,捕获异常,然后继续批处理的其余部分

本文关键字:批处理 余部 继续 捕获异常 执行 SQL 命令 然后 | 更新日期: 2023-09-27 17:56:14

我正在使用SQLConnection和命令在C#中执行批处理SQL命令。我需要能够知道哪个语句失败,但由于性能问题,我无法一次执行一个语句。在 C# 中有什么方法可以执行批处理 SQL 语句,并在失败的情况下告诉我哪个语句失败(索引、id 或任何内容,以便我知道是哪一个),然后继续执行其余语句。

谢谢

C# 执行批处理 SQL 命令,捕获异常,然后继续批处理的其余部分

您没有提到您正在使用的数据库,但如果您使用的是 SQL Server 2005 或更高版本,则可以为此使用 try/catch。 下面是一个示例。

BEGIN TRY
    select 1/0
END TRY
BEGIN CATCH
    SELECT 'statement 1 failed' AS Statement,ERROR_MESSAGE() as ErrorMessage,ERROR_SEVERITY() AS Severity;
END CATCH
BEGIN TRY
    select 1.0/2
END TRY
BEGIN CATCH
    SELECT 'statement 2 failed' AS Statement,ERROR_MESSAGE() as ErrorMessage,ERROR_SEVERITY() AS Severity;
END CATCH

在这种情况下,我捕获错误并仅将它们作为结果集返回,但是您可以在开始时创建一个临时表/变量,在发生错误时插入其中,然后在最后从该表中选择所有行。

编辑:下面是一个将在触发器中引发错误的示例:

create table csm (id int)
go
create trigger tr_i_csm on csm for insert as
declare @d int
select @d=sum(id) from inserted
if (@d>=10)
begin
 raiserror('error',@d,0)
end
go
BEGIN TRY
    BEGIN TRAN
    insert into csm values (5)
    COMMIT
END TRY
BEGIN CATCH
    ROLLBACK
    SELECT 'statement 1 failed' AS Statement,ERROR_MESSAGE() as ErrorMessage,ERROR_SEVERITY() AS Severity;
END CATCH
BEGIN TRY
    BEGIN TRAN
    insert into csm values(16)
    COMMIT
END TRY
BEGIN CATCH
    ROLLBACK
    SELECT 'statement 2 failed' AS Statement,ERROR_MESSAGE() as ErrorMessage,ERROR_SEVERITY() AS Severity;
END CATCH
BEGIN TRY
    BEGIN TRAN
    insert into csm values(2)
    COMMIT
END TRY
BEGIN CATCH
    ROLLBACK
    SELECT 'statement 3 failed' AS Statement,ERROR_MESSAGE() as ErrorMessage,ERROR_SEVERITY() AS Severity;
END CATCH
selecT * from csm

一种选择是在每个查询之后的批处理中包含print语句。然后,您可以查看输出以查找故障。(有关如何阅读本文的信息,请参阅此处)。

在以前的作业中,我们有许多通过 Sql 代理运行的夜间存储过程,以及一些用 C# 编写的其他非数据库作业,这些作业作为 Windows 计划任务运行。我们最终编写了一个 c# 程序来调用存储过程,而不是 Sql Agent,这样我们就可以将所有调度(和日志记录!)放在一个地方(调度任务)。我们还支持通过该程序执行 Sql 文件。接收打印消息输出是我们处理日志记录的方式。

当然,这意味着能够修改批处理脚本。这也意味着编写 sql,以便失败的语句不会终止整个作业。