2009-05-17 3 views
1

私はC#の専門家にとって多くの意味を理解していないかもしれないが、私が何をしたいのかを説明し、必要ならばそれをより良いやり方で提案することができるだろうOK?C#で読者情報を保存する

私は、さまざまなMySQLクエリ(ado.net NETコネクタ、linqやActiveRecord-ishライブラリのようなものではない)を扱うDatabaseManagerというC#クラスを持っています。

私はカテゴリのリストが非常に小さい(10項目)である

categories = db_manager.getCategories(); 

ような何かをやっているので、私は、追加のコードがあまりなく取得した情報をアクセスするための最良の方法だと知っているしたいと思います。

今はStructを使用して情報を格納していますが、これを行うにはより良い方法があると確信しています。ここで

は私のコードです:

public struct Category 
    { 
     public string name; 
    } 
    internal ArrayList getCategories() 
    { 
     ArrayList categories = new ArrayList(); 

     MySqlDataReader reader; 
     Category category_info; 

     try 
     { 
      conn.Open(); 
      reader = category_query.ExecuteReader(); 
      while (reader.Read()) 
      { 
       category_info = new Category(); 
       category_info.name = reader["name"].ToString(); 
       categories.Add(category_info); 
      } 
      reader.Close(); 
      conn.Close(); 
     } 
     catch (MySqlException e) 
     { 
      Console.WriteLine("ERROR " + e.ToString()); 
     } 

     return categories; 
    } 

答えて

4

例:ちょうどこの代わりを使用して...例外はあなたのtryブロックで発生した場合、あなたはあなたの接続と読者を開いたまま)

2文字列の配列リスト(またはジェネリックでリスト)を作成します:

public IEnumerable<Category> GetCategories() 
{ 
    using (var connection = new MySqlConnection("CONNECTION STRING")) 
    using (var command = new MySqlCommand("SELECT name FROM categories", connection)) 
    { 
     connection.Open(); 
     using (var reader = command.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       yield return new Category { name = reader.GetString(0) }; 
      } 
     } 
    } 
} 

備考:

  1. あなたのための右の作業を行う(接続を保存しないようADO.NET接続プーリングをしてみましょう静的フィールド、など...)
  2. で、常に適切にC#で(「使用」を使用して、アンマネージリソースを配置するようにしてください)
  3. 常にこの場合、あなたの公開方法から階層の最下位インターフェース(IEnumerableを<カテゴリーを返します>)。
  4. 発信者は例外とログを処理したままにしておいてください。これらは懸案事項であり、DBアクセスコードと混同しないようにしてください。
+0

あなたはおそらく、コンソールにエラーを印刷するという本来の意図に従うために、try/catch節ですべてをラップするべきです。 – bbmud

+0

私の例を明確にするための注釈が追加されました。 –

+0

本当に良い音。私はそれを試してみましょう。 しかし、私は質問したいと思います...あなたの解決策は、私はまだ私の "カテゴリ"構造体を使用する必要がありますか?または「変数のマッピング」を避けるために使用できるものが他にありますか? 例:「名前」の一部「id」と「何でも」を取得したい私はいつも構造体に属性を追加して割り当てを作成する必要がありますか? ありがとうもう一度:) – ozke

0

私はどうしたらまず最初に、あなたがカテゴリリストの使用のためにコンパイル時の型checkigを提供します一覧でのArrayListの使用置き換えることです(あなたがしませんあなたのコードでそれを使用するときにキャストしなければなりません)。

-1

ジェネリックの力を使用していないので、あなたは.NET 1.1を使用していると思います。

1)文字列のみを含む構造体を使用することは、過剰なものです。

try 
{ 
    conn.open(); 
    //more code 
} 
catch (MySqlException e) { // code 
} 
finally { 
    conn.close() 
    if (reader != null) 
     reader.close(); 
} 
+0

-1 MySqlExceptionをスローし、usingステートメントを実装しないため。 –

+0

これは元のコードのより短いバージョンです。 catchブロックでわかるように、実装の残りの部分には "// code"というコメントがあります。 – Gidon

0

このように戻すときに問題はありません。しかし、いくつかのことが目立つ:

  • あなたのcatchブロックがエラーを記録しますが、 は、空の配列または部分的に 人口の配列のいずれかを返します。この はおそらく良い考えではありません
  • try ブロックに例外がスローされた場合は、接続 を閉じたり、リーダーを廃棄したりしません。 using()ステートメント を検討してください。
  • ArrayListの代わりに汎用タイプ (List <>)を使用する必要があります。
関連する問題