2016-08-03 10 views
0

私はユーザーコントロールを持つメインウィンドウのフォームを持っています。そこから私はデータベースに関連したいくつかの操作を行います。データベースプロセス中、私はユーザーに追加のウィンドウフォームを表示し、その間に素敵なサーキュラーグラフィックを見ることができます。私は上記のデータベースプロセスを配置するタスクを使用し、そこからエラーが発生した場合、try/catchからエラーメッセージを表示したい。 Unfortunetly MessageBox.Showは私がテストをするときに表示されません - キャッチに達していない。間違っていることを教えてください。私はキャッチなステートメントでは、このラインについて話しています:エラー時にキャッチが届かない

Catch sqlex As Exception 
pic.Invoke(Sub() MessageBox.Show(pic, sqlex.Message)) 

はここcircuralウィンドウのフォームコードです:

Public Class FrmCircularProgress 
    Sub New(progressType As DevComponents.DotNetBar.eCircularProgressType) 
     InitializeComponent() 
     CircularProgress1.ProgressBarType = progressType 
     StartCircular() 
    End Sub 

    Public Sub StartCircular() 
     Me.CircularProgress1.IsRunning = True 
    End Sub 

    Public Sub StopCircular() 
     Me.CircularProgress1.IsRunning = False 
    End Sub 
End Class 

これは、私は、タスクとそれを使用する方法の例です:

Dim createArticle As New Artikel 

        Dim pic As New FrmCircularProgress(eCircularProgressType.Donut) 
        Dim tsk As Task(Of Boolean) = Task.Factory.StartNew(Of Boolean)(Function() 
                         '--Run lenghty task 
                         Dim resu = False 
                         Try 
                          resu = createArticle.ProcessArticle(_artikelsAndTheirVariationsFinal) 
                          '--Close form once done (on GUI thread) 

                         Catch sqlex As Exception 
                          pic.Invoke(Sub() MessageBox.Show(pic, sqlex.Message)) 
                                              Finally 
                          pic.Invoke(New Action(Sub() pic.StopCircular())) 
                          pic.Invoke(New Action(Sub() pic.Close())) 
                         End Try 

                         Return resu 
                        End Function) 

        '--Show the form 
        pic.ShowDialog() 
        Task.WaitAll(tsk) 
... 

そして、ちょうどについて私たちのケースでは、データベースプロセスの例を見てください。真または偽を返すProcessArticle

Public Function ProcessArticle(artikel As ArticlesVariations) As Boolean 

     Dim result = True 
     Dim strcon = New AppSettingsReader().GetValue("ConnectionString", GetType(System.String)).ToString() 

     Using connection As New SqlConnection(strcon) 
      '-- Open generall connection for all the queries 
      connection.Open() 
      '-- Make the transaction. 
      Dim transaction As SqlTransaction 
      transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted) 

      Dim newArticleRowId As Integer = 0 
      Dim articleIndex As Integer = 0 
      Try 
       For Each kvp As KeyValuePair(Of Integer, Artikel) In artikel.collection 
        Dim ckey As Integer = kvp.Key 
        articleIndex = kvp.Key    'save article key 
        Dim data As Artikel = kvp.Value 

        '-- If given article contains images list (artikel_images is a list with pictures associated with article) 
        If Not IsNothing(artikel.collection(articleIndex).ArtikelImages) Then 
         For Each img In artikel.collection(articleIndex).ArtikelImages 
          '--Insert article's images if exists 
          Using cmd As New SqlCommand("INSERT INTO T_Article_Image (Path, FK_Artikel_ID, Position) VALUES (@Path, @FK_Artikel_ID, @Position)", connection) 
           cmd.CommandType = CommandType.Text 
           cmd.Connection = connection 
           cmd.Transaction = transaction 
           cmd.Parameters.AddWithValue("@Path", img.Path) 
           cmd.Parameters.AddWithValue("@FK_Artikel_ID", newArticleRowId) 
           cmd.Parameters.AddWithValue("@Position", img.Position) 
           cmd.ExecuteScalar() 
          End Using 
         Next 
        End If 

        '-- If given article contains articles variations list (artikel_variation_attributes is a list with variations associated with article) 
        If Not IsNothing(artikel.collection(articleIndex)._artikel_variation_attributes) Then 
         For Each var In artikel.collection(articleIndex)._artikel_variation_attributes 

          '--Insert article's images if exists 
          Using cmd As New SqlCommand("INSERT INTO T_Artikel_T_Variation (FK_Variation_VariationAttribute_ID, FK_Artikel_ID, Position) VALUES (@FK_Variation_VariationAttribute_ID, @FK_Artikel_ID, @Position)", connection) 
           cmd.CommandType = CommandType.Text 
           cmd.Connection = connection 
           cmd.Transaction = transaction 
           cmd.Parameters.AddWithValue("@FK_Variation_VariationAttribute_ID", New Variation_VariationAttribute(var.FkVariationId, var.FkVariationAttributeId).GetId()) 
           cmd.Parameters.AddWithValue("@FK_Artikel_ID", newArticleRowId) 
           cmd.Parameters.AddWithValue("@Position", var.Position) 
           cmd.ExecuteScalar() 
          End Using 
         Next 
        End If 

       Next 
       transaction.Commit() 
      Catch ex As Exception 
       result = False 
       '-- Roll the transaction back. 
       Try 
        transaction.Rollback() 
       Catch ex2 As Exception 
result = False 
       End Try 

      End Try 
     End Using 

     Return result 
    End Function 
+2

簡潔で再現性のある例を作成できますか?データベースへの参照を削除し、常に例外をスローし、それを捕まえるようにしてください。アドバイスを求める前に、常に問題を減らそうとしてください。 – Neolisk

+0

@ Neolisk私はすでに私の視点からはかなり明確にカットされています。 –

+0

あなたの妻に、人物の視点がどのように違うか尋ねてください。 –

答えて

0

私はあなたのキャッチに達するとは思わないでしょう。あなたのProcessArticle関数には別のTry .. Catchがあります。SQL操作でエラーが発生した場合、これがキャッチされます。あなたは偽を返す!呼び出しルーチンはエラーを捕捉しません。なぜなら、それはすでに正常に処理されているからです。呼び出しルーチンでエラーをキャッチする場合は、ProcessArticle関数のcatchからエラーを発生させる必要があります。あなたは

Catch ex As Exception 
     result = False 
     '-- Roll the transaction back. 
     Try 
      transaction.Rollback() 
     Catch ex2 As Exception 
      Throw New Exception("Rollback failed after first exception.", ex2) 
     End Try 
     Throw New Exception("Rollback succeeded after exception.", ex) 
    End Try 

申し訳へProcessArticleであなたのトライキャッチを変更することができ

それは私がVBをやったので、いくつかの時間ですが、私は、構文が正しいことだと思います。これを使用して、呼び出し側のルーチンはExceptionをキャッチする必要があります(また、内部例外を持つExceptionがあります)。原因を見つけるには、内部例外を調べる必要があります。

+0

こんにちはJonathan、あなたの考え方から、あなたが私であればあなたが選ぶだろう - あなたはそれをどのように修正するのかという答えとして投稿できますか? Thx –

+0

こんにちはJimmyJimm。私は自分の答えを編集しました。 –

+0

私はそこにそれを置くことを確認します。 –

関連する問題