tags:

views:

565

answers:

3

I'm attempting to use the DataSet designer to create a datatable from a query. I got this down just fine. The query used returns a nullable datetime column from the database. But, when it gets around to this code:

DataSet1.DataTable1DataTable table = adapter.GetData();

This throws a StrongTypingException from:

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
public System.DateTime event_start_date {
    get {
        try {
            return ((global::System.DateTime)(this[this.tableDataTable1.event_start_dateColumn]));
        }
        catch (global::System.InvalidCastException e) {
            throw new global::System.Data.StrongTypingException("The value for column \'event_start_date\' in table \'DataTable1\' is DBNull.", e);
        }
    }
    set {
        this[this.tableDataTable1.event_start_dateColumn] = value;
    }
}

How do I use the designer to allow this column to be Nullable?

A: 

It seems the Designer got the Database type for the column wrong.

Open up the xsd Designer, hit F4 to get the Properties Window open. Select the appropriate column and set "Nullable" (or something like that, don't remember the exact name) to true.

Johannes Rudolph
Yeah, tried. AllowDBNull is set to true. The NullValue property has only these options: Empty, (Null), and Throw Exception. The only one it will allow to set is Throw Exception.
yodaj007
The NullValue property is a red herring; its purpose is to provide values for null strings (you can provide null defaults for other types using the codegen attribute: http://rickyfaulstich.net/StichBLOG/archive/2003/12/05/194.aspx).
Jeff Sternal
A: 

The System.DateTime Object is not nullable. To make a DateTime nullable make it a DateTime? (put a ? after DateTime)

DateTime? nullableDateTime = null;
Aaron
Yes, I know this. The DataSet designer does not accept a "DateTime?" datatype, however.
yodaj007
+2  A: 

Typed data sets don't support nullable types. They support nullable columns.

The typed data set generator creates non-nullable properties and related methods for handling null values. If you create a MyDate column of type DateTime and AllowDbNull set to true, the DataRow subclass will implement a non-nullable DateTime property named MyDate, a SetMyDateNull() method, and an IsMyDateNull() method. This means that if you want to use a nullable type in your code, you have to do this:

DateTime? myDateTime = (DateTime?) myRow.IsMyDateNull() ? null : row.MyDate;

While this doesn't totally defeat the purpose of using typed data sets, it really sucks. It's frustrating that typed data sets implement nullable columns in a way that's less usable than the System.Data extension methods, for instance.

Is particularly bad because typed data sets do use nullable types in some places - for instance, the Add<TableName>Row() method for the table containing the nullable DateTime column described above will take a DateTime? parameter.

Long ago, I asked about this issue on the MSDN forums, and ultimately the ADO project manager explained that nullable types were implemented at the same time as typed data sets, and his team didn't have time to fully integrate the two by .NET 2.0's ship date. And so far as I can tell, they haven't added new features to typed data sets since then.

Robert Rossney