복붙노트

[SQL] using 문 내부 SqlConnection.Close ()

SQL

using 문 내부 SqlConnection.Close ()

이 코드를 사용하고 있습니다 :

    public void InsertMember(Member member)
    {
        string INSERT = "INSERT INTO Members (Name, Surname, EntryDate) VALUES (@Name, @Surname, @EntryDate)";

        using (sqlConnection = new SqlConnection(sqlConnectionString_WORK))
        {
            sqlConnection.Open();

            using (SqlCommand sqlCommand = new SqlCommand(INSERT, sqlConnection))
            {
                sqlCommand.Parameters.Add("@Name", SqlDbType.VarChar).Value = member.Name;
                sqlCommand.Parameters.Add("@Surname", SqlDbType.VarChar).Value = member.Surname;
                sqlCommand.Parameters.Add("@EntryDate", SqlDbType.Date).Value = member.EntryDate;

                sqlCommand.ExecuteNonQuery();
            }
        }
    }

내가 sqlConnection.Close ()를 추가하지 않으면 그것은 잘못된 것입니다; 그것을 폐기하기 전에? 내말은. 그것은 오류, 전혀 문제를 보여주는 아니에요. 먼저 닫습니다 더 나은가요? 예라면, 왜?

해결법

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

    1.닫기 또는 폐기하십시오 사용하여 블록에 필요가 당신을 위해 알아서하지 않습니다.

    닫기 또는 폐기하십시오 사용하여 블록에 필요가 당신을 위해 알아서하지 않습니다.

    MSDN에서 언급 한 바와 같이 :

    private static void OpenSqlConnection(string connectionString) 
    {
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();
            Console.WriteLine("ServerVersion: {0}", connection.ServerVersion);
            Console.WriteLine("State: {0}", connection.State);
        } 
    }
    
  2. ==============================

    2.using 문은 폐기 당신이 객체에 메소드를 호출하는 동안 예외가 발생하더라도라고 보장합니다. 당신은 try 블록 내부의 객체를 넣어 다음 finally 블록에서 폐기를 호출하여 동일한 결과를 얻을 수 있습니다; 사실,이 using 문은 컴파일러에 의해 번역됩니다 방법이다. MSDN

    using 문은 폐기 당신이 객체에 메소드를 호출하는 동안 예외가 발생하더라도라고 보장합니다. 당신은 try 블록 내부의 객체를 넣어 다음 finally 블록에서 폐기를 호출하여 동일한 결과를 얻을 수 있습니다; 사실,이 using 문은 컴파일러에 의해 번역됩니다 방법이다. MSDN

    그래서 궁극적으로 코드 라인

      using (sqlConnection = new SqlConnection(sqlConnectionString_WORK))
    

    일반 시도로 변환됩니다 마침내 최종적으로는 IDisposable 개체를 호출 컴파일러에 의해 차단

  3. ==============================

    3.Close 메서드에 대한 MSDN 문서에 따르면 :

    Close 메서드에 대한 MSDN 문서에 따르면 :

    따라서, Dispose를 호출 한 (암시 그래서, 심지어 사용하여 사용) 말하자면, 당신의 기지를 다룰 것입니다.

    그것의 가치도 나는 일이 using 문에 싸여되면 닫기를 항상 효율적으로 호출 될 것입니다,하지만 귀하의 경우에 국한되지 생각, 지적 -이 생략해야하는 경우하지 않을 수있는 예외가 적절한없이 발생 시도 / 잡기 / 마지막으로 처리.

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

    4.아니, 같은 당신이 사용 내 연결을 사용으로하지 않습니다. 당신이 사용 범위를 떠날 때, 폐기는 SQL 연결을 위해 호출됩니다. 이는뿐만 아니라 기존의 연결 및 자유까지의 모든 자원을 닫습니다.

    아니, 같은 당신이 사용 내 연결을 사용으로하지 않습니다. 당신이 사용 범위를 떠날 때, 폐기는 SQL 연결을 위해 호출됩니다. 이는뿐만 아니라 기존의 연결 및 자유까지의 모든 자원을 닫습니다.

  5. ==============================

    5.using 문은 시도가 마지막으로 차단하고 귀하의 경우 마지막 블록은 connection.Dispose () 호출을 것입니다. 당신은 정말 독립의 Connection.close () 문이 필요가 없습니다.

    using 문은 시도가 마지막으로 차단하고 귀하의 경우 마지막 블록은 connection.Dispose () 호출을 것입니다. 당신은 정말 독립의 Connection.close () 문이 필요가 없습니다.

    장점은 finally 블록은 항상 실행하기 때문에이 경우에도 예외의 경우에는 처분을 보장한다는 것입니다.

    try
    {
    sqlConnection.Open();
    // ....
    }
    finally
    {
    if(sqlConnection != null)
          sqlConnection.Dispose();
    }
    
  6. ==============================

    6.당신은 어떤을 사용하여 당신을 위해) (객체를 폐기합니다 사용하고 있습니다.

    당신은 어떤을 사용하여 당신을 위해) (객체를 폐기합니다 사용하고 있습니다.

    당신이 사용하는 문장의 연결 외부를 취할 경우, 예 - 당신이 때 완성 된 연결을 종료해야합니다.

  7. ==============================

    7.아니, 잘못이 아니다. SqlConnection이 블록을 사용하여 전달하고 폐기 메소드를 호출 한 후에 그 연결을 종료한다. SqlConnection.Dispose () SqlConnection.Close () 방법과 동일.

    아니, 잘못이 아니다. SqlConnection이 블록을 사용하여 전달하고 폐기 메소드를 호출 한 후에 그 연결을 종료한다. SqlConnection.Dispose () SqlConnection.Close () 방법과 동일.

    MSDN에서 :도록 SqlConnection이 범위를 벗어나면, 그것은 폐쇄되지 않습니다. 따라서 닫기 또는 폐기를 호출하여 연결을 명시 적으로 닫아야합니다. 닫기 및 폐기는 기능적으로 동일합니다.

  8. from https://stackoverflow.com/questions/18588049/sqlconnection-close-inside-using-statement by cc-by-sa and MIT license