2010-11-30 8 views
0

最近、NHibernateを使用する傾向があるため、SqlCommandなどを使用してデータにアクセスしていません。私は次のコードを改善できるかどうか疑問に思っています。私はベストプラクティスを使用しようとしましたが(いくつかのgoogle-ingの後に)、潜在的な例外が上位層で捕捉されています。asp.netでsprocデータにアクセスする最もきれいな方法

[WebMethod] 
    public XmlDocument GetClassRegistrationReport() 
    { 
     XmlDocument doc = new XmlDocument(); 

     using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["bla"].ToString())) 
     { 
      using (SqlCommand command = connection.CreateCommand()) 
      { 
       command.CommandText = "bla"; 
       command.CommandType = CommandType.StoredProcedure; 
       connection.Open(); 
       doc.Load(command.ExecuteXmlReader()); 
      } 
     } 

     return doc; 
    } 

Thanks! 

幸運を祈り、

クリスチャン

答えて

2

あなたはそれを少し向上させることができ、いくつかの方法があります。

  • WebMethod属性は、データをプルしていない入力パラメータと、それがそのまま返しますが私は、サービスインタフェースとデータを別々のクラスに分離することを提案します。それは、後日維持することを容易にするかもしれない。
  • フレームワーク内に他のDB呼び出しがあると仮定すると、ストアドプロシージャの呼び出しをラップするデータレイヤーのヘルパーメソッドを考慮する必要があります。この方法では、すべてのSPコールがフィルタリングを呼び出す方法が1つしかないため、将来的にメンテナンスが容易になります。
  • 接続文字列の 'bla'キーを定数に設定すると、簡単に再利用して変更できます。
  • 同じことがストアドプロシージャの名前に適用されます。あるいは、web.configの一部にする - これは、再コンパイルせずにストアドプロシージャ名を変更できることを意味します。
  • 例外がスローされた場合は、この例外が処理されないので、例外が呼び出し元にバブルアウトし、例外のキャッチと処理/ロギングを検討してください。つまり、上位層で例外を処理していると言われているので、これはあなたのWebサービスを呼び出しているものであれば実行されていると仮定します。
  • (あなたは例外処理を実装して行う場合は、最後に/ようやくのtry/catchの中で)あなたはSQLコマンドオブジェクトを配置する必要があります

EDIT:コードサンプル

public class MyWebService 
{ 
    [WebMethod] 
    public XmlDocument GetClassRegistrationReport() 
    { 
     return DataLayer.GetClassRegistrationReport(); 
    } 
} 
// Notice that this is a static internal class, internal to hide the 
// data access class from everything but this library and static because 
// we don't need instances and using statics will optimise a little. 
internal static class DataLayer 
{ 
    private const string SP_GetRegistrationReport = "GetRegistrationReport"; 
    private const string Config_DBConnectionString = "PrimaryDB"; 

    private static string GetDB 
    { 
     get 
     { 
      string dbConnectionString = ConfigurationManager.ConnectionStrings[Config_DBConnectionString].ConnectionString; 

      if (string.IsNullOrEmpty(dbConnectionString)) 
      { 
       // This error should could/should be in a resource file. 
       throw new ConfigurationException("Database connection string is not defined"); 
      } 

      return dbConnectionString; 
     } 
    } 

    internal static XmlDocument GetClassRegistrationReport() 
    { 
     XmlDocument doc = new XmlDocument(); 

     using (SqlConnection connection = new SqlConnection()) 
     { 
      using (SqlCommand command = connection.CreateCommand()) 
      { 
       command.CommandText = SP_GetRegistrationReport; 
       command.CommandType = CommandType.StoredProcedure; 
       connection.Open(); 
       doc.Load(command.ExecuteXmlReader()); 
      } 
     } 

     return doc; 
    } 
} 
+0

I物事を少し更新しました(SQLコマンドオブジェクトをusingステートメントにラップしました)。例外の場合には、これは閉包/廃棄を処理すべきですか? ConfigurationManager.ConnectionStrings ["bla"]はweb.configの 'グローバル変数'にアクセスできませんか?あなたの提案にいくつかのリンクを追加してください。ありがとう! – cs0815

+0

再処理 - はい、そのトリックを行います。 – MrEyes

+0

構成やその他の提案については、例として1000語を話します。だからコードサンプルでオリジナルの投稿を編集します – MrEyes

関連する問題