本主题介绍使用增强的日期和时间功能的客户端应用程序与 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 的可比性
允许对新的日期/时间类型使用所有比较运算符,因为这些比较运算符显示为字符串类型,而不是显示为日期/时间类型。