Compartilhar via


Novos recursos de data/hora com versões anteriores do SQL Server (OLE DB)

Este tópico descreve o comportamento esperado quando um aplicativo cliente que usa recursos de data e hora aprimorados se comunica com uma versão do SQL Server anterior ao SQL Server 2008, e quando um cliente compilado com uma versão do SQL Server Native Client anterior ao SQL Server 2008 envia comandos para um servidor que oferece suporte a recursos de data e hora aprimorados.

Comportamento do cliente de versão anterior

Aplicativos cliente que usam uma versão do SQL Server Native Client anterior ao SQL Server 2008 consultam os novos tipos de data/hora como colunas nvarchar. O conteúdo de coluna são representações literais. Para obter mais informações, consulte a seção "Formatos de dados: cadeias e literais" de Suporte a tipos de dados para melhorias de data/hora do OLE DB. O tamanho da coluna é o comprimento de 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 versão anterior retornado ao cliente (por exemplo, nvarchar) e a representação de versão anterior associada (por exemplo, o formato de literal apropriado). Entretanto, o nome do tipo de dados retornado será o nome de tipo SQL Server 2008 real.

Quando um aplicativo cliente de versão anterior é executado com base em um servidor SQL Server 2008 (ou posterior) em que foram feitas alterações de esquema nos tipos de data/hora, o comportamento esperado é este:

Tipo de cliente OLE DB

Tipo SQL Server 2005

Tipo SQL Server 2008 (ou posterior)

Conversão de resultado (servidor para cliente)

Conversão de parâmetro (cliente para servidor)

DBTYPE_DBDATE

Datetime

Date

OK

OK

DBTYPE_DBTIMESTAMP

Campos de hora definidos como zero.

IRowsetChange falhará devido ao truncamento de cadeia de caracteres se o campo de hora for diferente de zero.

DBTYPE_DBTIME

Time(0)

OK

OK

DBTYPE_DBTIMESTAMP

Campos de data definidos como a data atual.

IRowsetChange falhará devido ao truncamento de cadeia de caracteres se as frações de segundo forem diferentes de zero.

A data é ignorada.

DBTYPE_DBTIME

Time(7)

Falha – literal de hora inválido.

OK

DBTYPE_DBTIMESTAMP

Falha – literal de hora inválido.

OK

DBTYPE_DBTIMESTAMP

Datetime2(3)

OK

OK

DBTYPE_DBTIMESTAMP

Datetime2(7)

OK

OK

DBTYPE_DBDATE

Smalldatetime

Date

OK

OK

DBTYPE_DBTIMESTAMP

Campos de hora definidos como zero.

IRowsetChange falhará devido ao truncamento de cadeia de caracteres se o campo de hora for diferente de zero.

DBTYPE_DBTIME

Time(0)

OK

OK

DBTYPE_DBTIMESTAMP

Campos de data definidos como a data atual.

IRowsetChange falhará devido ao truncamento de cadeia de caracteres se as frações de segundo forem diferentes de zero.

A data é ignorada.

DBTYPE_DBTIMESTAMP

Datetime2(0)

OK

OK

OK quer dizer que se funcionou com o SQL Server 2005, deveria continuar funcionando com o SQL Server 2008 (ou posterior).

Só as seguintes alterações de esquema comuns foram consideradas:

  • Usar um novo tipo em que logicamente um aplicativo exige somente um valor de data ou hora. Porém, o aplicativo foi forçado a usar datetime ou smalldatetime porque tipos distintos de data e hora não estavam disponíveis.

  • Usar um novo tipo para obter precisão ou exatidão adicional de frações de segundos.

  • Alternar para datetime2 porque este é o tipo de dados preferido para data e hora.

