복붙노트

[SQL] 수동 가까이 SqlDataReader 개체의 처분 할 필요가 있습니까?

SQL

수동 가까이 SqlDataReader 개체의 처분 할 필요가 있습니까?

여기 레거시 코드로 일하고 있어요 및 폐쇄하거나 배치 않습니다 SqlDataReader 개체의 많은 경우가있다. 연결이 나는 확실히 그것을 수동으로 독자를 관리하기 위해 필요한 경우 아니다, 닫혀 있지만.

이 성능 저하가 발생할 수 있을까요?

해결법

  1. ==============================

    1.이 같은 독자를 사용하지 않도록하십시오 :

    이 같은 독자를 사용하지 않도록하십시오 :

    SqlConnection connection = new SqlConnection("connection string");
    SqlCommand cmd = new SqlCommand("SELECT * FROM SomeTable", connection);
    SqlDataReader reader = cmd.ExecuteReader();
    connection.Open();
    if (reader != null)
    {
          while (reader.Read())
          {
                  //do something
          }
    }
    reader.Close(); // <- too easy to forget
    reader.Dispose(); // <- too easy to forget
    connection.Close(); // <- too easy to forget
    

    대신 문을 사용하여 그들을 포장 :

    using(SqlConnection connection = new SqlConnection("connection string"))
    {
    
        connection.Open();
    
        using(SqlCommand cmd = new SqlCommand("SELECT * FROM SomeTable", connection))
        {
            using (SqlDataReader reader = cmd.ExecuteReader())
            {
                if (reader != null)
                {
                    while (reader.Read())
                    {
                        //do something
                    }
                }
            } // reader closed and disposed up here
    
        } // command disposed here
    
    } //connection closed and disposed here
    

    using 문은 개체의 정확한 처리를 보장하고 자원을 해제합니다.

    당신은 당신이 걸릴 수 가비지 컬렉터, 최대 청소를 떠나 잊어 버린 경우.

  2. ==============================

    2.SqlDataReader 개체를 배치하는 것은를 SqlCommand.ExecuteReader를 (사용하여 인스턴스화하는 것이 주) 닫지 / 기본 연결을 처리합니다.

    SqlDataReader 개체를 배치하는 것은를 SqlCommand.ExecuteReader를 (사용하여 인스턴스화하는 것이 주) 닫지 / 기본 연결을 처리합니다.

    일반적인 두 가지 패턴이있다. 제에서, 리더가 개방되고, 연결의 범위 내에서 폐쇄 :

    using(SqlConnection connection = ...)
    {
        connection.Open();
        ...
        using(SqlCommand command = ...)
        {
            using(SqlDataReader reader = command.ExecuteReader())
            {
                ... do your stuff ...
            } // reader is closed/disposed here
        } // command is closed/disposed here
    } // connection is closed/disposed here
    

    때로는 데이터 액세스 방법은 연결을 열고 독자를 반환하도록 편리합니다. 이 경우는 마감이 / 독자를 폐기하는 것은 기본 연결을 닫습니다 있도록 반환 독자가, 위해 CommandBehavior.CloseConnection을 사용하여 열 것이 중요합니다. 패턴은 다음과 같은 :

    public SqlDataReader ExecuteReader(string commandText)
    {
        SqlConnection connection = new SqlConnection(...);
        try
        {
            connection.Open();
            using(SqlCommand command = new SqlCommand(commandText, connection))
            {
                return command.ExecuteReader(CommandBehavior.CloseConnection);
            }
        }
        catch
        {
            // Close connection before rethrowing
            connection.Close();
            throw;
        }
    }
    

    및 호출 코드는 이렇게 독자를 처리 할 필요가 :

    using(SqlDataReader reader = ExecuteReader(...))
    {
        ... do your stuff ...
    } // reader and connection are closed here.
    
  3. ==============================

    3.안전하려면 사용 성명에서 모든 SqlDataReader 개체 개체를 래핑.

    안전하려면 사용 성명에서 모든 SqlDataReader 개체 개체를 래핑.

  4. ==============================

    4.그냥 문을 "사용"하여 SqlDataReader 개체를 래핑. 그건 당신이 문제의 대부분의주의를 기울여야한다.

    그냥 문을 "사용"하여 SqlDataReader 개체를 래핑. 그건 당신이 문제의 대부분의주의를 기울여야한다.

  5. from https://stackoverflow.com/questions/744051/is-it-necessary-to-manually-close-and-dispose-of-sqldatareader by cc-by-sa and MIT license