views:

869

answers:

4

I have code that looks like:

//System.Data.IDataRecord dr
try
{
     Consolidated = Utility.NullConvert.ToBool(dr[Constants.Data.Columns.cConsolidated], false);
}
catch (IndexOutOfRangeException) { } //swallow

I don't know if the consolidated column will be present in the datareader, so I do that to check, works fine (little hackish though).

When I attach a debugger though, it breaks on that whenever it throws the exception however. Extremely annoying.

Is there a better way to write that code; or is there some Visual-Studio way of telling it to ignore the exception and not break (but only right here; not everywhere).

+2  A: 

Yes, you can use the GetSchemaTable() method of the datareader to get a list of columns, then you can see if that column exists.

You might find this very similar question helpful.

Mitchel Sellers
I had to cast the interface; but this worked well. I couldn't use GetOrdinal as this threw the same exception I was trying to avoid.
Tom Ritter
+1  A: 

I would simply use GetOrdinal() at the start of the loop to find the column indexes first (and store in a variable). Then just check whether it is >=0. This has the advantage of improving performance too (as long as you then use this integer for all access, not the name).

And no, there is no elegant way of ignoring a particular exception. You could catch and swallow, but that is not a good approach.

Marc Gravell
A: 

You can simply use the follwing code:-

reader.GetSchemaTable().Columns.Contains("Your_Column")

This will return a boolean

eg.

If reader.GetSchemaTable().Columns.Contains("ContactID") Then
   ' DO SOMETHING
End If
Kevin Dark
+1  A: 

I'm afraid the solution with:

"reader.GetSchemaTable().Columns.Contains("Your_Column")"

does not work.

gvdamn