Partilhar via


Mapeando tipos de dados (ODBC)

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure PDW (Sistema de Plataforma de Análise) do Azure Synapse Analytics

O driver ODBC do SQL Server Native Client mapeia tipos de dados SQL Server SQL para tipos de dados ODBC SQL. As seções abaixo discutem os tipos de dados SQL Server SQL e os tipos de dados ODBC SQL para os quais eles são mapeados. Também são abordados os tipos de dados SQL ODBC e seus tipos de dados C ODBC correspondentes, além das conversões padrão e as com suporte.

Observação

O tipo de dados de carimbo de data/hora do SQL Serveré mapeado para o tipo de dados ODBC SQL_BINARY ou SQL_VARBINARY porque os valores nas colunas de carimbo de data/hora não são valores de data e hora, mas valores binary(8) ou varbinary(8) que indicam a sequência de atividade do SQL Server na linha. Se o driver ODBC do SQL Server Native Client encontrar um valor SQL_C_WCHAR (Unicode) que seja um número ímpar de bytes, o byte ímpar à direita será truncado.

Lidando com o tipo de dados sql_variant no ODBC

A coluna de tipo de dados sql_variant pode conter qualquer um dos tipos de dados no SQL Server, exceto LOBs (objetos grandes), como text, ntext e image. Por exemplo, a coluna pode conter valores smallint para algumas linhas, valores flutuantes para outras linhas e valores char/nchar no restante.

O tipo de dados sql_variant é semelhante ao tipo de dados Variant no Visual Basic.

Recuperando dados do servidor

O ODBC não tem um conceito de tipos de variante, limitando o uso do tipo de dados sql_variant com um driver ODBC no SQL Server. No SQL Server, se a associação for especificada, o tipo de dados sql_variant deverá ser associado a um dos tipos de dados ODBC documentados. SQL_CA_SS_VARIANT_TYPE, um novo atributo específico do driver ODBC do SQL Server Native Client, retorna o tipo de dados de uma instância na coluna sql_variant para o usuário.

Se nenhuma associação for especificada, a função SQLGetData poderá ser usada para determinar o tipo de dados de uma instância na coluna sql_variant .

Para recuperar sql_variant dados, siga estas etapas.

  1. Chame SQLFetch para posicionar a linha recuperada.

  2. Chame SQLGetData, especificando SQL_C_BINARY para o tipo e 0 para o comprimento dos dados. Isso força o driver a ler o cabeçalho sql_variant . O cabeçalho fornece o tipo de dados dessa instância na coluna sql_variant . SQLGetData retorna o tamanho (em bytes) do valor.

  3. Chame SQLColAttribute especificando SQL_CA_SS_VARIANT_TYPE como seu valor de atributo. Essa função retornará o tipo de dados C da instância na coluna sql_variant para o cliente.

Aqui está um segmento de código que ilustra as etapas acima.

while ((retcode = SQLFetch (hstmt))==SQL_SUCCESS)  
{  
    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)  
    {  
        SQLError (NULL, NULL, hstmt, NULL,   
                    &lNativeError,szError,MAX_DATA,&sReturned);  
        printf_s ("%s\n",szError);  
        goto Exit;  
    }  
    retcode = SQLGetData (hstmt, 1, SQL_C_BINARY,   
                                pBuff,0,&Indicator);//Figure out the length  
    if (retcode != SQL_SUCCESS_WITH_INFO && retcode != SQL_SUCCESS)  
    {  
        SQLError (NULL, NULL, hstmt, NULL, &lNativeError,   
                    szError,MAX_DATA,&sReturned);  
        printf_s ("%s\n",szError);  
        goto Exit;  
    }  
    printf_s ("Byte length : %d ",Indicator); //Print out the byte length  
  
    int iValue = 0;  
    retcode = SQLColAttribute (hstmt, 1, SQL_CA_SS_VARIANT_TYPE, NULL,   
                                        NULL,NULL,&iValue);  //Figure out the type  
    printf_s ("Sub type = %d ",iValue);//Print the type, the return is C_type of the column]  
  
// Set up a new binding or do the SQLGetData on that column with   
// the appropriate type  
}  

Se o usuário criar a associação usando SQLBindCol, o driver lerá os metadados e os dados. O driver converte os dados no tipo ODBC apropriado especificado na associação.

Enviando dados ao servidor

SQL_SS_VARIANT, um novo tipo de dados específico para o driver ODBC do SQL Server Native Client, é usado para dados enviados para uma coluna sql_variant . Ao enviar dados para o servidor usando parâmetros (por exemplo, INSERT INTO TableName VALUES (?,?)), SQLBindParameter é usado para especificar as informações do parâmetro, incluindo o tipo C e o tipo SQL Server correspondente. O driver ODBC do SQL Server Native Client converterá o tipo de dados C em um dos subtipos de sql_variant apropriados.

Confira também

Processando resultados (ODBC)