11using System ;
2+ using System . Collections . Generic ;
23using System . Data ;
34using System . Data . Odbc ;
45using NHibernate . SqlTypes ;
6+ using NHibernate . Util ;
7+ using Environment = NHibernate . Cfg . Environment ;
58
69namespace NHibernate . Driver
710{
@@ -13,6 +16,23 @@ namespace NHibernate.Driver
1316 /// </remarks>
1417 public class OdbcDriver : DriverBase
1518 {
19+ private static readonly IInternalLogger Log = LoggerProvider . LoggerFor ( typeof ( OdbcDriver ) ) ;
20+
21+ private byte ? _dbDateTimeScale ;
22+
23+
24+ public override void Configure ( IDictionary < string , string > settings )
25+ {
26+ base . Configure ( settings ) ;
27+
28+ // Explicit scale for DbType.DateTime. Seems required for at least MS SQL Server 2008+.
29+ _dbDateTimeScale = PropertiesHelper . GetByte ( Environment . OdbcDateTimeScale , settings , null ) ;
30+ if ( _dbDateTimeScale != null && Log . IsInfoEnabled )
31+ {
32+ Log . Info ( string . Format ( "Will use scale {0} for DbType.DateTime parameters." , _dbDateTimeScale ) ) ;
33+ }
34+ }
35+
1636 public override IDbConnection CreateConnection ( )
1737 {
1838 return new OdbcConnection ( ) ;
@@ -38,8 +58,11 @@ public override string NamedPrefix
3858 get { return String . Empty ; }
3959 }
4060
41- private static void SetVariableLengthParameterSize ( IDbDataParameter dbParam , SqlType sqlType )
61+ private void SetVariableLengthParameterSize ( IDbDataParameter dbParam , SqlType sqlType )
4262 {
63+ if ( Equals ( sqlType , SqlTypeFactory . DateTime ) && _dbDateTimeScale != null )
64+ dbParam . Scale = _dbDateTimeScale . Value ;
65+
4366 // Override the defaults using data from SqlType.
4467 if ( sqlType . LengthDefined )
4568 {
@@ -59,4 +82,4 @@ protected override void InitializeParameter(IDbDataParameter dbParam, string nam
5982 SetVariableLengthParameterSize ( dbParam , sqlType ) ;
6083 }
6184 }
62- }
85+ }
0 commit comments