1

私はしばらくの間ウェブを検索していました。しかし、私の質問に対する明確な答えは見つかりませんでした。データベースに接続するときに「using」を使用する必要があるのか​​、それともtry-catch-finallyを使用するだけでよいのか。私が意味するのは:

データベースとの対話を終了するたびにdisposeメソッドを呼び出す必要があるのか​​、接続を閉じるだけなのかわかりません。

    static public List<Category> GetAll()
    {
        List<Category> CategoryList;

        try
        {
            BaseDAO.Dbconn.Open();
            BaseDAO.SetCommand(BaseDAO.CommandAction.Read, "SELECT * FROM Categories");

            CategoryList = new List<Category>();

            using (DbDataReader reader = BaseDAO.Dbcmd.ExecuteReader())
            {
                while (reader.Read())
                {
                    int ID = reader.GetInt32(reader.GetOrdinal("CategoryID"));
                    string Name = reader.GetString(reader.GetOrdinal("CategoryName"));
                    string Description = reader.GetString(reader.GetOrdinal("Description"));
                    CategoryList.Add(new Category(ID, Name, Description));
                }
            }
            return CategoryList;
        }
        catch (Exception ex)
        {
            BaseDAO.Dbconn.Dispose();
            throw ex;
        }
        finally { BaseDAO.Dbconn.Close(); }

    }

「Dbconnection」は静的であり、これが同様に良い解決策であるかどうかはわかりません...

私はADOについて知り始めており、この種の質問に対する最良の答えを知りたいと思っています。

4

3 に答える 3

3

それは何の違いもありません-あなたが好むものは何でも。とにかく、using句はtry-finallyコンパイラによってに変換されます。

編集例外が発生した場合にのみDisposeを呼び出していることに気づきました。これもfinally句に移動する必要があります。DisposeはCloseを呼び出すので、必要がない場合は特に呼び出す必要はありません。

さらに編集あなたが言うように、DbConnectionが静的であるとすると、Disposeを呼び出したくはありませんが、Closeを呼び出す必要があります。ただし、静的なDbConnectionを使用する必要はありません。接続プールが接続を効率的に処理します。コードは毎回新しい接続インスタンスを作成する必要があります。

于 2012-07-05T05:12:04.287 に答える
2

参照:ステートメントC#の使用。

usingステートメントを使用すると、プログラマーは、リソースを使用するオブジェクトがそれらを解放するタイミングを指定できます。

usingステートメントに提供されるオブジェクトは、IDisposableインターフェースを実装する必要があります。このインターフェイスは、オブジェクトのリソースを解放するDisposeメソッドを提供します。

usingステートメントは、usingステートメントの終わりに達したとき、または例外がスローされ、コントロールがステートメントの終わりの前にステートメントブロックを離れた場合に、終了できます。

参照:

Code Projectに従って、.NETCLRは変換します

 using (MyResource myRes = new MyResource())
 {     
     myRes.DoSomething();
 } 

に:

{ 
   // limits scope of myRes   
   MyResource myRes= new MyResource();    
  try    
  {        
    myRes.DoSomething();  
  }   
  finally   
  {        
     // Check for a null resource.        
     if (myRes!= null)            
     // Call the object's Dispose method.          
      ((IDisposable)myRes).Dispose();    
  } 
} 
于 2012-07-05T05:31:55.690 に答える
0

呼び出すことは、ほとんどの(すべてではないにしても)実装で呼び出すDisposeことと同等であるため、すでに後者を呼び出している場合は、前者を呼び出す必要はありません。例外がある場合に備えて、必ずそうしてください。CloseDbConnectionfinally

于 2012-07-05T05:44:50.780 に答える