2011-01-25 15 views
2
cn = new SqlConnection(
     ConfigurationManager.ConnectionStrings["LocalSqlServer"].ToString()); 
cn.Open(); 

ここで、コンテンツページとマスターページがあると仮定して、このコードを作成してください。ASP.netベストプラクティス - どこからデータベースに接続しますか?

マスターページPage_Initに入れてください。コンテンツページのすべての実行段階から完全にアクセスできるようになりますか?

私は古典的なASPに慣れて、私は通常はそれだろう:

Declare variables 

Open connection 

process code 

Close connection 

Render HTML 

をしかし、.NETのページのライフサイクルの各段階がたくさんあるので、これを配置することが最善であるところ、私は疑問に思ってコード?

この接続は終了する必要がありますか、またはごみ処理によって私の世話をしますか?

答えて

6

私の場合、コードビハインドファイルのデータベース接続を削除できるようにDataAccess Layerを作成します。私のWebアプリケーションはDalを参照し、フロントエンドからのDalのやりとりを可能にする公開メソッドを公開します。

Dal接続を開閉するという点では、usingステートメントでラップします。必要な場合に。この上

より多くの情報はここで見つけることができます - あなたは、データベースからのデータを必要なときにのみ、それを使用する必要がありますhttp://davidhayden.com/blog/dave/archive/2005/01/13/773.aspx

+0

これはすばらしい答えです。私はそれを使う良い理由を知っているので、 "使用する"を使用します! – webdad3

1

DALレイヤーを作成していない場合、これはpage_loadやonClickイベントなどのイベントです。あなたはページ上の接続を開くためだけに接続を開くべきではありません。 .NETで接続

SqlConnection conn = null 
try 
{ 
    conn = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalSqlServer"].ConnectionString); 
    conn.Open() 

    // do something with the connection 
} 
catch(Exception ex) 
{ 
    //log error 
} 
finally 
{ 
    // clean up connection 
    if(conn!=null) 
    { 
     //check if connetion is open, if it is close it/dispose   
    } 

} 
2

を開くためのコードの

スニペットは、それはあなたが使用する構造に依存します。 SqlConnectionオブジェクトを使用して明示的に接続する場合は、その接続を直接管理する必要があります。データセットtableadapterオブジェクトまたはDataContextオブジェクトをLINQ(個人的な推奨事項)で使用する場合、通常は接続が管理されますが、オブジェクトが使用ブロック内に囲まれて適切に収集されているかどうかを確認します。

私たちのチームは、データを取得するための接続ベースのオブジェクトの遅延ロードを処理する共通データクラスにIDisposableを実装する汎用データマネージャを構築することを「ベストプラクティス」と考えています。このようにして、データマネージャのdisposeイベント内の任意の接続のクローズを強制して、それをきれいに保つことができます。

編集:私はいつもガスリーで始まる

。以下は
http://weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to-sql-part-1.aspx

101 LINQ Samples

http://krisvandermotten.wordpress.com/2006/11/30/creating-a-data-access-layer-with-linq-to-sql-part-2/

私の標準BaseDataManagerの一片のコードサンプルです。私はおそらく長い間それのためのインターフェイスを作成しているはずですが、抽象的なビットは、私の他のチームメンバーがかなりうまくそれを採用するように見える。私はこのコードを無保証で掲載していますが、それは私のために機能し、接続プールを素早く清潔に保ちます(データベースに保存されている文書情報に対して多くのデータを取得します)。私はそれをシンプルに保つために、当社の他の基本メソッドの束を切り出し、何以下だと、直接あなたの質問に答える部分である:

[Serializable()] 
public abstract class BaseDataManager : IDisposable 
{ 

    private bool _disposedValue = false; 
    private SqlConnection _connectionObject = null; 

    public BaseDataManager() 
    { 

    } 

    public BaseDataManager(string connectionString) 
    { 
     this.SqlConnectionString = connectionString; 
    } 

    public BaseDataManager(string connectionString, string username, string password) 
    { 
     if (!connectionString.EndsWith(";")) connectionString += ";"; 
     this.SqlConnectionString += "User ID=" + username + ";password=" + password; 
    } 

    public string SqlConnectionString 
    { 
     get; 
     set; 
    } 

    public virtual SqlConnection Connection 
    { 
     get 
     { 
      if (_connectionObject == null && !String.IsNullOrEmpty(this.SqlConnectionString)) 
       _connectionObject = new SqlConnection(this.SqlConnectionString); 
      return _connectionObject; 
     } 
     set 
     { 
      _connectionObject = value; 
     } 
    } 

