根据ODBC documentation,ODBC支持SQL 2008+类型,如datetime2
,date
,time
和datetimeoffset
。
但我无法将它们与。System.Data.Odbc
connections和commands一起使用,除了Date
。它们看起来不受此ODBC客户端的支持,尽管我有用于SQL Server的" ODBC驱动程序13"和它的" SQL Server Native Client 11.0"驱动程序:
尝试使用Time
阅读器System.Data.Odbc
阅读GetValue
列
产率:
System.ArgumentException : Unknown SQL type - SS_TIME_EX.
at System.Data.Odbc.TypeMap.FromSqlType(SQL_TYPE sqltype)
at System.Data.Odbc.OdbcDataReader.GetSqlType(Int32 i)
at System.Data.Odbc.OdbcDataReader.GetValue(Int32 i)
尝试使用Time
阅读器System.Data.Odbc
阅读GetTime
列,缩短小数秒。
Time
上设置OdbcCommand
参数会缩短其小数秒。尝试在DateTime2
上设置OdbcCommand
参数:
System.ArgumentException : No mapping exists from DbType DateTime2 to a known
OdbcType.
at System.Data.Odbc.TypeMap.FromDbType(DbType dbType)
at System.Data.Odbc.OdbcParameter.set_DbType(DbType value)
设置DateTimeOffset
参数会产生相同的错误,只会相应更改db-type名称。
尝试使用DateTimeOffset
阅读器System.Data.Odbc
阅读GetValue
列
产率:
System.ArgumentException : Unknown SQL type - -155.
at System.Data.Odbc.TypeMap.FromSqlType(SQL_TYPE sqltype)
at System.Data.Odbc.OdbcDataReader.GetSqlType(Int32 i)
at System.Data.Odbc.OdbcDataReader.GetValue(Int32 i)
尝试使用DateTimeOffset
阅读器System.Data.Odbc
读取GetDateTime
列,但会保留小数秒(所有7位数)。
OdbcType
枚举,它没有datetimeoffset
或datetime2
的类型。尝试使用datetime2
代替参数来避免DbType.DateTime
的麻烦:
需要设置参数比例,否则将失败:
System.Data.Odbc.OdbcException : ERROR [22008]
[Microsoft][SQL Server Native Client 11.0]Datetime field overflow.
Fractional second precision exceeds the scale specified in the parameter binding.
at System.Data.Odbc.OdbcConnection.HandleError(OdbcHandle hrHandle, RetCode retcode)
at System.Data.Odbc.OdbcCommand.ExecuteReaderObject(CommandBehavior behavior, String method, Boolean needReader, Object[] methodArguments, SQL_API odbcApiMethod)
at System.Data.Odbc.OdbcCommand.ExecuteReaderObject(CommandBehavior behavior, String method, Boolean needReader)
at System.Data.Odbc.OdbcCommand.ExecuteNonQuery()
将参数比例设置为7时,即使数据库中的列为datetime2
,也会缩短小数毫秒。这提供了一毫秒的精度(与SQL Server datetime
相比,ms精度的十分之三),但datetime2
可以降至100ns。使用SQL Server Profiler捕获查询,我们可以看到:
exec sp_executesql N'select count(*) from Types2008 where [DateTime2] = @P1',
N'@P1 datetime2','2017-10-26 20:01:55.1630000'
因此值为datetime2
,但其小数毫秒归零(是的,我的原始值没有将它们归零)。
顺便说一下,当基础表列为datetime2
时,此datetime
类型会导致问题,因为它也会在这种情况下发生。它导致where
相等条件无法匹配三分之二的datetime
值。以3
或7
毫秒结尾的那些不等于"相同"键入datetime2
时有四个尾随零的值。只有以0毫秒结尾的那些匹配。
System.Data.Odbc
是否完全落后于SQL Server类型的ODBC支持?或者是否有任何设置/代码可以调整以支持这些类型?
这些结果是通过.Net Framework 4.7.1,SQL Server Express 2016和连接字符串获得的:
Driver={SQL Server Native Client 11.0};
Server=.\sql_express;
Database=test;
Trusted_Connection=yes;
Mars_Connection=yes;
使用来自MyGet的System.Data.Odbc 4.5.0-preview1-25829-02的.Net Core 2.0再现了麻烦。
这是一个完整的gist。