System.Data.Odbc支持SQL Server datetime2,time,date,datetimeoffset类型

时间:2017-10-15 13:50:20

标签: .net sql-server sql-server-2008 odbc

根据ODBC documentation,ODBC支持SQL 2008+类型,如datetime2datetimedatetimeoffset

但我无法将它们与。System.Data.Odbc connectionscommands一起使用,除了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枚举,它没有datetimeoffsetdatetime2的类型。
  • 尝试使用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值。以37毫秒结尾的那些不等于"相同"键入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

0 个答案:

没有答案