    #region IDisposable Support 
    /// <summary> 
    /// (Protected) Method that performs actual cleanup on dispose. This interface 
    /// has been implemented to clean up data connections that are left stranded 
    /// when the class is disposed while the connection possibly remains open in 
    /// the connection pool. This opportunity is also used to free up the private 
    /// variables of the class. 
    /// </summary> 
    /// <param name="disposing">Used for explicitly calling Dispose</param> 
    protected virtual void Dispose(bool disposing) 
    { 
     if (!_disposedValue) 
     { 
      if (disposing) 
      { 
       //--------------------------------------------------------------------------------------------- 
       // Close the connection object prior to setting it to nothing 
       //--------------------------------------------------------------------------------------------- 
       if (_connectionObject != null) _connectionObject.Close(); 
       _connectionObject = null; 
      } 

      _disposedValue = true; 
     } 
    } 

    /// <summary> 
    /// (Public) Method that implements IDisposable. This code is autogenerated 
    /// the implementation interface in the VS IDE. Do not change this code. 
    /// </summary> 
    public void Dispose() 
    { 
     // Do not change this code. Put cleanup code in Dispose(ByVal disposing As Boolean) above. 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 
    #endregion 

} 
+0

この回答をお寄せいただきありがとうございます。私はウェブサイトの基礎を書いており、可能な限り正しく設計されていることを確認したいと考えています。 –

+0

@Tom Gullen - どのようなデータベース接続方法を使用していますか?それともまだ未定ですか? –

+0

今は未定ですが、以前は未定でした。ネットプロジェクト私の質問に示されているように接続するにはページのinitを使用しますが、このDALレイヤーはうまく見えます。今読んでいますが、このオプションをお勧めしますか? –

2

私はあなたがに関連するクラスを公開する別々のクラスライブラリプロジェクトを作成することをお勧めしますデータベース内のテーブル。その後、そのプロジェクトへの参照を入れ、離れて行く。接続の開閉を簡単にするために、クラスを書くなど、すべてのテーブルをマップするSubsonicを見て、コードビハインドでこれを行うことができます。

Product prod = Product.Find(3); 
prod.Name = "iPhone"; 
prod.Save(); 
1

ルールの最初の親指は、ドメインのレイヤーをASP.NETの仕様/ビューから切り離します。

多くの人がDomain階層のクラスライブラリを作成します。そのようにして、ページ/ビュー関連のコードがブレンドされないことが保証されます。

あなたは、ユーザー、コメントなどのクラスを持っているドメイン層を持ちます。これらのクラスはデータベースと通信します。私は通常、すべてのデータベースのやりとりが発生するDbUserクラスを持ち、DbUserはDbQueryを継承して接続を作成します。そうすれば、データベースの対話コードをDb {ClassName}クラスとDbQueryに完全に保持できます。あなたがコードを本当に整理しておきたいのであれば、本当に役に立ちます。

単純なシナリオ: 特定のユーザーのプロファイルを表示するページ要求を取得すると、単にUser.GetUser(id);を実行します。idはユーザーのユーザーIDです。 Userクラスには静的メソッドGetUserがあり、DbUserの新しいインスタンスを作成し、そこでgetUserメソッドを呼び出します。 DbUser内のgetUserメソッドはデータベースへの接続とクエリを作成し、Userとvoilaのインスタンスを返します。

私の答えが正しい方向に役立つことを願っていますが、それは少し話題かもしれません。

更新:ドメイン層をウェブサイトから切り離すと、同じデータベースとやりとりする別のプロジェクトにクラスライブラリを再利用するなど、より多くの選択肢があります。

3

私はデータアクセスレイヤーにも行くつもりですが、より直接的に質問に答えるために、ここではASP.NETでこれをやってトランザクションを処理する方法を説明します。

  1. オーバーライドOnPreInit:、接続を初期化し、それを開いて、新しいトランザクションを開始
  2. オーバーライドONUNLOAD:コミット/ロールバックトランザクション、近くに接続
  3. オーバーライド廃棄:接続とトランザクション
  4. の両方を処分

I何か問題が生じた場合にトランザクションのロールバックを要求するために使用されるVoteRollback()メソッドを追加します。ページの実行は続行されます(コードで問題を処理する必要があります)が、ページがアンロードされるとトランザクションがロールバックされます。

関連する問題