新日期/时间功能与早期 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::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 的可比性
允许对新的日期/时间类型使用所有比较运算符,因为这些比较运算符显示为字符串类型,而不是显示为日期/时间类型。