Compartilhar via


Mapeando tipos de dados (ODBC)

O driver ODBC do SQL Server Native Client mapeia os tipos de dados SQL do SQL Server para tipos de dados SQL (ODBC). As seções a seguir abordam os tipos de dados SQL do SQL Server e os tipos de dados SQL ODBC para os quais é feito o mapeamento. 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çãoObservação

O tipo de dados SQL Servertimestamp mapeia para o tipo de dados SQL_BINARY ou SQL_VARBINARY ODBC porque os valores nas colunas timestamp não são datetime, mas valores binary(8) ou varbinary(8) que indicam a seqüência da atividade do SQL Server na linha. Se o driver ODBC do SQL Server Native Client encontrar um valor SQL_C_WCHAR (Unicode) que tenha 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 do SQL Server com exceção de objetos grandes (LOBs), como text, ntext e image. Por exemplo, a coluna pode conter valores smallint para algumas linhas, valores float para outras e valores char/nchar no restante.

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

Recuperando dados do servidor

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

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 dados sql_variant siga estas etapas.

  1. Chame SQLFetch para posicionar na linha recuperada.

  2. Chame SQLGetData, especificando SQL_C_BINARY para o tipo e 0 para o comprimento de dados. Isso força o driver a ler o cabeçalho sql_variant. O cabeçalho fornece o tipo de dados daquela 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. Esta função retornará para o cliente o tipo de dados C da instância na coluna sql_variant.

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 com 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 do driver ODBC do SQL Server Native Client, é usado para os dados enviados a 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 de parâmetro incluindo o tipo C e o tipo do SQL Server correspondente. O driver ODBC do SQL Server Native Client converterá o tipo de dados C em um dos subtipos sql_variant apropriados.

Consulte também

Conceitos