.net System.Data.Odbc支持SQL Server datetime2、time、date、datetimeoffset类型
根据,ODBC支持SQL 2008+类型,如.net System.Data.Odbc支持SQL Server datetime2、time、date、datetimeoffset类型,.net,sql-server,sql-server-2008,odbc,.net,Sql Server,Sql Server 2008,Odbc,根据,ODBC支持SQL 2008+类型,如datetime2、date、time和datetimeoffset 但是我无法将它们与.NetSystem.Data.Odbc和Date一起使用。尽管我有“用于SQL Server的ODBC驱动程序13”及其“SQL Server本机客户端11.0”驱动程序,但此ODBC客户端似乎不支持它们: 试图用System.Data.OdbcreaderGetValue 收益率: 尝试用System.Data.OdbcreaderGetTime读取Time
datetime2
、date
、time
和datetimeoffset
但是我无法将它们与.NetSystem.Data.Odbc
和Date
一起使用。尽管我有“用于SQL Server的ODBC驱动程序13”及其“SQL Server本机客户端11.0”驱动程序,但此ODBC客户端似乎不支持它们:
- 试图用
readerSystem.Data.Odbc
收益率:GetValue
- 尝试用
readerSystem.Data.Odbc
读取GetTime
列会缩短分数秒Time
- 尝试在
上设置OdbcCommand
参数会缩短其小数秒数Time
- 尝试在
上设置OdbcCommand
参数会产生:DateTime2
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)
- 设置
参数会产生相同的错误,只是相应地更改了db类型名称DateTimeOffset
- 试图用
readerSystem.Data.Odbc
收益率:GetValue
- 尝试使用
readerSystem.Data.Odbc
读取GetDateTime
时,会剪切偏移量,但保留小数秒(全部7位数字)DateTimeOffset
- 检查枚举时,它没有
或datetimeoffset
的类型datetime2
- 尝试使用
代替参数来避开DbType.DateTime
的麻烦:datetime2
- 需要设置参数比例,否则失败:
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()
- 将参数scale设置为7时,即使数据库中的列是
,也会缩短小数毫秒。这给出了一毫秒的精度(与SQL Server的datetime相比,精度为毫秒的三分之十),但datetime2的精度可以降到100ns。使用SQL Server Profiler捕获查询,我们可以看到:datetime2
因此,键入的值是exec sp_executesql N'select count(*) from Types2008 where [DateTime2] = @P1', N'@P1 datetime2','2017-10-26 20:01:55.1630000'
,但它的小数毫秒已归零(是的,我的原始值没有将它们归零) 顺便说一下,当基础表列为datetime2
时,这种datetime
类型会导致问题,因为这种情况下也会发生。它会导致datetime2
相等条件无法匹配三分之二的其中
值。当键入带有四个尾随零的日期时间
时,以datetime2
或3
毫秒结尾的值被视为不等于“相同”值。只有以0毫秒结尾的匹配7
- 需要设置参数比例,否则失败:
System.Data.Odbc
是否只是远远落后于SQL Server类型的Odbc支持?或者是否有任何设置/代码需要调整以使其支持这些类型
这些结果是通过.Net Framework 4.7.1、SQL Server Express 2016和as连接字符串获得的:
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也会重现问题
这是一个完整的。我还为.Net Framework和.Net Core报告了这一点。在我看来,由于Microsoft Connect已退役,它现在是.Net Framework的一个bug.Re报告。
exec sp_executesql N'select count(*) from Types2008 where [DateTime2] = @P1',
N'@P1 datetime2','2017-10-26 20:01:55.1630000'
Driver={SQL Server Native Client 11.0};
Server=.\sql_express;
Database=test;
Trusted_Connection=yes;
Mars_Connection=yes;