1
1
using System ;
2
+ using System . Collections . Generic ;
2
3
using System . Data ;
3
4
using System . Data . Odbc ;
4
5
using NHibernate . SqlTypes ;
6
+ using NHibernate . Util ;
7
+ using Environment = NHibernate . Cfg . Environment ;
5
8
6
9
namespace NHibernate . Driver
7
10
{
@@ -13,6 +16,23 @@ namespace NHibernate.Driver
13
16
/// </remarks>
14
17
public class OdbcDriver : DriverBase
15
18
{
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
+
16
36
public override IDbConnection CreateConnection ( )
17
37
{
18
38
return new OdbcConnection ( ) ;
@@ -38,8 +58,11 @@ public override string NamedPrefix
38
58
get { return String . Empty ; }
39
59
}
40
60
41
- private static void SetVariableLengthParameterSize ( IDbDataParameter dbParam , SqlType sqlType )
61
+ private void SetVariableLengthParameterSize ( IDbDataParameter dbParam , SqlType sqlType )
42
62
{
63
+ if ( Equals ( sqlType , SqlTypeFactory . DateTime ) && _dbDateTimeScale != null )
64
+ dbParam . Scale = _dbDateTimeScale . Value ;
65
+
43
66
// Override the defaults using data from SqlType.
44
67
if ( sqlType . LengthDefined )
45
68
{
@@ -59,4 +82,4 @@ protected override void InitializeParameter(IDbDataParameter dbParam, string nam
59
82
SetVariableLengthParameterSize ( dbParam , sqlType ) ;
60
83
}
61
84
}
62
- }
85
+ }
0 commit comments