我正在编写一个程序,它使用ADO.NET的SqlCommand来执行许多用户提供的批量T-SQL语句。
我的应用程序打开一个事务,其中执行所有语句以确保如果执行任何错误,则回滚整个批次。
我遇到的问题是,在用户提供的SQL中放置错误的COMMIT(没有匹配的BEGIN TRAN)将提交我的所有重要事务并让我无法回滚。
有没有人有任何想法如何阻止用户的SQL搞乱我的事务,但仍然允许他们BEGIN / COMMIT / ROLLBACK他们自己的嵌套事务?
答案 0 :(得分:5)
用户的SQL需要更正 - 如果它放置了错误的COMMIT(或ROLLBACK),那么我将其归类为需要修复的错误。我不太了解你的场景的具体细节,但我认为这正是你需要做的。如果你发现自己试图实施一种解决方法,那就是警报应该响起,因为它只会使系统更复杂/更难维护。
答案 1 :(得分:1)
您能否以编程方式检查加载到SqlCommand中的每个T-SQL语句以获取单词COMMIT,以便您可以标记运行该T-SQL的潜在问题。
也许将它们存档到某个地方可以手动查看。
答案 2 :(得分:1)
您可以在distributed transaction中登记SqlCommand。那些不能在数据库中使用COMMIT语句提交。请参阅Connection对象的EnlistDistributedTransaction方法。
分布式事务引入了一类全新的性能和可靠性问题。如果你可以像AdaTheDev建议的那样修复T-SQL批次,那将是一个更好的选择。