Search code examples
c#ado.netsqlconnectionsqlcommand

Is it necessary to dispose SqlConnection as well as SqlCommand?


Is it necessary to separately dispose of a SqlConnection as well as a SqlCommand?

I'm doing some maintenance work on an application and found the following code:

public void CallStoredProc(string storedProcName)
{
    using (SqlCommand command = new SqlCommand(storedProcName, CreateConnection()))
    {
        command.CommandType = CommandType.StoredProcedure;
        command.Connection.Open();

        // Additional code here.

        command.ExecuteNonQuery();
    }
}

Will this clean up the SqlConnection properly, under normal circumstances as well as if there is an error? Or would we have to alter the code to something like:

public void CallStoredProc(string storedProcName)
{
    using (SqlConnection connection = CreateConnection())
    {
        using (SqlCommand command = new SqlCommand(storedProcName, connection))
        {
            command.CommandType = CommandType.StoredProcedure;
            command.Connection.Open();

            // Additional code here.

            command.ExecuteNonQuery();
        }
    }
}

Solution

  • Yes, you will have to dispose (of) the connection separately. You can also see this in the source code: SqlCommand.Dispose() does not close or dispose the connection it uses (by the way, that would be bad anyway as you could not execute multiple commands with the same connection).