Atualizando um aplicativo no SQL Server 2005 Native Client

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics Analytics Platform System (PDW)

Importante

O SQL Server Native Client (SNAC) não é fornecido com:

  • SQL Server 2022 (16.x) e versões posteriores
  • SQL Server Management Studio 19 e versões posteriores

O SQL Server Native Client (SQLNCLI ou SQLNCLI11) e o Microsoft OLE DB Provider for SQL Server (SQLOLEDB) herdados não são recomendados para o desenvolvimento de novos aplicativos.

Para novos projetos, use um dos seguintes drivers:

Para SQLNCLI que é fornecido como um componente do Mecanismo de Banco de Dados do SQL Server (versões 2012 a 2019), confira esta exceção de Ciclo de Vida de Suporte.

Este tópico discute as alterações significativas no SQL Server Native Client desde o SQL Server Native Client no SQL Server 2005 (9.x).

Ao atualizar do Microsoft Data Access Components (MDAC) para o SQL Server Native Client, você também pode ver algumas diferenças de comportamento. Para obter mais informações, consulte Atualizando um aplicativo para o SQL Server Native Client do MDAC.

SQL Server Native Client 9.0 fornecido com o SQL Server 2005 (9.x). SQL Server Native Client 10.0 fornecido com o SQL Server 2008 (10.0.x). SQL Server Native Client 10.5 fornecido com o SQL Server 2008 R2 (10.50.x). SQL Server Native Client 11.0 fornecido com o SQL Server 2012 (11.x) e o SQL Server 2014 (12.x).

Comportamento alterado no SQL Server Native Client desde o SQL Server 2005 (9.x) Descrição
O OLE DB preenche apenas até a escala definida. Para conversões em que os dados convertidos são enviados para o servidor, o SQL Server Native Client (a partir do SQL Server 2008 (10.0.x)) preenche zeros à direita nos dados somente até o comprimento máximo dos valores de data e hora . O SQL Server Native Client 9.0 e preenchia até nove dígitos.
Validar DBTYPE_DBTIMESTAMP para ICommandWithParameter::SetParameterInfo. O SQL Server Native Client (a partir do SQL Server 2008 (10.0.x)) implementa o requisito OLE DB para bScale em ICommandWithParameter::SetParameterInfo a ser definido como a precisão de frações de segundo para DBTYPE_DBTIMESTAMP.
Agora, o procedimento armazenado sp_columns retorna "NO" em vez de "NO " para a coluna IS_NULLABLE. A partir do SQL Server Native Client 10.0 (SQL Server 2008 (10.0.x)), sp_columns procedimento armazenado agora retorna "NO" em vez de "NO" para uma coluna IS_NULLABLE.
SQLSetDescRec, SQLBindParameter e SQLBindCol agora executam a verificação de consistência. Antes do SQL Server Native Client 10.0, a configuração SQL_DESC_DATA_PTR não causava uma verificação de consistência para nenhum tipo de descritor em SQLSetDescRec, SQLBindParameter ou SQLBindCol.
SQLCopyDesc agora faz a verificação de consistência do descritor. Antes do SQL Server Native Client 10.0, o SQLCopyDesc não fazia uma verificação de consistência quando o campo SQL_DESC_DATA_PTR era definido em um registro específico.
SQLGetDescRec não faz mais uma verificação de consistência do descritor. Antes do SQL Server Native Client 10.0, o SQLGetDescRec executava uma verificação de consistência do descritor quando o campo SQL_DESC_DATA_PTR era definido. Isso não era exigido pela especificação ODBC e no SQL Server Native Client 10.0 (SQL Server 2008 (10.0.x)) e versões posteriores, essa verificação de consistência não é mais executada.
Erro diferente retornado quando a data está fora do intervalo. Para o tipo datetime , um número de erro diferente será retornado pelo SQL Server Native Client (a partir do SQL Server 2008 (10.0.x)) para uma data fora do intervalo retornada nas versões anteriores.

