I have this following method:
public static T Get<T>(this DbDataReader reader, int ordinal, Func<T> @default)
{
if(reader.IsDBNull(ordinal))
return @default();
return reader.GetFieldValue<T>(ordinal);
}
When I try to call this with T=DateTime
I get the following exception:
System.InvalidCastException was unhandled by user code
HResult=-2147467262
Message=Specified cast is not valid.
Source=System.Data
StackTrace:
at System.Data.Common.DbDataReader.GetFieldValue[T](Int32 ordinal)
...
The method seems to work fine for other types like strings and numeric types. Does the generic GetFieldValue<T>
method simply not work for dates, or have I done something wrong here?
I have fixed it by handling the DateTime
case using the specific GetDateTime
method instead, but would still like to know if I could get rid of this annoying hack somehow.
public static T Get<T>(this DbDataReader reader, int ordinal, Func<T> @default)
{
if(reader.IsDBNull(ordinal))
return @default();
switch(Type.GetTypeCode(typeof(T)))
{
case TypeCode.DateTime:
return (T)(object)reader.GetDateTime(ordinal);
default:
return reader.GetFieldValue<T>(ordinal);
}
}