tags:

views:

247

answers:

6

I have browsed thru other postings on S/O, but I can't find a solution that works for me.

I have a datareader that might return a null value, and if so, I want to value to equal blank

txtMiddleName.Text = rdrGetUserInfo.GetString(1) ?? "";

The string above does not work. When I walk thru the code, the code jumps to my error trapping block;

Any ideas?

+1  A: 

It's because the rdrGetUserInfo is returning DBNull which is a class.

Before getting the string do a check for dbnull it's something like (been a while since I used one!):

if (!rdrGetUserInfo.IsDBNull("someField"))
 txtMiddleName.Text = rdrGetUserInfo.GetString(1);
Fermin
A: 

You should check the column for DbNull before calling GetString.

klausbyskov
+5  A: 

Try txtMiddleName.Text = rdrGetUserInfo.IsDBNull(1) ? "" : rdrGetUserInfo.GetString(1);

Mark
Is it me or does anyone else hate "", use String.Empty its cleaner. More .net.
JonH
Works perfectly Mark. Also using String.Empty (thanks JonH)
user279521
+2  A: 

You can use the IsDBNull method on the DataReader.

if (!rdrGetUserInfo.IsDBNull(1))
{
    txtMiddleName.Text = rdrGetUserInfo.GetString(1);
}
Andy Shellam
+1  A: 
If(rdr("Field") == DBNull.Value) 
  'assign String.Empty 
myString = string.Empty;
else
  'assign value
   myString = rdr("Field");

Or to shorten this up you could do this:

txtMiddleName.Text = rdrGetUserInfo.IsDBNull(1) ? String.Empty : rdrGetUserInfo.GetString(1);
JonH
A: 

IsDbNull(int) is usually much slower that using methods like GetSqlInt32 and then comparing to DBNull.Value or using it's own .IsNull Like:

    public static int Int32(this SqlDataReader r, int ord)
    {
        var t = r.GetSqlInt32(ord);
        return t.IsNull ? default(int) : t.Value;
    }

Tried a few template solutions but to no avail so far. The problem is that all Sql-types (SqlInt32 here) types are actually structs and while they all have .Value property C# doesn't have real templates to handle that. Also they have their own INullable interface which has only .IsNull and is not conpatible with Nyllable<>.

I suspect that one would need full set of Sql-types as C# templates or to add ICOnvertible to them in order to be able to have just one or two templated methods.

If someone has maybe an idea with a functional trick or two speak up :-)

ZXX