C# 执行批处理 SQL 命令,捕获异常,然后继续批处理的其余部分
本文关键字:批处理 余部 继续 捕获异常 执行 SQL 命令 然后 | 更新日期: 2023-09-27 17:56:14
我正在使用SQLConnection和命令在C#中执行批处理SQL命令。我需要能够知道哪个语句失败,但由于性能问题,我无法一次执行一个语句。在 C# 中有什么方法可以执行批处理 SQL 语句,并在失败的情况下告诉我哪个语句失败(索引、id 或任何内容,以便我知道是哪一个),然后继续执行其余语句。
谢谢
您没有提到您正在使用的数据库,但如果您使用的是 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,以便失败的语句不会终止整个作业。