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ção |
---|
O tipo de dados SQL Server timestamp 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 sequê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.
Chame SQLFetch para posicionar na linha recuperada.
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.
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.