0

我有一些命令,如插入、更新、创建等,我想在 SQL 实例的某个数据库中运行它们。我为此使用事务范围,即使发生一些错误,我也想在所有数据库上运行所有命令。如果发生了一些错误,我想在不提交正确命令的情况下向用户显示所有错误。但是在事务中,当它遇到第一个错误时,它将被回滚,我无法继续运行其他命令。我的命令是这样的:

using Trans as new TransactionScope

con.open()

for i as integer = 0 to n

Try
    com.commandtext = coms(i)
    com.executenonquery()

catch ex as exception
    errorCollection.add(ex.message) 
    continue for

end try

next

end using
4

2 回答 2

2

事务的工作方式是 SQL Server 实际上跟踪发生的任何错误。如果事务中发生任何错误,SQL Server 将声明事务错误,并且不允许在同一事务下发送任何进一步的命令。因此,即使 SQL 错误由应用程序中的 try/catch 块处理,事务在 SQL Server 上已经失败,因此在您发送下一个命令时将失败。

唯一可行的选择是基本上在事务中运行每个命令,然后回滚它们,无论它们是失败还是成功。如果一切都成功,那么您可以在一个大事务中运行它们并提交。不过,这只有在它们完全独立时才有效。

您最好的选择可能是解决它,基本上接受您可能只会遇到第一个错误。

于 2013-01-21T10:36:33.333 回答
2

将异常处理移到 SQL 中,请参阅异常处理和嵌套事务。确定可以安全处理哪些异常,必须进一步提出哪些异常以及可以安全忽略哪些异常。绝大多数例外情况不容忽视。即使是那些可能被忽略的,绝大多数人也必须考虑整个事务上下文,以免数据不一致。请注意,并非所有异常都可以通过回滚到保存点来处理,在已经销毁事务后会引发某些异常(例如死锁)。

总体而言,我会将您的要求归类为判断力极差的类别。

于 2013-01-21T10:51:04.640 回答