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

C# 执行批处理SQL命令,捕获异常,然后继续批处理的其余部分,c#,sql,database,batch-processing,C#,Sql,Database,Batch Processing,我正在使用SQLConnection和command在C中执行批处理SQL命令。我需要知道哪条语句失败了,但由于性能问题,我不能一次做一条。在C语言中是否有任何方法可以执行一个批处理SQL语句,如果失败,请告诉我哪个语句没有通过索引、id或其他任何语句,这样我就可以知道是哪个语句,然后继续执行其余语句 谢谢您没有提到您正在使用的数据库,但是如果您使用的是SQL Server 2005或更高版本,您可以使用try/catch来实现此目的。这里有一个例子 BEGIN TRY select 1

我正在使用SQLConnection和command在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
一种选择是在每次查询后的批处理中包含打印语句。然后可以查看输出以查找故障。有关如何阅读此内容的信息,请参阅

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


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

C SqlConnection意味着sql Server。其他任何东西都会有一个不同的连接对象:OleDbConnection、ODBConnection、MySqlConnection等等。所以,基本上,你在每个语句周围都放了一个try catch?另外,正如我提到的,如果有任何方法可以在C中实现这一点,请告诉我。我怀疑这会很难改变implementation@TeddyBlack是的,差不多。然后,您可以控制在发生错误时的操作。@TeddyBlack我认为C没有任何本机支持您的场景。您回答问题的方式让我觉得您已经在创建SQL,以便在将其提供给SqlCommand之前手动执行,因此向SQL添加try/catch可能是您最好的选择。@csm8118听起来是个不错的主意。在将SQL语句添加到SQLCommand之后,是否有方法创建SQL语句?我不知道你说的那句话是什么意思。是的,我需要它来跟踪哪些失败了,但我也不希望它在一个失败时终止。