How to get nullable DateTime out of the database

后端 未结 7 1464
滥情空心
滥情空心 2020-12-01 18:04

My SQL Server database contains nullable DateTime values. How can I convert them to a nullable DateTime object in my application in C#?

This is what I would think it

7条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-12-01 18:58

    A while ago, I wrote a bunch of extension methods for a DataRow to do just this sort of downcasting...because I hate writing repetitive drivel. Usage is simple:

    foreach( DataRow dr in someDataTable )
    {
      DateTime? dt = dr.CastAsDateTimeNullable( "lastUpdated" ) ;
      int       id = dr.CastAsInt( "transactionID" ) ;
      // etc.
    }
    

    Here's the piece for DateTime values. Adding implementation for for other data types should be pretty trivial. Wouldn't be difficult to do the same sort of thing to a DataReader if one was so inclined.

    I tried to come up with generic methods, but limitations in the way generics are done made it difficult or impossible to do and still get the behavior I wanted (e.g., null values rather than default(T) — getting default values for SQL NULLs that would make differentiating between 0 and null...difficult).

    public static class DataRowExtensions
    {
    
      #region downcast to DateTime
    
      public static DateTime CastAsDateTime( this DataRow row , int index )
      {
        return toDateTime( row[index] ) ;
      }
      public static DateTime CastAsDateTime( this DataRow row , string columnName )
      {
        return toDateTime( row[columnName] ) ;
      }
    
      public static DateTime? CastAsDateTimeNullable( this DataRow row , int index )
      {
        return toDateTimeNullable( row[index] );
      }
      public static DateTime? CastAsDateTimeNullable( this DataRow row , string columnName )
      {
        return toDateTimeNullable( row[columnName] ) ;
      }
    
      #region conversion helpers
    
      private static DateTime toDateTime( object o )
      {
        DateTime value = (DateTime)o;
        return value;
      }
    
      private static DateTime? toDateTimeNullable( object o )
      {
        bool  hasValue = !( o is DBNull );
        DateTime? value    = ( hasValue ? (DateTime?) o : (DateTime?) null ) ;
        return value;
      }
    
      #endregion
    
      #endregion downcast to DateTime
    
      // ... other implementations elided .. for brevity
    
    }
    

提交回复
热议问题