[Okta Webinar] Learn how to a build a cloud-first strategyRegister Now

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 470
  • Last Modified:

Cleaning up after using an OleDbDataReader

Hi,

I have just been made aware that I need to call Dispose() when using an OleDbCommand.  I now do this in the "finally" block of the code to make sure it gets called when an exception is thrown.  But what about an OleDbDataReader?

Is this code appropriate?

OleDbDataReader driverRuns = dbSelectCommand1.ExecuteReader();             
driverRuns.Close();

If there is an exception in ExecuteReader(), does the Close() need to be called? I assume it's null anyway.  Then what about explicitly setting the OleDbDataReader to null?  This would be something I would also put into the finally block.

driverRuns = null;

Thanks,
Bob
0
ba272
Asked:
ba272
  • 2
  • 2
2 Solutions
 
Ravi SinghSenior Software EngineerCommented:
Hi Bob, if all your database related code is within one try catch block then its always good to do a null check on the object in the finally clause (to avoid any runtime null reference exceptions)... if not null then close the reader and dispose it explicitly... this should mark it for garbage collection.

..
OleDbDataReader driverRuns = null;

try
{
     //...
     driverRuns = dbSelectCommand1.ExecuteReader();
     //... use the reader
}
catch (Exception ex)
{
}
finally
{
     if (driverRuns != null)
     {
          driverRuns.Close();
          driverRuns.Dispose();
     }
}
0
 
dstanley9Commented:
Easiest way to handle this is to use a using block:

using(OleDbDataReader driverRuns = dbSelectCommand1.ExecuteReader())
{
  while(driverRuns.Read())
  {
   
  }
}

This automatically disposes the OleDbDataReader (which closes it) in a finally block without having to explicitly close or dispose of the reader.  Using blocks can be used around Commands and Connections as well.
0
 
ba272Author Commented:
I will use the "using" statement in the future.  But I have hundreds of uses of these objects and need a quick way to make them as safe as possible, and to prevent memory leaks.

So I like Zephyr's approach for now.  Except I don't find a Dispose() in the OleDbDataReader object.

Am I missing something?

Bob
0
 
Ravi SinghSenior Software EngineerCommented:
Hi, sorry the data reader doesnt expose the Dipose() method... calling close on the reader should do it
0
 
ba272Author Commented:
Ok.  No problem.

Thanks.
0

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

  • 2
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now