jwcolby
jwcolby at colbyconsulting.com
Sun Jul 25 21:08:33 CDT 2010
Michael, > I see you have made a lot of progress over the weekend. I made awesome progress on two different fronts. I got NLog working (to a file, not to SQL Server) and I got some stuff figured out on C# cleanup. I believe in logging, both errors and progress. I haven't had logging though, only specific application control stuff. > I think the reason is that the finalizer is indeterminate. So the 'close it when you no longer need it' rule still applies. I understand "close when you no longer need it". I did think that the the Dispose method forced the garbage collector to take care of that specific object right then and there. I thought that in the case of SQL Server or other database objects, that immediate cleanup would be a good thing. John W. Colby www.ColbyConsulting.com Michael Maddison wrote: > Hi John, > > I see you have made a lot of progress over the weekend. > > Now that you have moved this method into its own class, make sure you > don't ... > ' call Close or Dispose on a Connection, a DataReader, or any other > managed object > in the Finalize method of your class' which is what I think MS was > saying in you previous message. > I think the reason is that the finalizer is indeterminate. So the 'close > it when you no longer need it' rule still applies. > > Cheers > > Michael M > > > -----Original Message----- > From: dba-vb-bounces at databaseadvisors.com > [mailto:dba-vb-bounces at databaseadvisors.com] On Behalf Of jwcolby > Sent: Monday, 26 July 2010 6:08 AM > To: VBA > Subject: [dba-VB] C# - rigorous programming > > I had a bunch of code to open connections, command objects and a reader, > do something with the reader and then close it all. it is not a trivial > amount of code if you are going to try and wrap it in a try / catch and > properly close the stuff. So I wrote the following code: > > public static SqlDataReader GetDataReader(string strCnn, string > strSQL) > { > SqlConnection mCnn = null; > SqlCommand myCommand = null; > SqlDataReader myDR; > try > { > mCnn = new SqlConnection(strCnn); > mCnn.Open(); > myCommand = new SqlCommand(strSQL, mCnn); > myDR = myCommand.ExecuteReader(); > return myDR; > } > catch (SqlException) > { > throw; > } > catch (Exception) > { > throw; > } > finally > { > if (myCommand != null) > { > myCommand.Dispose(); > myCommand = null; > } > if (mCnn != null) > { > mCnn.Close(); > } > } > } > > > Which basically just took the three pieces and wrapped them. > > Unfortunately it doesn't work because the reader closes if the > connection closes. It seems that the reader only holds one record at a > time and when the next record is asked for goes and gets it on demand. > > But look at all of the code required to get around the C# syntax police. > The objects have to be dimensioned before the try, the try has to wrap > the object opens in case they fail (the point of the > try) and the finally has to close everything back down correctly, but > now have to be checked against null because they might in fact be null > which would trigger another error trying to close an object that isn't > opened. > > So what's a poor boy to do? > > I decided to build a class to do this and then use a property to expose > the reader. The class correctly cleans up when it is destroyed. That > seems to work. > > -- > John W. Colby > www.ColbyConsulting.com > _______________________________________________ > dba-VB mailing list > dba-VB at databaseadvisors.com > http://databaseadvisors.com/mailman/listinfo/dba-vb > http://www.databaseadvisors.com > > > _______________________________________________ > dba-VB mailing list > dba-VB at databaseadvisors.com > http://databaseadvisors.com/mailman/listinfo/dba-vb > http://www.databaseadvisors.com > >