Especificamente, o SQL Server Native Client 9.0 retornou 22007 para todos os valores de ano fora do intervalo em conversões de cadeia de caracteres para datetime, e o SQL Server Native Client a partir da versão 10.0 (SQL Server 2008 (10.0.x)) retorna 22008 quando a data está dentro do intervalo com suporte de datetime2 , mas fora do intervalo com suporte de datetime ou smalldatetime.
O valor datetime trunca segundos fracionários e não será arredondado se o arredondamento alterar o dia. Antes do SQL Server Native Client 10.0, o comportamento do cliente para valores datetime enviados ao servidor era arredondá-los para o 1/300º de segundo mais próximo. A partir do SQL Server Native Client 10.0, esse cenário causará um truncamento de frações de segundo se o arredondamento alterar o dia.
Possível truncamento de segundos para o valor datetime. Um aplicativo criado com o SQL Server 2008 (10.0.x) Native Client (ou posterior) que se conecta a um servidor do SQL Server 2005 truncará segundos e frações de segundo para a parte de tempo dos dados enviados ao servidor se você se associar a uma coluna datetime com um identificador de tipo de DBTYPE_DBTIMESTAMP (OLE DB) ou SQL_TIMESTAMP (ODBC) e uma escala de 0.

Por exemplo:

Dados de entrada: 1994-08-21 21:21:36.000

Dados inseridos: 1994-08-21 21:21:00.000
A conversão de dados OLE DB de DBTYPE_DBTIME em DBTYPE_DATE não faz mais com que o dia seja alterado. Antes do SQL Server Native Client 10.0, se a parte de hora de DBTYPE_DATE estivesse dentro de meio segundo de meia-noite, o código de conversão OLE DB fazia com que o dia fosse alterado. A partir do SQL Server Native Client 10.0, o dia não será alterado (os segundos fracionários são truncados e não arredondados).
Alterações de conversão de IBCPSession::BCColFmt. A partir do SQL Server Native Client 10.0, quando você usa IBCPSession::BCOColFmt para converter SQLDATETIME ou SQLDATETIME em um tipo de cadeia de caracteres, um valor fracionário é exportado. Por exemplo, ao converter o tipo SQLDATETIME para o tipo SQLNVARCHARMAX, as versões anteriores do SQL Server Native Client retornaram

1989-02-01 00:00:00. O SQL Server Native Client 10.0 e versões posteriores retornam 1989-02-01 00:00:00.0000000.
O tamanho dos dados enviados deve corresponder ao comprimento especificado em SQL_LEN_DATA_AT_EXEC. Quando SQL_LEN_DATA_AT_EXEC for usado, o tamanho dos dados deverá corresponder ao comprimento especificado com SQL_LEN_DATA_AT_EXEC. Você pode usar SQL_DATA_AT_EXEC, mas existem benefícios de desempenho potenciais em usar SQL_LEN_DATA_AT_EXEC.
Os aplicativos personalizados que usam a API BCP agora podem ver um aviso. A API BCP gerará uma mensagem de aviso se o comprimento dos dados for maior do que o comprimento especificado para um campo para todos os tipos. Anteriormente, esse aviso era fornecido apenas para tipos de caracteres, mas não será emitido para todos os tipos.
A inserção de uma cadeia de caracteres vazia em uma associação sql_variant como um tipo de data/hora gera um erro. No SQL Server Native Client 9.0, a inserção de uma cadeia de caracteres vazia em uma associação sql_variant como um tipo de data/hora não gerava um erro. O SQL Server Native Client 10.0 (e posterior) gera corretamente um erro nessa situação.
Validação mais rígida dos parâmetros SQL_C_TYPE _TIMESTAMP e DBTYPE_DBTIMESTAMP. Antes do SQL Server 2008 (10.0.x) Native Client, os valores de datetime eram arredondados para se ajustarem à escala de colunas datetime e smalldatetime pelo SQL Server. O SQL Server 2008 (10.0.x) Native Client (e posterior) aplica as regras de validação mais rígidas definidas na especificação principal do ODBC para frações de segundo. Se não for possível converter um valor de parâmetro no tipo SQL usando a escala especificada ou implícita pela associação de cliente sem truncamento de dígitos à direita, será retornado um erro.
O SQL Server pode retornar resultados diferentes quando um gatilho é executado. As alterações introduzidas no SQL Server 2008 (10.0.x) podem fazer com que um aplicativo retorne resultados diferentes de uma instrução que causou a execução de um gatilho quando NOCOUNT OFF estava em vigor. Nessa situação, o aplicativo pode gerar um erro. Para resolver esse erro, defina NOCOUNT ON no gatilho ou chame SQLMoreResults para avançar para o próximo resultado.

Confira também

Programação do SQL Server Native Client