开发者

Most efficient way of dealing with DBNull in .NET [duplicate]

开发者 https://www.devze.com 2023-04-13 07:04 出处:网络
This question already has answers here:开发者_开发百科 Closed 11 years ago. Possible Duplicate: What is the best way to deal with DBNull's
This question already has answers here: 开发者_开发百科 Closed 11 years ago.

Possible Duplicate:

What is the best way to deal with DBNull's

What is the most efficient syntax in .NET to set a variable that has a value of DBNull (aka SQL null value being returned)? I remember reading something that was put into .NET 3.0 for this sort of thing. Lets assume the variable I'm setting has a type of DateTime.

Common error:

Conversion from type 'DBNull' to type 'Date' is not valid.


DateTime is a value type, and can only contain valid date/times. Typically the way this is handled is to check your value returned from teh database to see if it's DBNull.Value, and if so set the DateTime to a special value like DateTime.MinValue which represents Null.

Alternatively you can use DateTime? which is a nullable DateTime datatype and you can actually assign it null (regular .Net null, not DBNull).

DateTime foo;
if (row["SomeField"] == DBNull.Value) {
    foo = DateTime.MinValue;
} else {
    foo = (DateTime)row["SomeField"];
}

You can make this syntax a little bit nicer by creating an extension method on a DataRow like so:

public static void ToDateTime(this DataRow row, string columnName) {
    if (row[columnName] == DBNull.Value) {
        return DateTime.MinValue;
    } else {
        return (DateTime)row[columnName];
    }
}

then you can rewrite the original code like this:

DateTime foo = row.ToDateTime("SomeField");


I usually get around this by making the property in my class a NULLABLE type. This is especially relevant to the bool type, since by default, it has no value (neither true nor false).

public class MyDbTable
    {
        public int MyId { get; set; }
        public DateTime? Date { get; set; }
        public bool? IsDirty { get; set; }
    }
0

精彩评论

暂无评论...
验证码 换一张
取 消