Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net System.Data.Odbc支持SQL Server datetime2、time、date、datetimeoffset类型_.net_Sql Server_Sql Server 2008_Odbc - Fatal编程技术网

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

.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

根据,ODBC支持SQL 2008+类型,如
datetime2
date
time
datetimeoffset

但是我无法将它们与.Net
System.Data.Odbc
Date
一起使用。尽管我有“用于SQL Server的ODBC驱动程序13”及其“SQL Server本机客户端11.0”驱动程序,但此ODBC客户端似乎不支持它们:

  • 试图用
    System.Data.Odbc
    reader
    GetValue
    收益率:

  • 尝试用
    System.Data.Odbc
    reader
    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)
    
  • 设置
    DateTimeOffset
    参数会产生相同的错误,只是相应地更改了db类型名称

  • 试图用
    System.Data.Odbc
    reader
    GetValue
    收益率:

  • 尝试使用
    System.Data.Odbc
    reader
    GetDateTime
    读取
    DateTimeOffset
    时,会剪切偏移量,但保留小数秒(全部7位数字)

  • 检查枚举时,它没有
    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时,即使数据库中的列是
      datetime2
      ,也会缩短小数毫秒。这给出了一毫秒的精度(与SQL Server的datetime相比,精度为毫秒的三分之十),但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
      ,但它的小数毫秒已归零(是的,我的原始值没有将它们归零)

      顺便说一下,当基础表列为
      datetime
      时,这种
      datetime2
      类型会导致问题,因为这种情况下也会发生。它会导致
      其中
      相等条件无法匹配三分之二的
      日期时间
      值。当键入带有四个尾随零的
      datetime2
      时,以
      3
      7
      毫秒结尾的值被视为不等于“相同”值。只有以0毫秒结尾的匹配

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;