Compartir por


Capturar datos de resultados

Se aplica a: SQL Server Azure SQL Database Azure SQL Instancia administrada Azure Synapse Analytics Analytics Platform System (PDW)

Una aplicación ODBC tiene tres opciones para capturar los datos de resultados.

La primera opción se basa en SQLBindCol. Antes de capturar el conjunto de resultados, la aplicación usa SQLBindCol para enlazar cada columna del conjunto de resultados a una variable de programa. Una vez enlazadas las columnas, el controlador transfiere los datos de la fila actual a las variables enlazadas a las columnas del conjunto de resultados cada vez que la aplicación llama a SQLFetch o SQLFetchScroll. El controlador administra las conversiones de datos si la columna de conjunto de resultados y la variable de programa tienen tipos de datos distintos. Si la aplicación tiene SQL_ATTR_ROW_ARRAY_SIZE establecido mayor que 1, puede enlazar columnas de resultados a matrices de variables, que se rellenarán en cada llamada a SQLFetchScroll.

La segunda opción se basa en SQLGetData. La aplicación no usa SQLBindCol para enlazar columnas del conjunto de resultados a variables de programa. Después de cada llamada a SQLFetch, la aplicación llama a SQLGetData una vez para cada columna del conjunto de resultados. SQLGetData indica al controlador que transfiera datos de una columna de conjunto de resultados específica a una variable de programa específica y especifique los tipos de datos de la columna y la variable. Esto permite al controlador convertir los datos si la columna de resultado y la variable de programa tienen tipos de datos distintos. Las columnas text, ntext y image suelen ser demasiado grandes para caber en una variable de programa, pero todavía se pueden recuperar mediante SQLGetData. Si los datos de texto, ntext o imagen de la columna de resultado son mayores que la variable de programa, SQLGetData devuelve SQL_SUCCESS_WITH_INFO y SQLSTATE 01004 (datos de cadena, truncados a la derecha). Las llamadas sucesivas a SQLGetData devuelven fragmentos sucesivos de los datos de texto o imagen . Cuando se alcanza el final de los datos, SQLGetData devuelve SQL_SUCCESS. Cada captura devuelve un conjunto de filas, si SQL_ATTR_ROW_ARRAY_SIZE es mayor que 1. Antes de usar SQLGetData, primero debe usar SQLSetPos para especificar una fila específica dentro del conjunto de filas como la fila actual.

La tercera opción es usar una combinación de SQLBindCol y SQLGetData. Por ejemplo, una aplicación podría enlazar las diez primeras columnas de un conjunto de resultados y, después, en cada captura, llamar a SQLGetData tres veces para recuperar los datos de tres columnas sin enlazar. Normalmente, se usaría cuando un conjunto de resultados contiene una o varias columnas de texto o imagen .

Según las opciones de cursor establecidas para el conjunto de resultados, una aplicación también puede usar las opciones de desplazamiento de SQLFetchScroll para desplazarse alrededor del conjunto de resultados.

El exceso de uso de SQLBindCol para enlazar una columna de conjunto de resultados a una variable de programa es costoso porque SQLBindCol hace que un controlador ODBC asigne memoria. Al enlazar una columna de resultado a una variable, ese enlace permanece en vigor hasta que se llama a SQLFreeHandle para liberar el identificador de instrucción o llamar a SQLFreeStmt con fOption establecido en SQL_UNBIND. Los enlaces no se deshacen automáticamente cuando se completa la instrucción.

Esta lógica le permite solucionar eficazmente la ejecución de la misma instrucción SELECT varias veces con parámetros diferentes. Dado que el conjunto de resultados mantiene la misma estructura, puede enlazar el conjunto de resultados una vez, procesar todas las instrucciones SELECT y, a continuación, llamar a SQLFreeStmt con fOption establecido en SQL_UNBIND después de la última ejecución. No debe llamar a SQLBindCol para enlazar las columnas de un conjunto de resultados sin llamar primero a SQLFreeStmt con fOption establecido en SQL_UNBIND para liberar los enlaces anteriores.

Al usar SQLBindCol, puede realizar enlaces de fila o de columna. El enlace de modo de fila es algo más rápido que el enlace de modo de columna.

