Novos recursos de data e hora com versões anteriores do SQL Server (OLE DB)
Este tópico descreve o comportamento esperado quando um aplicativo cliente que usa recursos avançados de data e hora se comunica com uma versão do SQL Server anterior ao SQL Server 2008 (10.0.x) e quando um cliente compilado com uma versão do SQL Server Native Client anterior ao SQL Server 2008 (10.0.x) envia comandos para um servidor que oferece suporte a recursos avançados de data e hora.
Down-Level Comportamento do Cliente
Os aplicativos cliente que usam uma versão do SQL Server Native Client anterior ao SQL Server 2008 (10.0.x) veem os novos tipos de data/hora como colunas nvarchar. O conteúdo da coluna são representações literais. Para obter mais informações, consulte a seção "Formatos de dados: cadeias de caracteres e literais" de Suporte a tipos de dados para melhorias de data e hora do OLE DB. O tamanho da coluna é o comprimento literal máximo para a precisão especificada para a coluna.
As APIs de catálogo retornarão metadados consistentes com o código de tipo de dados de nível inferior retornado ao cliente (por exemplo, nvarchar) e a representação de nível inferior associada (por exemplo, o formato literal apropriado). No entanto, o nome do tipo de dados retornado será o nome do tipo real do SQL Server 2008 (10.0.x).
Quando um aplicativo cliente de nível inferior é executado em um servidor SQL Server 2008 (10.0.x) (ou posterior) no qual foram feitas alterações de esquema para tipos de data/hora, o comportamento esperado é o seguinte:
Tipo de cliente OLE DB | Tipo do SQL Server 2005 | Tipo do SQL Server 2008 (ou posterior) | Conversão de resultados (servidor para cliente) | Conversão de parâmetros (cliente para servidor) |
---|---|---|---|---|
DBTYPE_DBDATE | Data/hora | Data | OK | OK |
DBTYPE_DBTIMESTAMP | Campos de tempo definidos como zero. | IRowsetChange falhará devido ao truncamento da cadeia de caracteres se o campo de tempo for diferente de zero. | ||
DBTYPE_DBTIME | Tempo(0) | OK | OK | |
DBTYPE_DBTIMESTAMP | Campos de data definidos para a data atual. | IRowsetChange falhará devido ao truncamento da cadeia de caracteres se os segundos fracionários forem diferentes de zero. A data é ignorada. |
||
DBTYPE_DBTIME | Tempo(7) | Falha - literal de tempo inválido. | OK | |
DBTYPE_DBTIMESTAMP | Falha - literal de tempo inválido. | OK | ||
DBTYPE_DBTIMESTAMP | Data/hora2(3) | OK | OK | |
DBTYPE_DBTIMESTAMP | Data/hora2(7) | OK | OK | |
DBTYPE_DBDATE | Pequenodatetime | Data | OK | OK |
DBTYPE_DBTIMESTAMP | Campos de tempo definidos como zero. | IRowsetChange falhará devido ao truncamento de cadeia de caracteres se o campo de tempo for diferente de zero. | ||
DBTYPE_DBTIME | Tempo(0) | OK | OK | |
DBTYPE_DBTIMESTAMP | Campos de data definidos para a data atual. | IRowsetChange falhará devido ao truncamento da cadeia de caracteres se os segundos fracionários forem diferentes de zero. A data é ignorada. |
||
DBTYPE_DBTIMESTAMP | Data/hora2(0) | OK | OK |
OK significa que, se funcionou com o SQL Server 2005 (9.x), deve continuar a trabalhar com o SQL Server 2008 (10.0.x) (ou posterior).
Apenas as seguintes alterações de esquema comuns foram consideradas:
Usando um novo tipo onde logicamente um aplicativo requer apenas um valor de data ou hora. No entanto, o aplicativo foi forçado a usar datetime ou smalldatetime porque tipos separados de data e hora não estavam disponíveis.
Usando um novo tipo para obter precisão ou precisão adicional de segundos fracionários.
Mudar para datetime2 porque este é o tipo de dados preferido para data e hora.
Os aplicativos que usam metadados de servidor obtidos por meio de ICommandWithParameters::GetParameterInfo ou conjuntos de linhas de esquema para definir informações de tipo de parâmetro por meio de ICommandWithParameters::SetParameterInfo falharão durante conversões de cliente em que a representação de cadeia de caracteres de um tipo de origem é maior do que a representação de cadeia de caracteres do tipo de destino. Por exemplo, se uma associação de cliente usar DBTYPE_DBTIMESTAMP e a coluna do servidor for data, o SQL Server Native Client converterá o valor em "aaaa-dd-mm hh:mm:ss.fff", mas os metadados do servidor serão retornados como nvarchar(10). O transbordamento resultante causa DBSTATUS_E_CANTCONVERTVALUE. Problemas semelhantes surgem com conversões de dados por IRowsetChange, porque os metadados do conjunto de linhas são definidos a partir dos metadados do conjunto de resultados.
Metadados de parâmetros e conjuntos de linhas
Esta seção descreve metadados para parâmetros, colunas de resultados e conjuntos de linhas de esquema para clientes compilados com uma versão do SQL Server Native Client anterior ao SQL Server 2008 (10.0.x).
ICommandWithParameters::GetParameterInfo
A estrutura DBPARAMINFO retorna as seguintes informações através do parâmetro prgParamInfo
Tipo de parâmetro | wTipo | ulParamSize | bPrecisão | bEscala |
---|---|---|---|---|
data | DBTYPE_WSTR | 10 | ~0 | ~0 |
Hora | DBTYPE_WSTR | 8, 10..16 | ~0 | ~0 |
PequenoDateTime | 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 |
Observe que alguns desses intervalos de valores não são contínuos; por exemplo, 9 está faltando em 8,10.16. Isto deve-se à adição de um ponto decimal quando a precisão fracionada é superior a zero.
IColumnsRowset::GetColumnsRowset
As seguintes colunas são retornadas:
Tipo de coluna | DBCOLUMN_TYPE | DBCOLUMN_COLUMNSIZE | DBCOLUMN_PRECISION | DBCOLUMN_SCALE, DBCOLUMN_DATETIMEPRECISION |
---|---|---|---|---|
data | DBTYPE_WSTR | 10 | NULO | NULO |
Hora | DBTYPE_WSTR | 8, 10..16 | NULO | NULO |
PequenoDateTime | DBTYPE_DBTIMESTAMP | 16 | 16 | 0 |
datetime | DBTYPE_DBTIMESTAMP | 16 | 23 | 3 |
datetime2 | DBTYPE_WSTR | 19,21..27 | NULO | NULO |
datetimeoffset | DBTYPE_WSTR | 26,28..34 | NULO | NULO |
ColumnsInfo::GetColumnInfo
A estrutura DBCOLUMNINFO retorna as seguintes informações:
Tipo de parâmetro | wTipo | ulColumnSize | bPrecisão | bEscala |
---|---|---|---|---|
data | DBTYPE_WSTR | 10 | ~0 | ~0 |
tempo(1..7) | DBTYPE_WSTR | 8, 10..16 | ~0 | ~0 |
PequenoDateTime | 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 |
Conjuntos de linhas de esquema
Esta seção discute metadados para parâmetros, colunas de resultados e conjuntos de linhas de esquema para novos tipos de dados. Essas informações são úteis se você tiver um provedor de cliente desenvolvido usando ferramentas anteriores ao SQL Server 2008 (10.0.x) SQL Server Native Client.
Conjunto de linhas COLUMNS
Os seguintes valores de coluna são retornados para tipos de data/hora:
Tipo de coluna | DATA_TYPE | CHARACTER_MAXIMUM_LENGTH | CHARACTER_OCTET_LENGTH | DATETIME_PRECISION |
---|---|---|---|---|
data | DBTYPE_WSTR | 10 | 20 | NULO |
Hora | DBTYPE_WSTR | 8, 10..16 | 16,20..32 | NULO |
PequenoDateTime | DBTYPE_DBTIMESTAMP | NULO | NULO | 0 |
datetime | DBTYPE_DBTIMESTAMP | NULO | NULO | 3 |
datetime2 | DBTYPE_WSTR | 19,21..27 | 38,42..54 | NULO |
datetimeoffset | DBTYPE_WSTR | 26,28..34 | 52, 56..68 | NULO |
PROCEDURE_PARAMETERS conjunto de linhas
Os seguintes valores de coluna são retornados para tipos de data/hora:
Tipo de coluna | DATA_TYPE | CHARACTER_MAXIMUM_LENGTH | CHARACTER_OCTET_LENGTH | TYPE_NAME LOCAL_TYPE_NAME |
---|---|---|---|---|
data | DBTYPE_WSTR | 10 | 20 | data |
Hora | DBTYPE_WSTR | 8, 10..16 | 16,20..32 | Hora |
PequenoDateTime | DBTYPE_DBTIMESTAMP | NULO | NULO | PequenoDateTime |
datetime | DBTYPE_DBTIMESTAMP | NULO | NULO | datetime |
datetime2 | DBTYPE_WSTR | 19,21..27 | 38,42..54 | datetime2 |
datetimeoffset | DBTYPE_WSTR | 26,28..34 | 52, 56..68 | datetimeoffset |
PROVIDER_TYPES conjunto de linhas
As seguintes linhas são retornadas para tipos de data/hora:
Tipo -> Coluna |
data | Hora | PequenoDateTime | datetime | datetime2 | datetimeoffset |
---|---|---|---|---|---|---|
TYPE_NAME | data | Hora | PequenoDateTime | 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 | NULO | NULO | NULO | NULO | NULO | NULO |
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 |
PESQUISÁVEL | DB_SEARCHABLE | DB_SEARCHABLE | DB_SEARCHABLE | DB_SEARCHABLE | DB_SEARCHABLE | DB_SEARCHABLE |
UNSIGNED_ATTRIBUTE | NULO | NULO | NULO | NULO | NULO | NULO |
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 | data | Hora | PequenoDateTime | datetime | datetime2 | datetimeoffset |
MINIMUM_SCALE | NULO | NULO | NULO | NULO | NULO | NULO |
MAXIMUM_SCALE | NULO | NULO | NULO | NULO | NULO | NULO |
GUID | NULO | NULO | NULO | NULO | NULO | NULO |
TYPELIB | NULO | NULO | NULO | NULO | NULO | NULO |
VERSÃO | NULO | NULO | NULO | NULO | NULO | NULO |
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 |
Comportamento do servidor Down-Level
Quando conectado a um servidor de uma versão anterior ao SQL Server 2008 (10.0.x), qualquer tentativa de usar os novos nomes de tipo de servidor (por exemplo, com ICommandWithParameters::SetParameterInfo ou ITableDefinition::CreateTable) resultará em DB_E_BADTYPENAME.
Se novos tipos forem vinculados a parâmetros ou resultados sem o uso de um nome de tipo, e o novo tipo for usado para especificar o tipo de servidor implicitamente ou não houver nenhuma conversão válida do tipo de servidor para o tipo de cliente, DB_E_ERRORSOCCURRED será retornado e DBBINDSTATUS_UNSUPPORTED_CONVERSION será definido como o status de vinculação para o acessador usado em Executar.
Se houver uma conversão de cliente suportada do tipo de buffer para o tipo de servidor para a versão do servidor na conexão, todos os tipos de buffer de cliente podem ser usados. Nesse contexto, tipo de servidor significa o tipo especificado por ICommandWithParameters::SetParameterInfo, ou implícito pelo tipo de buffer se ICommandWithParameters::SetParameterInfo não tiver sido chamado. Isso significa que DBTYPE_DBTIME2 e DBTYPE_DBTIMESTAMPOFFSET podem ser usados com servidores de nível inferior ou quando DataTypeCompatibility=80, se a conversão do cliente para um tipo de servidor suportado for bem-sucedida. É claro que, se o tipo de servidor estiver incorreto, um erro ainda poderá ser relatado pelo servidor se ele não puder executar uma conversão implícita para o tipo de servidor real.
Comportamento SSPROP_INIT_DATATYPECOMPATIBILITY
Quando SSPROP_INIT_DATATYPECOMPATIBILITY é definido como SSPROPVAL_DATATYPECOMPATIBILITY_SQL2000, os novos tipos de data/hora e metadados associados aparecem para os clientes como aparecem para clientes de nível inferior, conforme descrito em Alterações de cópia em massa para tipos avançados de data e hora (OLE DB e ODBC).
Comparabilidade para IRowsetFind
Todos os operadores de comparação são permitidos para os novos tipos de data/hora, porque eles aparecem como tipos de cadeia de caracteres em vez de tipos de data/hora.