1. ホーム
  2. c#

[解決済み] using" ブロックで、SqlConnection は return または exception で閉じますか?

2022-05-09 07:09:53

質問

最初の質問です。

例えば

using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();

    string storedProc = "GetData";
    SqlCommand command = new SqlCommand(storedProc, connection);
    command.CommandType = CommandType.StoredProcedure;
    command.Parameters.Add(new SqlParameter("@EmployeeID", employeeID));

    return (byte[])command.ExecuteScalar();
}

コネクションはクローズされるのですか?なぜなら、技術的には最後の } として return の前にあります。

2つ目の質問です。

今回、私は

try
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        int employeeID = findEmployeeID();

        connection.Open();
        SqlCommand command = new SqlCommand("UpdateEmployeeTable", connection);
        command.CommandType = CommandType.StoredProcedure;
        command.Parameters.Add(new SqlParameter("@EmployeeID", employeeID));
        command.CommandTimeout = 5;

        command.ExecuteNonQuery();
    }
}
catch (Exception) { /*Handle error*/ }

ここで try エラーが発生し、それが捕捉されます。それでもコネクションは閉じられるのでしょうか?なぜなら、ここでもまた try に移動し、直接 catch ステートメントを使用します。

を直線的に考えすぎているのでしょうか? using はどのように機能するのでしょうか? Dispose() を離れるときに呼び出されるだけです。 using のスコープを使用しますか?

解決方法は?

  1. はい
  2. はい。

いずれにせよ、usingブロックが終了すると(正常終了でもエラーでも)、それは閉じられます。

になると思うけれど。 より良い のように整理しておくと、後でサポートする新しい保守プログラマーにとっても、何が起こるかわかりやすいからです。

using (SqlConnection connection = new SqlConnection(connectionString)) 
{    
    int employeeID = findEmployeeID();    
    try    
    {
        connection.Open();
        SqlCommand command = new SqlCommand("UpdateEmployeeTable", connection);
        command.CommandType = CommandType.StoredProcedure;
        command.Parameters.Add(new SqlParameter("@EmployeeID", employeeID));
        command.CommandTimeout = 5;

        command.ExecuteNonQuery();    
    } 
    catch (Exception) 
    { 
        /*Handle error*/ 
    }
}