Home All Groups Group Topic Archive Search About

Specified cast is not valid, when column returns NULL

Author
6 Apr 2006 12:30 AM
Web learner
while (dr.Read())
//dr is an instance of sqlDataReader
{
    double minAirTemp = (double)(Single)dr["minAirTemp"];
    // minAirTemp is column in SQLExpress table  (data type: real, allows nulls)
}

The above code works. But when there are NULL, I get the following error
System.InvalidCastException: Specified cast is not valid

To solve this problem, I spent a day on Google. Finally I got a hint from http://www.codeproject.com/cs/database/SmartReader.asp and replaced the code line in while{} as follows:

double minAirTemp1 = (dr.IsDBNull(dr.GetOrdinal("minAirTemp1")))
? 9999 : double.Parse(dr["minAirTemp1"].ToString()); //9999 to respresent nulls

This works for me for now. But just wondering, whether there is a better method to deal with such a situation????

Can someone be kind to point me to some suitable reference !

Thanks !

Author
6 Apr 2006 12:41 AM
Jim Hughes
VS2005 has a double.TryParse

If the TryParse failes, then set the value to DBNull.Value
"Web learner" <begin***@learning.edu> wrote in message
news:uWdFHFRWGHA.1192@TK2MSFTNGP04.phx.gbl...
while (dr.Read())
//dr is an instance of sqlDataReader
{
    double minAirTemp = (double)(Single)dr["minAirTemp"];
    // minAirTemp is column in SQLExpress table  (data type: real, allows
nulls)
}

The above code works. But when there are NULL, I get the following error
System.InvalidCastException: Specified cast is not valid

To solve this problem, I spent a day on Google. Finally I got a hint from
http://www.codeproject.com/cs/database/SmartReader.asp and replaced the code
line in while{} as follows:

double minAirTemp1 = (dr.IsDBNull(dr.GetOrdinal("minAirTemp1")))
? 9999 : double.Parse(dr["minAirTemp1"].ToString()); //9999 to respresent
nulls
This works for me for now. But just wondering, whether there is a better
method to deal with such a situation????
Can someone be kind to point me to some suitable reference !
Thanks !
Author
6 Apr 2006 12:46 AM
Flinky Wisty Pomm
I have a big class called SqlHelper full of methods like:

public static decimal GetReaderDecimal(IDataRecord dr, int column,
decimal ifNull)
{
   return dr.IsDBNull(column)? ifNull : dr.GetDecimal(column);
}
Author
6 Apr 2006 3:46 AM
Bruce Wood
I did roughly the same thing in C# 1.1: write a static helper method to
which you pass the row, the column name, and the default value, and it
returns the value. I had one for each primitive type, including one for
strings.

In C# 2.0 there are nullable types, but I'm not sure how they are at
mediating between DbNull and null.
Author
6 Apr 2006 6:18 AM
Martin Carpella
"Bruce Wood" <brucew***@canada.com> writes:

> In C# 2.0 there are nullable types, but I'm not sure how they are at
> mediating between DbNull and null.

In C# 2.0 you can use the "as" operator in conjunction with nullable
types, e.g.:

IDataReader r = ...;
int? val = r["MyColumn"] as int?;

This will gracefully handle the case that r["MyColumn"] contains a
DbNull.

Best regards,
Martin
Author
6 Apr 2006 6:26 PM
Web learner
For a beginner like me,the whole scenario is overwhelmingly confusing. It is
hard to figure out what is legacy and what is cutting-edge elegant methods.

Can someone be kind to point out to latest tutorial material on this topic?
Please refer to my original messsage.

Thanks !


Show quote
"Bruce Wood" <brucew***@canada.com> wrote in message .
>I did roughly the same thing in C# 1.1: write a static helper method to
> which you pass the row, the column name, and the default value, and it
> returns the value. I had one for each primitive type, including one for
> strings.
>
> In C# 2.0 there are nullable types, but I'm not sure how they are at
> mediating between DbNull and null.
>

AddThis Social Bookmark Button