新日期/时间功能与早期 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)和关联的下级表示形式(例如相应的文字格式)一致的元数据。不过,返回的数据类型名称将为 real SQL Server 2008 类型名称。

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

OLE DB 客户端类型

SQL Server 2005 类型

SQL Server 2008(或更高版本)类型

结果转换(服务器到客户端)

参数转换(客户端到服务器)

DBTYPE_DBDATE

Datetime

Date

可以

可以

DBTYPE_DBTIMESTAMP

时间字段设置为零。

如果时间字段非零,则由于字符串截断,IRowsetChange 将失败。

DBTYPE_DBTIME

Time(0)

可以

可以

DBTYPE_DBTIMESTAMP

日期字段设置为当前日期。

如果秒的小数部分非零,则由于字符串截断,IRowsetChange 将失败。

忽略日期。

DBTYPE_DBTIME

Time(7)

失败 – 无效的时间文字。

可以

DBTYPE_DBTIMESTAMP

失败 – 无效的时间文字。

可以

DBTYPE_DBTIMESTAMP

Datetime2(3)

可以

可以

DBTYPE_DBTIMESTAMP

Datetime2(7)

可以

可以

DBTYPE_DBDATE

Smalldatetime

Date

可以

可以

DBTYPE_DBTIMESTAMP

时间字段设置为零。

如果时间字段非零,则由于字符串截断,IRowsetChange 将失败。

DBTYPE_DBTIME

Time(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

date

DBTYPE_WSTR

10

~0

~0

time

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

datetimeoffset

DBTYPE_WSTR

26,28..34

~0

~0

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

IColumnsRowset::GetColumnsRowset

会返回以下列:

列类型

DBCOLUMN_TYPE

DBCOLUMN_COLUMNSIZE

DBCOLUMN_PRECISION

DBCOLUMN_SCALE、DBCOLUMN_DATETIMEPRECISION

date

DBTYPE_WSTR

10

NULL

NULL

time

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

datetimeoffset

DBTYPE_WSTR

26,28..34

NULL

NULL

ColumnsInfo::GetColumnInfo

DBCOLUMNINFO 结构返回以下信息:

参数类型

wType

ulColumnSize

bPrecision

bScale

date

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

datetimeoffset

DBTYPE_WSTR

26,28..34

~0

~0

架构行集

本部分论述了新数据类型的参数、结果列以及架构行集的元数据。使用早于 SQL Server 2008 SQL Server Native Client 的工具开发客户端访问接口时,此信息很有用。

COLUMNS 行集

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

列类型

DATA_TYPE

CHARACTER_MAXIMUM_LENGTH

CHARACTER_OCTET_LENGTH

DATETIME_PRECISION

date

DBTYPE_WSTR

10

20

NULL

time

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

datetimeoffset

DBTYPE_WSTR

26,28..34

52, 56..68

NULL

PROCEDURE_PARAMETERS 行集

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

列类型

DATA_TYPE

CHARACTER_MAXIMUM_LENGTH

CHARACTER_OCTET_LENGTH

TYPE_NAME

LOCAL_TYPE_NAME

date

DBTYPE_WSTR

10

20

date

time

DBTYPE_WSTR

8, 10..16

16,20..32

time

smalldatetime

DBTYPE_DBTIMESTAMP

NULL

NULL

smalldatetime

datetime

DBTYPE_DBTIMESTAMP

NULL

NULL

datetime

datetime2

DBTYPE_WSTR

19,21..27

38,42..54

datetime2

datetimeoffset

DBTYPE_WSTR

26,28..34

52, 56..68

datetimeoffset

PROVIDER_TYPES 行集

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

类型 ->

date

time

smalldatetime

datetime

datetime2

datetimeoffset

TYPE_NAME

date

time

smalldatetime

datetime

datetime2

datetimeoffset

DATA_TYPE

DBTYPE_WSTR

DBTYPE_WSTR

DBTYPE_DBTIMESTAMP

DBTYPE_DBTIMESTAMP

DBTYPE_WSTR

DBTYPE_WSTR

COLUMN_SIZE

10

16

16

23

27

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

SEARCHABLE

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

date

time

smalldatetime

datetime

datetime2

datetimeoffset

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

VERSION

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::SetParameterInfoITableDefinition::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 的可比性

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

请参阅

概念