Puede usar SQLGetData para recuperar datos en una columna por columna en lugar de enlazar columnas del conjunto de resultados mediante SQLBindCol. Si un conjunto de resultados contiene solo unas pocas filas, el uso de SQLGetData en lugar de SQLBindCol es más rápido; de lo contrario, SQLBindCol proporciona el mejor rendimiento. Si no siempre coloca los datos en el mismo conjunto de variables, debe usar SQLGetData en lugar de volver a enlazar constantemente. Solo puede usar SQLGetData en columnas que se encuentran en la lista de selección después de que todas las columnas estén enlazadas con SQLBindCol. La columna también debe aparecer después de las columnas en las que ya ha usado SQLGetData.

Las funciones ODBC que tratan de mover datos hacia o fuera de variables de programa, como SQLGetData, SQLBindCol y SQLBindParameter, admiten la conversión implícita de tipos de datos. Por ejemplo, si una aplicación enlaza una columna entera a una variable de programa de cadena de caracteres, el controlador convierte automáticamente los datos enteros en caracteres antes de incluirlos en la variable de programa.

Se debe minimizar la conversión de los datos en las aplicaciones. A menos que se requiera la conversión de datos para el procesamiento realizado por la aplicación, las aplicaciones deben enlazar las columnas y los parámetros a las variables de programa del mismo tipo de datos. Si los datos se deben convertir de un tipo a otro, sin embargo, es más eficaz hacer que el controlador haga la conversión que hacerla en la aplicación. El controlador ODBC de SQL Server Native Client normalmente simplemente transfiere datos directamente de los búferes de red a las variables de la aplicación. La solicitud al controlador de realizar la conversión de datos fuerza al controlador a almacenar en búfer los datos y usar los ciclos de CPU para convertir los datos.

Las variables de programa deben ser lo suficientemente grandes como para contener los datos transferidos desde una columna, excepto para los datos de texto, ntext e imagen . Si una aplicación intenta recuperar datos del conjunto de resultados y colocarlos en una variable que es demasiado pequeña para contenerlos, el controlador genera una advertencia. Esto obliga al controlador a asignar memoria para el mensaje y los dos, el controlador y la aplicación, tienen que utilizar ciclos de CPU para procesar el mensaje y realizar el tratamiento de errores. La aplicación debe asignar una variable bastante grande para contener los datos que se van a recuperar o usar la función SUBSTRING de la lista de selección para reducir el tamaño de la columna del conjunto de resultados.

Se deben extremar las precauciones al utilizar SQL_C_DEFAULT para especificar el tipo de la variable C. SQL_C_DEFAULT especifica que el tipo de la variable C coincide con el tipo de datos SQL de la columna o parámetro. Si se especifica SQL_C_DEFAULT para una columna ntext, nchar o nvarchar , los datos Unicode se devuelven a la aplicación. Esto puede producir varios problemas si la aplicación no ha estado codificada para administrar los datos Unicode. Los mismos tipos de problemas pueden producirse con el tipo de datos uniqueidentifier (SQL_GUID).

los datos text, ntext e image suelen ser demasiado grandes para caber en una sola variable de programa y normalmente se procesan con SQLGetData en lugar de SQLBindCol. Cuando se usan cursores de servidor, el controlador ODBC de SQL Server Native Client está optimizado para no transmitir los datos de las columnas de texto, ntext o imagen sin enlazar en el momento en que se captura la fila. Los datos de texto, ntext o imagen no se recuperan realmente del servidor hasta que la aplicación emite SQLGetData para la columna.

Esta optimización se puede aplicar a las aplicaciones para que no se muestren datos de texto, ntext o imagen mientras un usuario se desplaza hacia arriba y hacia abajo un cursor. Una vez que el usuario selecciona una fila, la aplicación puede llamar a SQLGetData para recuperar los datos de texto, ntext o imagen . Esto guarda la transmisión de los datos de texto, ntext o imagen de cualquiera de las filas que el usuario no selecciona y puede guardar la transmisión de grandes cantidades de datos.

Consulte también

Procesar resultados (ODBC)