Question: I have code like this:

```
foreach (DataRow row in dataTable.Rows)
{
        if ((string)row["Forename"] != record.Forename)
        { 
             // Do something
        }
}

```

Works great but if `row["Forename"]` is `null` in the database, it is actually `DBNull` here and it can't cast `DBNull` to a string, or perform the comparison between `DBNull` and `string`. Some values are also `nullable<int>`, and it can't compare `DBNull` with `int?`

Is there a helper method to let me do nice comparisons or do I have to write an extension method myself?

Answer: 
You can use the [`DataRow.Field`](http://msdn.microsoft.com/en-us/library/bb360891%28v=vs.90%29.aspx) extension method which supports nullable types:

```
foreach (DataRow row in dataTable.Rows)
{
    int? id = row.Field<int?>("ID");
    if(id.HasValue)
    {
        Console.Write("ID: " + id.Value);
    }
}

```

Since `string` is a reference type it will be `null` by default. You can use [`DataRow.IsNull`](http://msdn.microsoft.com/en-us/library/3fwatee0%28v=vs.110%29.aspx) instead to check whether it is `DBNull.Value` or not:

```
foreach (DataRow row in dataTable.Rows)
{
    if(row.IsNull("Forename"))
    {
        // ...
    } 
    else
    {
        string foreName = row.Field<string>("Forename");
        Console.Write("ForeName: " + foreName);
    }
}

```
You can write your own extension method like this

```
public static T GetField<T>(this DataRow row,string columnName)
{
    object value = row[columnname];
    return (value != DbNull.Value)? (T)value : default(T);
}

```

Then you can use

```
if (row.GetField<string>(columnname) != record.Forename)
{ 
     // Do something
}

```

This extension should support nullable types also 

```
var value = row.GetField<int?>(columnname);

```

The only difference with [DataRowExtension.Field](http://msdn.microsoft.com/en-us/library/bb360891%28v=vs.110%29.aspx) and our implementation is that it will throw exception when we're trying to cast `DbNull.Value` to any value type(except nullable type) in such case this method will return default value.