Asignar tipos de datos (ODBC)
El controlador ODBC de SQL Server Native Client asigna los tipos de datos SQL Server SQL a los tipos de datos ODBC SQL. En las secciones siguientes se describen los tipos de datos SQL Server SQL y los tipos de datos ODBC SQL a los que se asignan. También se tratan los tipos de datos ODBC SQL y sus tipos de datos ODBC C correspondientes, así como las conversiones compatibles y predeterminadas.
[!NOTA]
El tipo de datos timestamp de SQL Server se asigna al tipo de datos SQL_BINARY o SQL_VARBINARY ODBC porque los valores de las columnas timestamp no son valores datetime, sino binary(8) o varbinary(8) que indican la secuencia de actividad de SQL Server en la fila. Si el controlador ODBC de SQL Server Native Client encuentra un valor SQL_C_WCHAR (Unicode) con un número impar de bytes, se trunca el byte impar final.
Administrar tipos de datos sql_variant en ODBC
La columna de tipo de datos sql_variant puede contener cualquiera de los tipos de datos de SQL Server excepto los objetos grandes (LOB), como text, ntext e image. Por ejemplo, la columna puede contener valores smallint en algunas filas, valores float en otras filas y valores char/nchar en el resto.
El tipo de datos sql_variant es similar al tipo de datos Variant de Microsoft Visual Basic®.
Recuperar datos del servidor
ODBC no conoce el concepto de tipos variant, lo que limita el uso del tipo de datos sql_variant con un controlador ODBC en SQL Server. En SQL Server, si se especifica un enlace, el tipo de datos sql_variant se debe enlazar a uno de los tipos de datos de ODBC documentados. SQL_CA_SS_VARIANT_TYPE, un nuevo atributo específico del controlador ODBC de SQL Server Native Client, devuelve el tipo de datos de una instancia de la columna sql_variant al usuario.
Si no se especifica ningún enlace, se puede utilizar la función SQLGetData para determinar el tipo de datos de una instancia de la columna sql_variant.
Para recuperar datos sql_variant, siga estos pasos.
Llame a SQLFetch para situarse en la fila recuperada.
Llame a SQLGetData, especificando SQL_C_BINARY como tipo y 0 como longitud de los datos. Esto obliga al controlador a leer el encabezado sql_variant. El encabezado proporciona el tipo de datos de la instancia en la columna sql_variant. SQLGetData devuelve el tamaño (en bytes) del valor.
Llame a SQLColAttribute especificando SQL_CA_SS_VARIANT_TYPE como su valor de atributo. Esta función devolverá el tipo de datos de C de la instancia de la columna sql_variant al cliente.
A continuación se incluye un segmento de código que muestra los pasos anteriores.
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
}
Si el usuario crea el enlace mediante SQLBindCol, el controlador lee los metadatos y los datos. A continuación, el controlador convierte los datos al tipo ODBC adecuado especificado en el enlace.
Enviar datos al servidor
SQL_SS_VARIANT, un nuevo tipo de datos específico del controlador ODBC de SQL Server Native Client, se utiliza para los datos enviados a una columna sql_variant. Cuándo se envían datos al servidor mediante parámetros (por ejemplo, INSERT INTO nombreDeTabla VALUES (?,?)), se utiliza SQLBindParameter para especificar la información de parámetro incluido el tipo de C y el tipo de SQL Server correspondiente. El controlador ODBC de SQL Server Native Client convertirá el tipo de datos de C en uno de los subtipos sql_variant adecuados.