@@ -37,7 +37,7 @@ internal static IDataReader ExecReader(this IDbCommand dbCmd, string sql)
37
37
{
38
38
dbCmd . CommandTimeout = OrmLiteConfig . CommandTimeout ;
39
39
dbCmd . CommandText = sql ;
40
-
40
+
41
41
if ( Log . IsDebugEnabled )
42
42
Log . DebugCommand ( dbCmd ) ;
43
43
@@ -274,7 +274,7 @@ internal static IDbCommand SetParameters(this IDbCommand dbCmd, object anonType,
274
274
275
275
internal static IDbCommand SetParameters ( this IDbCommand dbCmd , IDictionary < string , object > dict , bool excludeDefaults )
276
276
{
277
- if ( dict == null )
277
+ if ( dict == null )
278
278
return dbCmd ;
279
279
280
280
dbCmd . Parameters . Clear ( ) ;
@@ -377,17 +377,17 @@ internal static T Single<T>(this IDbCommand dbCmd, string sql, IEnumerable<IDbDa
377
377
{
378
378
dbCmd . SetParameters ( sqlParams ) ;
379
379
380
- return OrmLiteUtils . IsScalar < T > ( )
381
- ? dbCmd . Scalar < T > ( sql )
380
+ return OrmLiteUtils . IsScalar < T > ( )
381
+ ? dbCmd . Scalar < T > ( sql )
382
382
: dbCmd . ConvertTo < T > ( dbCmd . GetDialectProvider ( ) . ToSelectStatement ( typeof ( T ) , sql ) ) ;
383
383
}
384
384
385
385
internal static T Single < T > ( this IDbCommand dbCmd , string sql , object anonType )
386
386
{
387
387
dbCmd . SetParameters < T > ( anonType , excludeDefaults : false ) ;
388
388
389
- return OrmLiteUtils . IsScalar < T > ( )
390
- ? dbCmd . Scalar < T > ( sql )
389
+ return OrmLiteUtils . IsScalar < T > ( )
390
+ ? dbCmd . Scalar < T > ( sql )
391
391
: dbCmd . ConvertTo < T > ( dbCmd . GetDialectProvider ( ) . ToSelectStatement ( typeof ( T ) , sql ) ) ;
392
392
}
393
393
@@ -509,7 +509,7 @@ internal static List<T> SelectNonDefaults<T>(this IDbCommand dbCmd, object filte
509
509
510
510
internal static List < T > SelectNonDefaults < T > ( this IDbCommand dbCmd , string sql , object anonType = null )
511
511
{
512
- if ( anonType != null ) dbCmd . SetParameters < T > ( anonType , excludeDefaults : true ) ;
512
+ if ( anonType != null ) dbCmd . SetParameters < T > ( anonType , excludeDefaults : true ) ;
513
513
514
514
return dbCmd . ConvertToList < T > ( dbCmd . GetDialectProvider ( ) . ToSelectStatement ( typeof ( T ) , sql ) ) ;
515
515
}
@@ -575,7 +575,7 @@ private static IEnumerable<T> ColumnLazy<T>(this IDbCommand dbCmd, string sql)
575
575
if ( value == DBNull . Value )
576
576
yield return default ( T ) ;
577
577
else
578
- yield return ( T ) value ;
578
+ yield return ( T ) value ;
579
579
}
580
580
}
581
581
}
@@ -655,34 +655,38 @@ internal static T Scalar<T>(this IDataReader reader, IOrmLiteDialectProvider dia
655
655
{
656
656
while ( reader . Read ( ) )
657
657
{
658
- object oValue = reader . GetValue ( 0 ) ;
659
- return typeof ( T ) == typeof ( object )
660
- ? ( T ) oValue
661
- : ToScalar < T > ( dialectProvider , oValue ) ;
658
+ return ToScalar < T > ( dialectProvider , reader ) ;
662
659
}
663
660
664
661
return default ( T ) ;
665
662
}
666
663
667
- internal static T ToScalar < T > ( IOrmLiteDialectProvider dialectProvider , object oValue )
664
+ internal static T ToScalar < T > ( IOrmLiteDialectProvider dialectProvider , IDataReader reader , int columnIndex = 0 )
668
665
{
669
- if ( oValue == DBNull . Value ) return default ( T ) ;
666
+ var nullableType = Nullable . GetUnderlyingType ( typeof ( T ) ) ;
667
+ if ( nullableType != null )
668
+ {
669
+ object oValue = reader . GetValue ( columnIndex ) ;
670
+ if ( oValue == DBNull . Value )
671
+ return default ( T ) ;
672
+ }
670
673
671
- var typeCode = typeof ( T ) . GetUnderlyingTypeCode ( ) ;
672
- switch ( typeCode )
674
+ var underlyingType = nullableType ?? typeof ( T ) ;
675
+ if ( underlyingType == typeof ( object ) )
676
+ return ( T ) reader . GetValue ( 0 ) ;
677
+
678
+ var converter = dialectProvider . GetConverter ( underlyingType ) ;
679
+ if ( converter != null )
673
680
{
674
- case TypeCode . DateTime :
675
- return ( T ) ( object ) DateTime . Parse ( oValue . ToString ( ) , CultureInfo . CurrentCulture ) ;
676
- case TypeCode . Decimal :
677
- return ( T ) ( object ) Decimal . Parse ( oValue . ToString ( ) , CultureInfo . CurrentCulture ) ;
678
- case TypeCode . Single :
679
- return ( T ) ( object ) System . Single . Parse ( oValue . ToString ( ) , CultureInfo . CurrentCulture ) ;
680
- case TypeCode . Double :
681
- return ( T ) ( object ) Double . Parse ( oValue . ToString ( ) , CultureInfo . CurrentCulture ) ;
681
+ object oValue = converter . GetValue ( reader , columnIndex ) ;
682
+ if ( oValue == null || oValue == DBNull . Value )
683
+ return default ( T ) ;
684
+
685
+ var convertedValue = converter . FromDbValue ( underlyingType , oValue ) ;
686
+ return convertedValue == null ? default ( T ) : ( T ) convertedValue ;
682
687
}
683
688
684
- object o = dialectProvider . FromDbValue ( oValue , typeof ( T ) ) ;
685
- return o == null ? default ( T ) : ( T ) o ;
689
+ return ( T ) reader . GetValue ( 0 ) ;
686
690
}
687
691
688
692
internal static long LastInsertId ( this IDbCommand dbCmd )
@@ -863,10 +867,10 @@ public static long LongScalar(this IDbCommand dbCmd)
863
867
internal static long ToLong ( object result )
864
868
{
865
869
if ( result is DBNull ) return default ( long ) ;
866
- if ( result is int ) return ( int ) result ;
867
- if ( result is decimal ) return Convert . ToInt64 ( ( decimal ) result ) ;
868
- if ( result is ulong ) return ( long ) Convert . ToUInt64 ( result ) ;
869
- return ( long ) result ;
870
+ if ( result is int ) return ( int ) result ;
871
+ if ( result is decimal ) return Convert . ToInt64 ( ( decimal ) result ) ;
872
+ if ( result is ulong ) return ( long ) Convert . ToUInt64 ( result ) ;
873
+ return ( long ) result ;
870
874
}
871
875
872
876
internal static T LoadSingleById < T > ( this IDbCommand dbCmd , object value )
@@ -941,8 +945,8 @@ public static FieldDefinition GetRefFieldDef(this ModelDefinition modelDef, Mode
941
945
942
946
public static FieldDefinition GetRefFieldDefIfExists ( this ModelDefinition modelDef , ModelDefinition refModelDef )
943
947
{
944
- var refField =
945
- refModelDef . FieldDefinitions . FirstOrDefault ( x => x . ForeignKey != null && x . ForeignKey . ReferenceType == modelDef . ModelType
948
+ var refField =
949
+ refModelDef . FieldDefinitions . FirstOrDefault ( x => x . ForeignKey != null && x . ForeignKey . ReferenceType == modelDef . ModelType
946
950
&& modelDef . IsRefField ( x ) )
947
951
?? refModelDef . FieldDefinitions . FirstOrDefault ( x => x . ForeignKey != null && x . ForeignKey . ReferenceType == modelDef . ModelType )
948
952
?? refModelDef . FieldDefinitions . FirstOrDefault ( modelDef . IsRefField ) ;
@@ -976,7 +980,7 @@ public static IDbDataParameter CreateParam(this IDbCommand dbCmd,
976
980
string name ,
977
981
object value = null ,
978
982
ParameterDirection direction = ParameterDirection . Input ,
979
- DbType ? dbType = null )
983
+ DbType ? dbType = null )
980
984
{
981
985
var p = dbCmd . CreateParameter ( ) ;
982
986
var dialectProvider = dbCmd . GetDialectProvider ( ) ;
0 commit comments