2011-08-12 10 views
3

私はデータベースに接続するアプリケーションを使っています。いくつかのデータベース操作が失敗した場合、私は間違いなくロールバックを行いたいと思っています。私はちょうどどのトランザクション+ try-catchがSQLやVB.NETを使うのが良いのだろうかと思っていますか?トライキャッチがSQLである場合SQLトランザクション+ Try-catchまたはVB.NET Transaction + Try-catch?

Try 

... 

Catch ex As Exception 
    MyTransaction.Rollback 
End Try 

VB.NETで、我々のような何かを行うことができます

... 
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

トラップされるエラーの違いの1つです。

  • SQLキャッチはVB.Netで発生したエラーをキャッチしますSQLクエリ
  • VB.Netキャッチ内で発生するエラーをキャッチします。これには、プログラミングAPIと.Net APIを介して伝播する多くのクエリエラーが含まれます。

使用するのは状況に大きく依存します。すべてのVB.Net tryブロックがクエリを実行し、エラーでロールバックする場合は、SQLでロールバックを実行する方がはるかに優れています。これにより、データベースロジックは緊密かつローカルに保たれます。

しかし、VB.Netのtryブロックに追加のビジネスロジックが含まれている場合は、ロールバックを維持する方が適切でしょう。

0

機能的には、それらは同じです - vb.netバージョンは翻訳され、SQLクエリとして実行されます。

主な違いは、同じ接続を使用して複数のSQL文を実行できることです。トランザクションで実行する必要があるすべてのものを含む1つの大きなSQLクエリを生成する必要はありません。

+0

vb.netバージョンが翻訳され、SQLクエリとして実行されます_ - トランザクション、はい。 「試して」...「キャッチ」、いいえ。これはLINQクエリの一部であるか、 '式'の一部であった場合にのみ可能です。 – stakx

関連する問題