2012-03-12 9 views
0

私は、データベース接続を開き、そこからデータを取得してユーザーに表示するアプリケーションを開発中です。私が見ることのできるコードではすべてがうまく見えますが、以下のメソッドで例外がスローされるため、何かが間違っています。私は "conn.Open();"にブレークポイントを設定しました。例外がスローされます。何が間違っていた(例外)かを確認するには?

私は実際のエラーの内容と解決方法を知りません。ここで助けを得ることを望みます。例外のスタックトレースは、役に立つ場合はhereとなります。

例外がある:System.ApplicationException:アプリケーションでエラーが発生しました

おかげで事前に!

例外をスローする方法:web.configファイルから

public abstract class DALBase { 
    private static string _connectionString; 

    static DALBase() { 
      _connectionString = WebConfigurationManager.ConnectionStrings["NameOfTheDatabase_ConnectionString"].ConnectionString; 
    } 

    protected SqlConnection CreateConnection() { 
     return new SqlConnection(_connectionString); 
    } 
} 

:上記の方法を含むクラスの

public List<Movie> GetMovies() { 

    var movieTitles = new List<Movie>(100); 

    using (var conn = CreateConnection()) { 
     try { 
      var cmd = new SqlCommand("dbo.usp_GetMovies", conn); 
      cmd.CommandType = CommandType.StoredProcedure; 

      conn.Open(); 

      using (var reader = cmd.ExecuteReader()) { 
       var movieIDIndex = reader.GetOrdinal("MovieID"); 
       var nameIndex = reader.GetOrdinal("Name"); 
       var yearIndex = reader.GetOrdinal("Year"); 
       var lengthIndex = reader.GetOrdinal("Length"); 
       var summaryIndex = reader.GetOrdinal("Summary"); 

       while (reader.Read()) { 
        movieTitles.Add(new Movie { 
         MovieID = reader.GetInt32(movieIDIndex), 
         Name = reader.GetString(nameIndex), 
         Year = reader.GetInt32(yearIndex), 
         Length = reader.GetInt32(lengthIndex), 
         Summary = reader.GetString(summaryIndex), 
        }); 
       } 
      } 
     } 
     catch { 
      throw new ApplicationException("An error occured!"); 
     } 

    } 

    movieTitles.TrimExcess(); 

    return movieTitles; 
} 

相続人基底クラス

<connectionStrings> 
    <add name="NameOfTheDatabase_ConnectionString" connectionString="Data Source=xxx.xx.xxx.x;Initial Catalog=The_Catalog;User ID=xxxxxx;Password=xxxxxx" providerName="System.Data.SqlClient"/> 
    </connectionStrings> 
+0

接続を開く時点で例外がスローされる場合は、接続文字列に問題があると思われます。接続文字列が有効であることを確認するには、VS2010接続ダイアログを開き、ダイアログを使用して文字列を作成します。あなたが接続することができれば、それはこれを排除します - あなたができなければ、接続文字列は有効ではなく、あなたの答えがあります。 – MoonKnight

答えて

3

変更

throw new ApplicationException("An error occured!"); 

、あなたが実際の例外とメッセージが表示されます。

+0

これを行うと、キャッチをまったく含める必要はありません。 – svick

+0

本当に十分ですが、これにより迅速に回答が得られ、最後に例外を処理する必要があります。変更するコード行が少なくなります。 – mgnoonan

+0

さて、それは実際に私に以下を与えました:System.InvalidCastException:指定されたキャストは無効です。 - System.Data.SqlClient.SqlBuffer.get_Int32()+5057461 - System.Data.SqlClient.SqlDataReader.GetInt32(Int32 i)+38 – holyredbeard

1

あなたあらゆる種類の例外を捕捉し、分析のためにそれらをまったく使用しないでください:

この:

catch (Exception e) 
{ 
    //look at e here 
} 

さて、E変数はあなたが必要なすべての情報を持っています:

catch 
{ 
    throw new ApplicationException("An error occured!"); 
} 

はこれでなければなりません。

私は、デバッグの目的でそこにtry catchがあると仮定していますが、もしそうでなければ、それを完全に取り除き、例外がスタックの上にあると判断するほうが良いでしょう。

throw; 

+1

...デバッグしていない限り、その情報は失われます。 'ApplicationException'には存在しません。 –

+0

@ジョン絶対に、私は彼がデバッグセッション中に問題が何であるか把握しようとしているので、try catchを追加したと仮定しています。 – Joseph

+0

はい、それはその場合に役立ちます - しかし、なぜ情報フリーの例外をスローし続けますか? –

5

あなたのtry/catchが本当に便利何もやっていません - かなり逆に、それが情報を削除です。

具体的にはがこのコード(ick)からApplicationExceptionと予想されていない限り、try/catchを完全に削除し、例外のバブルをスタックの一番上までバブルアップさせます。今度は、実際のの例外があります。貧血の代わりに、「何かが間違っていましたが、実際には何が起こっているのかわかりません。

例外がデバッガで表示されるようにするには、例外が発生するとすぐにブレークするようにデバッガの設定を変更します。そのためにtry/catchブロックは必要ありません。

4

あなたが実際に投稿スタックトレースがあなたに、この場合にTargetInvocationException *「からバブルアップ」しているApplicationExceptionある例外、伝え:事はあなたが適切なをキャッチし、ある*

TargetInvocationException: Exception has been thrown by the target of an invocation. 

例外その後、独自の例外をスロー(実際にスローされますが、特定の作成に由来してはならないタイプの、スローの対象カスタム例外タイプを。)

ちなみに、TargetInvocationExceptionは難しくありません。静的なコンストラクタは犯人です。私は気づいていますが、あなたのコードを知らないので、私は言うことができません。

関連する問題