Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL事务&x2B;尝试catch或VB.NET事务+;试着接球?_Sql_Vb.net_Transactions - Fatal编程技术网

SQL事务&x2B;尝试catch或VB.NET事务+;试着接球?

SQL事务&x2B;尝试catch或VB.NET事务+;试着接球?,sql,vb.net,transactions,Sql,Vb.net,Transactions,我正在使用一个连接到数据库的应用程序。如果某些数据库操作失败,我肯定要执行回滚。我只是想知道使用SQL还是VB.NET哪个事务+try-catch更好 在VB.NET中,我们可以执行以下操作: Try ... Catch ex As Exception MyTransaction.Rollback End Try 如果try-catch在SQL中: ... MyCommand.CommandText = _ "USE AdventureWorks2008R2; " & _

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

在VB.NET中,我们可以执行以下操作:

Try

...

Catch ex As Exception
    MyTransaction.Rollback
End Try
如果try-catch在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。有什么区别吗?那些是什么?有什么缺点吗?

从功能上讲,它们是相同的-vb.net版本会被翻译并作为sql查询运行


主要区别在于,您可以使用同一连接执行多个SQL语句,而不必生成一个包含您希望在事务中执行的所有操作的大型SQL查询。

其中一个区别是捕获的错误

  • SQL捕获将捕获SQL查询中发生的错误
  • VB.Net捕获将捕获VB.Net中发生的错误。这包括编程错误和许多通过.NETAPI传播的查询错误
您想要使用的是高度依赖于您的情况。如果VB.NETTRY块所做的只是执行查询并回滚错误,那么在SQL中执行回滚就更好了。这将保持数据库逻辑的紧密性和本地性

但是,如果VB.NETTRY块包含其他业务逻辑,那么将回滚保持在那里可能更有意义

vb.net版本被转换并作为sql查询运行——事务,是的;
try
catch
,否。仅当它是LINQ查询的一部分或
表达式的一部分时,才可能执行此操作。