SQL Server 早期版本的新日期和时间功能 (OLE DB)

本主题介绍使用增强的日期和时间功能的客户端应用程序与 SQL Server 2008 之前的 SQL Server 版本通信时以及使用 SQL Server 2008 之前的 SQL Server Native Client 版本编译的客户端向支持增强日期和时间功能的服务器发送命令时的预期行为。

下级客户端行为

使用早于 SQL Server 2008 的 SQL Server Native Client 版本的客户端应用程序将新的日期/时间类型视为 nvarchar 列。 这些列内容是文字表示。 有关详细信息,请参阅 OLE DB 日期和时间改进数据类型支持的“数据格式:字符串和文本”部分。 列大小是为列指定的精度的最大文字长度。

目录 API 将返回与返回到客户端(例如 nvarchar)的下层数据类型代码和关联的下层表示形式(例如,适当的文本格式)一致的元数据。 但是,返回的数据类型名称将是真正的 SQL Server 2008 类型名称。

当下级客户端应用程序针对已对架构更改为日期/时间类型的 SQL Server 2008(或更高版本)服务器运行时,预期行为如下所示:

OLE DB 客户端类型 SQL Server 2005 类型 SQL Server 2008(或更高版本)类型 结果转换(服务器到客户端) 参数转换(客户端到服务器)
DBTYPE_DBDATE(数据库日期类型) 日期/时间 日期 好的 好的
DBTYPE_DBTIMESTAMP 时间字段设置为零。 如果时间字段为非零,则 IRowsetChange 由于字符串截断而失败。
DBTYPE_DBTIME (数据库时间类型) 时间(0) 好的 好的
DBTYPE_DBTIMESTAMP 日期字段设置为当前日期。 如果小数秒为非零,IRowsetChange 将因字符串截断而失败。

忽略日期。
DBTYPE_DBTIME (数据库时间类型) 时间(7) 失败 - 无效的时间文本。 好的
DBTYPE_DBTIMESTAMP 失败 - 无效的时间文本。 好的
DBTYPE_DBTIMESTAMP Datetime2(3) 好的 好的
DBTYPE_DBTIMESTAMP Datetime2(7) 好的 好的
DBTYPE_DBDATE(数据库日期类型) Smalldatetime 日期 好的 好的
DBTYPE_DBTIMESTAMP 时间字段设置为零。 如果时间字段为非零,则 IRowsetChange 由于字符串截断而失败。
DBTYPE_DBTIME (数据库时间类型) 时间(0) 好的 好的
DBTYPE_DBTIMESTAMP 日期字段设置为当前日期。 如果小数秒为非零,IRowsetChange 将因字符串截断而失败。

忽略日期。
DBTYPE_DBTIMESTAMP Datetime2(0) 好的 好的

正常表示,如果它与 SQL Server 2005 一起使用,它应继续使用 SQL Server 2008(或更高版本)。

只考虑了以下常见的架构更改:

  • 使用新类型,这种情况下在逻辑上应用程序只需要一个日期或时间值。 但是,应用程序被迫使用 datetime ,或者 smalldatetime 因为不同的日期和时间类型不可用。

  • 使用新类型以获得其他秒小数精度或准确性。

  • datetime2切换到,因为这是日期和时间的首选数据类型。

使用通过 ICommandWithParameters::GetParameterInfo 或架构行集获取的服务器元数据通过 ICommandWithParameters::SetParameterInfo 设置参数类型信息的应用程序将在客户端转换期间失败,其中源类型的字符串表示形式大于目标类型的字符串表示形式。 例如,如果客户端绑定使用DBTYPE_DBTIMESTAMP并且服务器列为日期,SQL Server Native Client 会将值转换为“yyyy-dd-mm hh:mm:ss.fff”,但服务器元数据将返回为 nvarchar(10)。 生成的溢出会导致DBSTATUS_E_CATCONVERTVALUE。 IRowsetChange 的数据转换也出现了类似的问题,因为行集元数据是从结果集元数据设置的。

参数和行集元数据

本部分介绍使用 SQL Server 2008 之前的 SQL Server Native Client 版本编译的客户端的参数、结果列和架构行集的元数据。

ICommandWithParameters::GetParameterInfo

DBPARAMINFO 结构通过 prgParamInfo 参数返回以下信息:

参数类型 wType ulParamSize bPrecision bScale
日期 DBTYPE_WSTR 10 ~0 ~0
时间 DBTYPE_WSTR 8, 10..16 ~0 ~0
smalldatetime DBTYPE_DBTIMESTAMP 16 16 0
datetime DBTYPE_DBTIMESTAMP 16 23 3
datetime2 DBTYPE_WSTR 19,21..27 ~0 ~0
日期时间偏移量 DBTYPE_WSTR 26,28..34 ~0 ~0

请注意,某些值范围不是连续的,例如,8,10..16 中缺少 9。 这是因为当小数精度大于零时添加了小数点。

IColumnsRowset::GetColumnsRowset

会返回以下列:

列类型 DBCOLUMN_TYPE DBCOLUMN_COLUMNSIZE DBCOLUMN_PRECISION DBCOLUMN_SCALE、DBCOLUMN_DATETIMEPRECISION
日期 DBTYPE_WSTR 10 Null Null
时间 DBTYPE_WSTR 8, 10..16 Null Null
smalldatetime DBTYPE_DBTIMESTAMP 16 16 0
datetime DBTYPE_DBTIMESTAMP 16 23 3
datetime2 DBTYPE_WSTR 19,21..27 Null Null
日期时间偏移量 DBTYPE_WSTR 26,28..34 Null Null

ColumnsInfo::GetColumnInfo

DBCOLUMNINFO 结构返回以下信息:

参数类型 wType ulColumnSize bPrecision bScale
日期 DBTYPE_WSTR 10 ~0 ~0
time(1..7) DBTYPE_WSTR 8, 10..16 ~0 ~0
smalldatetime DBTYPE_DBTIMESTAMP 16 16 0
datetime DBTYPE_DBTIMESTAMP 16 23 3
datetime2 DBTYPE_WSTR 19,21..27 ~0 ~0
日期时间偏移量 DBTYPE_WSTR 26,28..34 ~0 ~0

模式行集

本部分论述了新数据类型的参数、结果列以及架构行集的元数据。 此信息非常有用,你拥有使用早于 SQL Server 2008 SQL Server Native Client 的工具开发的客户端提供程序。

COLUMNS 行集

对于日期/时间类型将返回以下列值:

列类型 数据类型 CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH DATETIME_PRECISION
日期 DBTYPE_WSTR 10 20 Null
时间 DBTYPE_WSTR 8, 10..16 16,20..32 Null
smalldatetime DBTYPE_DBTIMESTAMP Null Null 0
datetime DBTYPE_DBTIMESTAMP Null Null 3
datetime2 DBTYPE_WSTR 19,21..27 38,42..54 Null
日期时间偏移量 DBTYPE_WSTR 26,28..34 52, 56..68 Null

PROCEDURE_PARAMETERS 行集

对于日期/时间类型将返回以下列值:

列类型 数据类型 CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH TYPE_NAME

LOCAL_TYPE_NAME
日期 DBTYPE_WSTR 10 20 日期
时间 DBTYPE_WSTR 8, 10..16 16,20..32 时间
smalldatetime DBTYPE_DBTIMESTAMP Null Null smalldatetime
datetime DBTYPE_DBTIMESTAMP Null Null datetime
datetime2 DBTYPE_WSTR 19,21..27 38,42..54 datetime2
日期时间偏移量 DBTYPE_WSTR 26,28..34 52, 56..68 日期时间偏移量

PROVIDER_TYPES 行集

对于日期/时间类型将返回以下行:

类型 ->

日期 时间 smalldatetime datetime datetime2 日期时间偏移量
TYPE_NAME 日期 时间 smalldatetime datetime datetime2 日期时间偏移量
数据类型 DBTYPE_WSTR DBTYPE_WSTR DBTYPE_DBTIMESTAMP DBTYPE_DBTIMESTAMP DBTYPE_WSTR DBTYPE_WSTR
COLUMN_SIZE 10 16 16 23 二十七 34
LITERAL_PREFIX
LITERAL_SUFFIX
CREATE_PARAMS Null Null Null Null Null Null
IS_NULLABLE VARIANT_TRUE VARIANT_TRUE VARIANT_TRUE VARIANT_TRUE VARIANT_TRUE VARIANT_TRUE
CASE_SENSITIVE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE
可搜索 DB_SEARCHABLE DB_SEARCHABLE DB_SEARCHABLE DB_SEARCHABLE DB_SEARCHABLE DB_SEARCHABLE
UNSIGNED_ATTRIBUTE Null Null Null Null Null Null
FIXED_PREC_SCALE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE
AUTO_UNIQUE_VALUE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE
LOCAL_TYPE_NAME 日期 时间 smalldatetime datetime datetime2 日期时间偏移量
MINIMUM_SCALE Null Null Null Null Null Null
MAXIMUM_SCALE Null Null Null Null Null Null
GUID Null Null Null Null Null Null
TYPELIB Null Null Null Null Null Null
版本 Null Null Null Null Null Null
IS_LONG VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE
BEST_MATCH VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_TRUE VARIANT_FALSE VARIANT_FALSE
IS_FIXEDLENGTH VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE

下级服务器行为

连接到早于 SQL Server 2008 的服务器时,尝试使用新的服务器类型名称(例如,使用 ICommandWithParameters::SetParameterInfo 或 ITableDefinition::CreateTable)将导致DB_E_BADTYPENAME。

如果在不使用类型名称的情况下针对参数或结果绑定新类型,且新类型用于隐式指定服务器类型,或服务器类型到客户端类型之间没有有效的转换,则将返回 DB_E_ERRORSOCCURRED,且 DBBINDSTATUS_UNSUPPORTED_CONVERSION 设置为在执行时使用的取值函数的绑定状态。

如果在连接时支持从缓冲区类型到服务器版本的服务器类型之间的客户端转换,则可以使用所有客户端缓冲区类型。 在此上下文中, 服务器类型 表示 ICommandWithParameters::SetParameterInfo 指定的类型,如果未调用 ICommandWithParameters::SetParameterInfo,则表示缓冲区类型隐含的类型。 这意味着 DBTYPE_DBTIME2 和 DBTYPE_DBTIMESTAMPOFFSET 可用于下级服务器,或在 DataTypeCompatibility=80 时,对支持的服务器类型的客户端转换成功的情况下,也可使用。 当然,如果服务器类型不正确,且该服务器类型不能执行对实际服务器类型的隐式转换,则服务器仍可能报告错误。

SSPROP_INIT_DATATYPECOMPATIBILITY 行为

当SSPROP_INIT_DATATYPECOMPATIBILITY设置为SSPROPVAL_DATATYPECOMPATIBILITY_SQL2000时,新日期/时间类型和关联的元数据在客户端显示为下层客户端时显示,如增强的日期和时间类型的大容量复制更改(OLE DB 和 ODBC)中所述

IRowsetFind 的可比性

允许对新的日期/时间类型使用所有比较运算符,因为这些比较运算符显示为字符串类型,而不是显示为日期/时间类型。

另请参阅

日期和时间改进 (OLE DB)