It's not uncommon that you have a method that accepts an object that implements the IDataRecord or IDataReader interface. It's also not uncommon that you cannot (fully) control the query that drives the IDataRecord. It could be the result of a SELECT * operation (bad idea) or it could be the results of a Stored Procedure for example. Especially in the latter case, it can be useful if you can check whether the IDataRecord contains a specific field. For example, you may want to check if the IDataRecord has a field called LastModified before you try to read and store this field in a local DateTime variable.
Unfortunately, the IDataRecord and IDataReader do not implement this behavior directly. However, it's easy to add with a simple extension method.

Ferdy Christant (also from the Netherlands) recently developed Blogo.NET, a blogging application built with .NET 3.5 and based on the architecture from my
article series on N-Layer design.
Sometime ago I was working on a Web Application Project in Visual Studio 2008. The web site I was working on couldn't run against the built-in web development server, so I ran the application against IIS 7 on my Windows Vista machine (IMO, that's probably the best reason to upgrade to Windows Vista if you are a web developer: multiple web sites in IIS 7).
Life was good until I started debugging...
I just uploaded a ZIP file with four MyGeneration templates to generate C# and SQL code that matches the model in my articles about N-Layer design.
A colleague (from Design IT)
and I were discussing a simple way to check two instances of an object. We wanted
to know if all the public properties on one instance were holding the same values
as the one on the other instance. We wanted to use this knowledge in a few unit
tests to simply check all public fields on an instance in one fell swoop.
Since we didn't want this exact behavior at run-time we couldn't override
Equals and check all object's properties, so we had to look for a different
solution.
For some reason, the IDataRecord interface and classes that implement it (DbDataReader, SqlDataReader and so on) only have Get* methods that accept the zero-based column index of a column in the result set. They don't allow you to get data by specifying a column name. As an example, consider the private FillDataRecord method to fill an e-mail address, as discussed in my article series about N-Layer development.
private static EmailAddress FillDataRecord(IDataRecord myDataRecord)
{
EmailAddress myEmailAddress = new EmailAddress();
myEmailAddress.Id =
myDataRecord.GetInt32(myDataRecord.GetOrdinal("Id"));
myEmailAddress.Email =
myDataRecord.GetString(myDataRecord.GetOrdinal("Email"));
// More fields here
return myEmailAddress;
}
The GetInt32 and GetString methods only have a single overload: one that accepts the zero-based index of the column. To satisfy these method signatures and make your code more readable at the same time, you can use GetOrdinal as shown in the previous example. Based on the column's name, GetOrdinal returns the column index. So, given the fact that the Id column is the first in the result set and Email the second, the previous piece of code equates to this:
myEmailAddress.Id = myDataRecord.GetInt32(0);
myEmailAddress.Email = myDataRecord.GetString(1);
Clearly, this is much more difficult to read and maintain than the previous example as you need to know the column indices and you should take great care not to mess with the column order in your select statements.
With a few extension methods, you can have the short syntax of the latter example, but still have readable code as the first example.

Do you feel that the standard
Split implementation of the
String class is a bit awkward to use? Do you keep forgetting you have to declare a char array for the separator? And do you often need to split on multiple characters, like
\r\n to split on a line break? In that case, read on. A simple extension method might fix that for you.

After almost a year of hard work, today was the day: my new ASP.NET book arrived.

The demo web site that is used in my new book -
www.planetwrox.com - is now available on-line.

I just spent some time answering a question I received from someone called Bill who found an old thread on the
p2p.wrox.com forum. 10 seconds after I sent my reply, I received the following automatic reply.