我有一些像插入,更新,创建等命令,我想在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
答案 0 :(得分:2)
事务的工作方式是SQL Server实际上跟踪发生的任何错误。如果事务中发生任何错误,SQL Server会声明事务有故障,并且不允许在同一事务下发送任何进一步的表扬。因此,即使SQL错误由应用程序中的try / catch块处理,该事务在SQL Server上已经失败,因此在发送下一个命令时将失败。
唯一可行的选择是基本上在事务中运行每个命令,然后将它们回滚,无论它们是否失败并成功。如果一切都成功,那么您可以在一个大事务中运行它们并提交它。这只有在它们完全独立的情况下才有效。
你最好的选择可能是解决它,基本上接受你可能只会得到第一个错误。
答案 1 :(得分:2)
将异常处理移至SQL,请参阅Exception Handling and Nested Transactions。确定可以安全处理的异常以及必须进一步提高的内容以及可以安全忽略的内容。绝大多数异常都不能被忽略。即使是那些可能被忽略的,绝大多数也必须考虑整个事务上下文,以便它们不会使数据不一致。请注意,并非所有异常都可以通过回滚到保存点来处理,在已经破坏事务(例如死锁)之后会引发某些异常。
总的来说,我会将您的要求归类为非常糟糕的判断想法。