Os aplicativos que usam os metadados de servidor obtidos por ICommandWithParameters::GetParameterInfo ou os conjuntos de linhas de esquema para definir informações de tipo de parâmetro por ICommandWithParameters::SetParameterInfo falharão durante conversões de cliente, em que a representação da cadeia de caracteres de um tipo de fonte for maior 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 de servidor for date, o SQL Server Native Client converterá o valor em "yyyy-dd-mm hh:mm:ss.fff", mas os metadados do servidor serão retornados como nvarchar(10). O estouro resultante causa DBSTATUS_E_CATCONVERTVALUE. Problemas semelhantes ocorrem com conversões de dados por IRowsetChange, porque os metadados de conjunto de linhas são definidos pelos metadados do conjunto de resultados.

Parâmetro e metadados de conjunto de linhas

Esta seção descreve os metadados para parâmetros, colunas de resultados e conjuntos de linhas de esquema para clientes que são compilados com uma versão do SQL Server Native Client anterior ao SQL Server 2008.

ICommandWithParameters::GetParameterInfo

A estrutura DBPARAMINFO retorna as seguintes informações pelo parâmetro prgParamInfo:

Tipo de parâmetro

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

Note que alguns destes intervalos de valor não são contínuos; por exemplo, 9 está faltando em 8,10..16. Isso se deve à adição de um ponto decimal quando a precisão fracionária é maior que zero.

IColumnsRowset::GetColumnsRowset

As seguintes colunas são retornadas:

Tipo de coluna

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

A estrutura de DBCOLUMNINFO retorna as seguintes informações:

Tipo de parâmetro

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

Conjuntos de linhas de esquema

Esta seção aborda metadados para parâmetros, colunas de resultados e conjuntos de linhas de esquema para novos tipos de dados. Estas informações serão úteis se você tiver um provedor de cliente desenvolvido usando ferramentas anteriores ao SQL Server 2008SQL Server Native Client.

Conjunto de linhas de COLUMNS

Os valores de coluna a seguir são retornados para tipos de data/hora:

Tipo de coluna

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

Conjunto de linhas de PROCEDURE_PARAMETERS

Os valores de coluna a seguir são retornados para tipos de data/hora:

Tipo de coluna

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

Conjunto de linhas de PROVIDER_TYPES

As linhas a seguir são retornadas para tipos de data/hora:

Tipo ->

Column

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

Comportamento de servidor de versão anterior

Em caso de uma conexão de um servidor de versão anterior do SQL Server 2008, 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 associados para 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 se não houver nenhuma conversão válida do tipo de servidor no tipo de cliente, DB_E_ERRORSOCCURRED será retornado e DBBINDSTATUS_UNSUPPORTED_CONVERSION será definido como o status de associação para o acessador usado em Execute.

Se houver uma conversão de cliente aceita do tipo de buffer no tipo de servidor para a versão do servidor na conexão, todos os tipos de buffer do cliente poderão ser usados. Neste contexto, tipo de servidor significa o tipo especificado por ICommandWithParameters::SetParameterInfo ou indicado pelo tipo de buffer se ICommandWithParameters::SetParameterInfo não foi chamado. Isto significa que DBTYPE_DBTIME2 e DBTYPE_DBTIMESTAMPOFFSET poderão ser usados com servidores de versões anteriores ou quando DataTypeCompatibility=80, se a conversão de cliente em um tipo de servidor aceito for bem-sucedida. Obviamente, se o tipo de servidor estiver correto, um erro ainda poderá ser relatado pelo servidor se ele não puder executar uma conversão implícita no tipo de servidor real.

Comportamento de SSPROP_INIT_DATATYPECOMPATIBILITY

Quando SSPROP_INIT_DATATYPECOMPATIBILITY for definido como SSPROPVAL_DATATYPECOMPATIBILITY_SQL2000, os novos tipos de data/hora e os metadados associados serão exibidos para os clientes como aparecem para clientes de versões anteriores, conforme descrito em Alterações de cópia em massa para tipos de data/hora aprimorados (OLE DB e ODBC).

Comparações de 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.

Consulte também

Conceitos

Aprimoramentos de data/hora (OLE DB)