2011-07-05 13 views
0

私は2つのクラスを持っています。汎用データアクセスクラスでは、ストアドプロシージャGetDepartmentsから部門を取得できます。私の問題は、カタログアクセスクラスと特にパブリック静的DataTable ExecuteSelectCommand(DbCommandコマンド)(コマンドを実行し、DataTableオブジェクトとして結果を返す)です。CATCHループで何を書き込む必要があるか、それを残す方法はわかりません私はこの部分を完了するために私を助けてもらえますか?あるいは、どうすれば私はTry-catchなしで変更することができますか?trycatch関数の問題

using System;  
using System.Data;  
using System.Data.Common;  
using System.Configuration;  

public static class GenericDataAccess  
{  
    static GenericDataAccess() 
    { 

    } 


    public static DataTable ExecuteSelectCommand(DbCommand command)  
    {  
    DataTable table; 

    try  
    { 

     command.Connection.Open();  
     DbDataReader reader = command.ExecuteReader();  
     table = new DataTable();   
     table.Load(reader);   
     reader.Close();   
    }  
    catch (...)  
    {  
     ...... 
    }  
    finally  
    {   
     command.Connection.Close();  
    } 

    return table;  
    } 

    public static DbCommand CreateCommand()  
    {  
    string dataProviderName = BalloonShopConfiguration.DbProviderName; 
    string connectionString = BalloonShopConfiguration.DbConnectionString; 

    DbProviderFactory factory = DbProviderFactories.GetFactory(dataProviderName);  
    DbConnection conn = factory.CreateConnection(); 

    conn.ConnectionString = connectionString; 

    DbCommand comm = conn.CreateCommand();  
    comm.CommandType = CommandType.StoredProcedure; 

    return comm; 
    } 
} 

**The Catalog Access class:** 

using System;  
using System.Data;  
using System.Data.Common; 

public static class CatalogAccess  
{  
    static CatalogAccess() 
    { 

    } 

    public static DataTable GetDepartments()  
    {  
    DbCommand comm = GenericDataAccess.CreateCommand(); 

    comm.CommandText = "GetDepartments"; 

    return GenericDataAccess.ExecuteSelectCommand(comm);  
    }  
} 
+0

何その後、次のような何かをしたいですExecuteSelectCommandメソッドで例外が発生した場合はどうしますか?それはキャッチブロックに入る必要があることを指示するでしょう。 – DoctorMick

+1

リーダーは使用中でなければなりません。 – Aristos

+0

Connectionのように見えますが、同様にリークする可能性があります。 – Constantin

答えて

1

あなたが何をすべきかわからない、または任意の例外を処理したくない場合は、catchアウトと一緒に出国。これは有効です:

try 
{ 
    // code here 
} 
finally 
{ 
    // cleanup here 
} 

..このように、あなたのメソッドを呼び出したメソッドには例外が渡されます。 tryブロックに問題(例外)がある場合、メソッドは終了しますが、finallyのコードが実行される前に終了しません。

+0

私はあなたが提案した2番目の方法を試してみます。このエラーがあります。 'ログインできませんでした。ログインに失敗しました。 'そして、この行にエラーがあります "command.Connection.Open();" – dali1985

+0

@ theo1985、あなたが使用している接続文字列が正しくない可能性があります。あなたが正しいデータベースサーバに接続し、そのサーバが 'BalloonShop'データベースを持っていることを確認してください。 – Constantin

0

私は何を求めているか分かりませんが、あなたの関数で例外を処理しないようにして、スタックの下に伝播させる(つまり、呼び出し元に処理させる)ことを望みます。

これを達成するには、コードのcatchをそのまま残すことができます。 finally以下のコードは引き続き呼び出されます。彼らが投げているとき、あなたが今、それらを処理することができ、または次のことができます。

catch (MyException e) 
{ 
    // Do stuff with e 
    throw; 
} 
+3

これでスタックトレース情報が失われます。 –

+0

@Kieren:thx、私の答えを編集しました。 – larsmoa

+0

これを行うと、未使用の変数 'e'についてのコンパイラの警告が表示されます。すべてを行う場合は、再度投げてください。' catch {throw; } 'より良いでしょう。または、読みやすさのわずかな喪失に気をつけなければ、キャッチブロックは全くありません。 –

0

例外を扱う、あなたは2つのオプションがあります:あなたはあなたの関数で例外を処理しますが、返す前にそれを再スローしたい場合は、してみてくださいコードを泡立てて後で処理させてください。どちらが良いかは、あなたのプログラムが正確に何をするかによって決まります。

どのように処理するかは、コードによって異なります。ユーザーに通知しますか?接続を再試行しますか?どちらも?何もしない(悪い!)あなたには、何か悪いことが起こったことをユーザーに知らせたいとします。あなたがさらにアップ(別名、この1と呼ばれる方法で)例外に対処したい場合は、次の手順を実行

try{ 
    // breakable stuff 
}catch(Exception e){ 
    System.Windows.Forms.MessageBox.Show("Something broke: " + e.Message); 
}finally{ 
    // clean up 
} 

try{ 
    // breakable stuff 
}catch{ 
    throw; 
}finally{ 
    // clean up 
} 
+0

'catch {throw; } 'はブレークポイントを置くための行を除いて、値の何も追加しません。しかし、おそらく '#if DEBUG'セクションの中にあるはずです。 – Constantin

+0

真実ですが、それは何かを傷つけることもなく、IMOはそれをより読みやすくし、正確に何が起こっているのかを少しはっきりさせます。 –

+0

ごめんなさい: '(もう一度、あなたはもちろん正しいですが、OPのコードのために(あなたが言ったように) 'catch'を切り捨てることは、すべてのコメントを削除してコンパイル時間を短縮する:D –