views:

90

answers:

1

We are getting the following warning from Code Analysis in Visual Studio 2010 and I'm wondering if this is a false positive that we can safely ignore or the code should be refactored to correctly dispose the object.

The relevant code:

public void MyFunction()
{
    OracleConnection oraConnection = null;
    OracleCommand oraCommand = null;

    try
    {
        // Connect to the database
        oraConnection = new OracleConnection(connectionString);
        oraConnection.Open();
        // Prepare and run the query
        oraCommand = new OracleCommand(sqlQuery, oraConnection);
        oraCommand.ExecuteNonQuery();
    }
    catch { throw; }
    finally
    {
        // Perform a safe cleanup
        if (oraCommand != null) { oraCommand.Dispose(); }
        if (oraConnection != null)
        {
            oraConnection.Close();
            oraConnection.Dispose();
        }
    }
}

The relevant error message:

Warning 18 CA2202 : Microsoft.Usage : Object 'oraConnection' can be disposed more than once in method 'ClassName.MyFunction()'. To avoid generating a System.ObjectDisposedException you should not call Dispose more than one time on an object.

+1  A: 

If you remove the line:

oraConnection.Close();

it should get rid of the warning, since closing and disposing a connection are essentially the same thing.

You might also want to replace your try/finally by a using statement.

Note that Microsoft's own guidelines say that IDisposable.Dispose should be implemented in such a way that it can safely be called multiple times. Which means that the CA2202 warning can safely be ignored, as noted in the comment by JoeM27 on the MSDN page for CA2202.

Joe
I dug around in the Oracle documentation for ODP.NET and they indicate that OracleConnection.Dispose() calls the Close method so it looks like the guidelines are going to be updated to just call the Dispose method.
Rob