2011-08-12 157 views
3

我正在使用连接到数据库的应用程序。如果某些数据库操作失败,我肯定希望进行回滚。我只是想知道,哪个事务+ try-catch更好用,SQL或VB.NET?SQL Transaction + Try-catch或VB.NET Transaction + Try-catch?

在VB.NET中,我们可以这样做:

Try 

... 

Catch ex As Exception 
    MyTransaction.Rollback 
End Try 

如果尝试捕捉是SQL:

... 
MyCommand.CommandText = _ 
"USE AdventureWorks2008R2; " & _ 
"GO " & _ 
"BEGIN TRANSACTION; " & _ 
"BEGIN TRY " & _ 
" ... " & _ 
"END TRY " & _ 
"BEGIN CATCH " & _ 
" SELECT " & _ 
"  ERROR_NUMBER() AS ErrorNumber " & _ 
"  ,ERROR_SEVERITY() AS ErrorSeverity " & _ 
"  ,ERROR_STATE() AS ErrorState " & _ 
"  ,ERROR_PROCEDURE() AS ErrorProcedure " & _ 
"  ,ERROR_LINE() AS ErrorLine " & _ 
"  ,ERROR_MESSAGE() AS ErrorMessage; " & _ 
" IF @@TRANCOUNT > 0 " & _ 
"  ROLLBACK TRANSACTION; " & _ 
"END CATCH; " & _ 
"IF @@TRANCOUNT > 0 " & _ 
" COMMIT TRANSACTION; " & _ 
"GO " & _ 
MyCommand.ExecuteNonQuery() 

我总是使用第一个,通VB.NET。有什么区别吗?那些是什么?有什么缺点?

回答

2

其中一个差异是被困的错误。

  • 的SQL捉将捕获发生在SQL查询
  • 的VB.Net捕获将捕获发生在VB.Net错误的错误。这包括通过.Net API传播的编程和许多查询错误。

你想要使用的是高度依赖于你的情况。如果所有VB.Net try块都执行查询并回滚错误,那么在SQL中执行回滚会更好。这可以保持数据库逻辑严密和本地化。

但是,如果VB.Net尝试块包含额外的业务逻辑,那么保持回滚可能更有意义。

0

在功能上,他们是一样的 - vb.net版本被翻译并作为sql查询运行。

主要区别在于,您可以使用相同的连接执行多个SQL语句,而无需生成一个包含您想要在事务中完成的所有事务的大型SQL查询。

+0

_the vb.net版本被翻译并作为sql queries_运行 - 事务,是; 'try' ...'catch',no。如果它是LINQ查询的一部分或“Expression”的一部分,那么这首先是可能的。 – stakx