Función SQLBrowseConnect

Conformidad
Versión introducida: Cumplimiento de estándares odbc 1.0: ODBC

Resumen
SQLBrowseConnect admite un método iterativo para detectar y enumerar los atributos y los valores de atributo necesarios para conectarse a un origen de datos. Cada llamada a SQLBrowseConnect devuelve niveles sucesivos de atributos y valores de atributo. Cuando se han enumerado todos los niveles, se completa una conexión al origen de datos y SQLBrowseConnect devuelve una cadena de conexión completa. Un código de retorno de SQL_SUCCESS o SQL_SUCCESS_WITH_INFO indica que se ha especificado toda la información de conexión y la aplicación ahora está conectada al origen de datos.

Sintaxis

  
SQLRETURN SQLBrowseConnect(  
     SQLHDBC         ConnectionHandle,  
     SQLCHAR *       InConnectionString,  
     SQLSMALLINT     StringLength1,  
     SQLCHAR *       OutConnectionString,  
     SQLSMALLINT     BufferLength,  
     SQLSMALLINT *   StringLength2Ptr);  

Argumentos

ConnectionHandle
[Entrada] Identificador de conexión.

InConnectionString
[Entrada] Examine la cadena de conexión de la solicitud (vea "InConnectionString Argument" en "Comments").

StringLength1
[Entrada] Longitud de *InConnectionString en caracteres.

OutConnectionString
[Salida] Puntero a un búfer de caracteres en el que se va a devolver la cadena de conexión del resultado del examen (vea "OutConnectionString Argument" en "Comments").

Si OutConnectionString es NULL, StringLength2Ptr seguirá devolviendo el número total de caracteres (excepto el carácter de terminación NULL para los datos de caracteres) disponible para devolver en el búfer al que apunta OutConnectionString.

BufferLength
[Entrada] Longitud, en caracteres, del búfer *OutConnectionString .

StringLength2Ptr
[Salida] El número total de caracteres (excepto la terminación null) disponible para devolver en *OutConnectionString. Si el número de caracteres disponibles para devolver es mayor o igual que BufferLength, la cadena de conexión de *OutConnectionString se trunca en BufferLength menos la longitud de un carácter de terminación NULL.

Devoluciones

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_NEED_DATA, SQL_ERROR, SQL_INVALID_HANDLE o SQL_STILL_EXECUTING.

Diagnóstico

Cuando SQLBrowseConnect devuelve SQL_ERROR, SQL_SUCCESS_WITH_INFO o SQL_NEED_DATA, se puede obtener un valor SQLSTATE asociado llamando a SQLGetDiagRec con un HandleType de SQL_HANDLE_STMT y un identificador de ConnectionHandle. En la tabla siguiente se enumeran los valores SQLSTATE devueltos normalmente por SQLBrowseConnect y se explica cada uno en el contexto de esta función; la notación "(DM)" precede a las descripciones de SQLSTATEs devueltas por el Administrador de controladores. El código de retorno asociado a cada valor SQLSTATE es SQL_ERROR, a menos que se indique lo contrario.

SQLSTATE Error Descripción
01000 Advertencia general Mensaje informativo específico del controlador. (Function devuelve SQL_SUCCESS_WITH_INFO).
01004 Datos de cadena, truncados a la derecha El búfer *OutConnectionString no era lo suficientemente grande como para devolver toda la cadena de conexión del resultado de exploración, por lo que la cadena se truncaba. El búfer *StringLength2Ptr contiene la longitud de la cadena de conexión de resultados de exploración sintruir. (Function devuelve SQL_NEED_DATA).
01S00 Atributo de cadena de conexión no válido Se especificó una palabra clave de atributo no válida en la cadena de conexión de solicitud de exploración (InConnectionString). (Function devuelve SQL_NEED_DATA).

Se especificó una palabra clave de atributo en la cadena de conexión de solicitud de exploración (InConnectionString) que no se aplica al nivel de conexión actual. (Function devuelve SQL_NEED_DATA).
01S02 Valor cambiado El controlador no admitía el valor especificado del argumento ValuePtr en SQLSetConnectAttr y sustituyó un valor similar. (Function devuelve SQL_SUCCESS_WITH_INFO).
08001 El cliente no puede establecer la conexión El controlador no pudo establecer una conexión con el origen de datos.
08002 Nombre de conexión en uso (DM) La conexión especificada ya se había usado para establecer una conexión con un origen de datos y la conexión estaba abierta.
08004 El servidor rechazó la conexión El origen de datos rechazó el establecimiento de la conexión por motivos definidos por la implementación.
08S01 Error de vínculo de comunicación Se produjo un error en el vínculo de comunicación entre el controlador y el origen de datos al que el controlador estaba intentando conectarse antes de que la función completara el procesamiento.
28000 Especificación de autorización no válida El identificador de usuario o la cadena de autorización o ambos, tal y como se especifica en la cadena de conexión de solicitud de exploración (InConnectionString), ha infringido las restricciones definidas por el origen de datos.
HY000 Error general Se produjo un error para el que no había ningún SQLSTATE específico y para el que no se definió SQLSTATE específico de la implementación. El mensaje de error devuelto por SQLGetDiagRec en el búfer *MessageText describe el error y su causa.
HY001 Error de asignación de memoria (DM) El Administrador de controladores no pudo asignar memoria necesaria para admitir la ejecución o finalización de la función.

El controlador no pudo asignar memoria necesaria para admitir la ejecución o finalización de la función.
HY008 Operación cancelada Se canceló una operación asincrónica llamando a SQLCancelHandle Function. A continuación, se llamó de nuevo a la función original en ConnectionHandle.

Una operación se canceló llamando a SQLCancelHandle en ConnectionHandle desde un subproceso diferente en una aplicación multiproceso.
HY010 Error de secuencia de función (DM) Se llamó a una función que ejecuta de forma asincrónica (no esta) para ConnectionHandle y todavía se estaba ejecutando cuando se llamó a esta función.
HY013 Error de administración de memoria No se pudo procesar la llamada de función porque no se pudo acceder a los objetos de memoria subyacentes, posiblemente debido a condiciones de memoria baja.
HY090 Longitud de búfer o cadena no válida (DM) El valor especificado para el argumento StringLength1 era menor que 0 y no era igual a SQL_NTS.

(DM) El valor especificado para el argumento BufferLength era menor que 0.
HY114 El controlador no admite la ejecución asincrónica de funciones asincrónicas de nivel de conexión (DM) La aplicación habilitó la operación asincrónica en el identificador de conexión antes de realizar la conexión. Sin embargo, el controlador no admite la operación asincrónica en el identificador de conexión.
HYT00 Tiempo de espera agotado El período de tiempo de espera de inicio de sesión expiró antes de que se complete la conexión al origen de datos. El período de tiempo de espera se establece a través de SQLSetConnectAttr, SQL_ATTR_LOGIN_TIMEOUT.
HYT01 Se ha agotado el tiempo de espera de la conexión. El período de tiempo de espera de conexión expiró antes de que el origen de datos respondiera a la solicitud. El período de tiempo de espera de conexión se establece a través de SQLSetConnectAttr, SQL_ATTR_CONNECTION_TIMEOUT.
IM001 El controlador no admite esta función (DM) El controlador correspondiente al nombre del origen de datos especificado no admite la función .
IM002 No se encontró el origen de datos y no se especificó ningún controlador predeterminado. (DM) El nombre del origen de datos especificado en la cadena de conexión de solicitud de exploración (InConnectionString) no se encontró en la información del sistema, ni había una especificación de controlador predeterminada.

(DM) No se encontró la información del controlador ODBC y la información predeterminada del controlador en la información del sistema.
IM003 No se pudo cargar el controlador especificado (DM) El controlador enumerado en la especificación del origen de datos en la información del sistema o especificado por la palabra clave DRIVER no se encontró o no se pudo cargar por algún otro motivo.
IM004 Error de SQLAllocHandle del controlador en SQL_HANDLE _ENV (DM) Durante SQLBrowseConnect, el Administrador de controladores llamó a la función SQLAllocHandle del controlador con un HandleType de SQL_HANDLE_ENV y el controlador devolvió un error.
IM005 Error de SQLAllocHandle del controlador en SQL_HANDLE_DBC (DM) Durante SQLBrowseConnect, el Administrador de controladores llamó a la función SQLAllocHandle del controlador con un HandleType de SQL_HANDLE_DBC y el controlador devolvió un error.
IM006 Error de SQLSetConnectAttr del controlador (DM) Durante SQLBrowseConnect, el Administrador de controladores llamó a la función SQLSetConnectAttr del controlador y el controlador devolvió un error.
IM009 No se puede cargar el archivo DLL de traducción El controlador no pudo cargar la DLL de traducción especificada para el origen de datos o para la conexión.
IM010 Nombre del origen de datos demasiado largo (DM) El valor de atributo de la palabra clave DSN era mayor que SQL_MAX_DSN_LENGTH caracteres.
IM011 El nombre del controlador es demasiado largo (DM) El valor de atributo de la palabra clave DRIVER tenía más de 255 caracteres.
IM012 Error de sintaxis de palabra clave DRIVER (DM) El par palabra clave-valor de la palabra clave DRIVER contenía un error de sintaxis.
IM014 El DSN especificado contiene un error de coincidencia de arquitectura entre el controlador y la aplicación. (DM) La aplicación de 32 bits usa un DSN que se conecta a un controlador de 64 bits; o viceversa.
IM017 El sondeo está deshabilitado en modo de notificación asincrónica Cada vez que se usa el modelo de notificación, el sondeo está deshabilitado.
IM018 No se ha llamado a SQLCompleteAsync para completar la operación asincrónica anterior en este identificador. Si la llamada de función anterior en el identificador devuelve SQL_STILL_EXECUTING y si el modo de notificación está habilitado, se debe llamar a SQLCompleteAsync en el identificador para realizar el procesamiento posterior y completar la operación.
S1118 El controlador no admite notificaciones asincrónicas Cuando el controlador no admite notificaciones asincrónicas, no puede establecer SQL_ATTR_ASYNC_DBC_EVENT ni SQL_ATTR_ASYNC_DBC_RETCODE_PTR.

Argumento InConnectionString

Una cadena de conexión de solicitud de exploración tiene la siguiente sintaxis:

connection-string ::= attribute[;] | Atributo;connection-string;
attribute ::= attribute-keyword=attribute-value | DRIVER=[{]attribute-value[}]
attribute-keyword ::= DSNPWDUID | | | driver-defined-attribute-keyword
attribute-value ::= character-string
driver-defined-attribute-keyword ::= identifier

donde la cadena de caracteres tiene cero o más caracteres; el identificador tiene uno o varios caracteres; attribute-keyword no distingue mayúsculas de minúsculas; attribute-value puede distinguir mayúsculas de minúsculas; y el valor de la palabra clave DSN no consta únicamente de espacios en blanco. Debido a la gramática del archivo de inicialización y cadena de conexión, palabras clave y valores de atributo que contienen los caracteres []{}(),;? *=!@ debe evitarse. Debido a la gramática de la información del sistema, las palabras clave y los nombres de origen de datos no pueden contener el carácter de barra diagonal inversa (\). Para odbc 2. x driver, se requieren llaves alrededor del valor del atributo para la palabra clave DRIVER.

Si se repiten palabras clave en la cadena de conexión de solicitud de exploración, el controlador usa el valor asociado a la primera aparición de la palabra clave. Si las palabras clave DSN y DRIVER se incluyen en la misma cadena de conexión de solicitud de exploración, el Administrador de controladores y el controlador usan la palabra clave que aparezca primero.

Para obtener información sobre cómo una aplicación elige un origen de datos o un controlador, consulte Elección de un origen de datos o un controlador.

Argumento OutConnectionString

La cadena de conexión de resultados de exploración es una lista de atributos de conexión. Un atributo de conexión consta de una palabra clave de atributo y un valor de atributo correspondiente. La cadena de conexión del resultado del examen tiene la sintaxis siguiente:

connection-string ::= attribute[;] | Atributo;cadena de conexión
attribute ::= [*]attribute-keyword=attribute-value
attribute-keyword ::= ODBC-attribute-keyworddriver-defined-attribute-keyword |
ODBC-attribute-keyword = {UIDPWD | }[:localized-identifier] driver-defined-attribute-keyword ::= identifier[:localized-identifier] attribute-value ::= {attribute-value-list} | ? (Las llaves son literales; los devuelve el controlador).
attribute-value-list ::= character-string [:localized-character string] | character-string [:localized-character string] ,attribute-value-list

donde la cadena de caracteres y la cadena de caracteres localizadas tienen cero o más caracteres; el identificador y el identificador localizado tienen uno o varios caracteres; attribute-keyword no distingue mayúsculas de minúsculas; y el valor de atributo pueden distinguir mayúsculas de minúsculas. Debido a la gramática del archivo de inicialización y cadena de conexión, palabras clave, identificadores localizados y valores de atributo que contienen los caracteres []{}(),;? *=!@ debe evitarse. Debido a la gramática de la información del sistema, las palabras clave y los nombres de origen de datos no pueden contener el carácter de barra diagonal inversa (\).

La sintaxis de la cadena de conexión del resultado de exploración se usa según las siguientes reglas semánticas:

  • Si un asterisco (*) precede a una palabra clave attribute-keyword, el atributo es opcional y se puede omitir en la siguiente llamada a SQLBrowseConnect.

  • Las palabras clave de atributo UID y PWD tienen el mismo significado que se define en SQLDriverConnect.

  • Una palabra clave driver-fined-attribute-keyword asigna el tipo de atributo para el que se puede proporcionar un valor de atributo. Por ejemplo, puede ser SERVER, DATABASE, HOST o DBMS.

  • Las palabras clave ODBC-attribute-keywords y driver-defined-attribute-keywords incluyen una versión localizada o fácil de usar de la palabra clave. Esto puede ser utilizado por las aplicaciones como una etiqueta en un cuadro de diálogo. Sin embargo, se debe usar UID, PWD o el identificador solo al pasar una cadena de solicitud de exploración al controlador.

  • {attribute-value-list} es una enumeración de valores reales válidos para la palabra clave attribute-correspondiente. Tenga en cuenta que las llaves ({}) no indican una lista de opciones; el controlador los devuelve. Por ejemplo, podría ser una lista de nombres de servidor o una lista de nombres de base de datos.

  • Si el valor de atributo es un signo de interrogación único (?), un valor único corresponde a la palabra clave attribute-. Por ejemplo, UID=JohnS; PWD=Sesame.

  • Cada llamada a SQLBrowseConnect solo devuelve la información necesaria para satisfacer el siguiente nivel del proceso de conexión. El controlador asocia información de estado con el identificador de conexión para que el contexto siempre se pueda determinar en cada llamada.

Uso de SQLBrowseConnect

SQLBrowseConnect requiere una conexión asignada. El Administrador de controladores carga el controlador especificado en o que corresponde al nombre del origen de datos especificado en la cadena de conexión de solicitud de exploración inicial; para obtener información sobre cuándo ocurre esto, vea la sección "Comentarios" de la función SQLConnect. El controlador puede establecer una conexión con el origen de datos durante el proceso de exploración. Si SQLBrowseConnect devuelve SQL_ERROR, se finalizan las conexiones pendientes y la conexión se devuelve a un estado no conectado.

Nota

SQLBrowseConnect no admite la agrupación de conexiones. Si se llama a SQLBrowseConnect mientras la agrupación de conexiones está habilitada, se devolverá SQLSTATE HY000 (error general).

Cuando se llama a SQLBrowseConnect por primera vez en una conexión, la cadena de conexión de solicitud de exploración debe contener la palabra clave DSN o la palabra clave DRIVER . Si la cadena de conexión de solicitud de exploración contiene la palabra clave DSN , el Administrador de controladores busca una especificación de origen de datos correspondiente en la información del sistema:

  • Si el Administrador de controladores encuentra la especificación del origen de datos correspondiente, carga el archivo DLL del controlador asociado; el controlador puede recuperar información sobre el origen de datos de la información del sistema.

  • Si el Administrador de controladores no encuentra la especificación del origen de datos correspondiente, localiza la especificación predeterminada del origen de datos y carga el archivo DLL del controlador asociado; el controlador puede recuperar información sobre el origen de datos predeterminado de la información del sistema. "DEFAULT" se pasa al controlador para el DSN.

  • Si el Administrador de controladores no encuentra la especificación del origen de datos correspondiente y no hay ninguna especificación de origen de datos predeterminada, devuelve SQL_ERROR con SQLSTATE IM002 (no se encuentra el origen de datos y no se especifica ningún controlador predeterminado).

Si la cadena de conexión de solicitud de exploración contiene la palabra clave DRIVER , el Administrador de controladores carga el controlador especificado; no intenta localizar un origen de datos en la información del sistema. Dado que la palabra clave DRIVER no usa información de la información del sistema, el controlador debe definir suficientes palabras clave para que un controlador pueda conectarse a un origen de datos con solo la información de las cadenas de conexión de solicitud de exploración.

En cada llamada a SQLBrowseConnect, la aplicación especifica los valores de atributo de conexión en la cadena de conexión examinar solicitud. El controlador devuelve niveles sucesivos de atributos y valores de atributo en la cadena de conexión del resultado de exploración; devuelve SQL_NEED_DATA siempre que haya atributos de conexión que aún no se hayan enumerado en la cadena de conexión de la solicitud de exploración. La aplicación usa el contenido de la cadena de conexión de resultados de exploración para compilar la cadena de conexión de solicitud de exploración para la siguiente llamada a SQLBrowseConnect. Todos los atributos obligatorios (no precedidos por un asterisco en el argumento OutConnectionString ) deben incluirse en la siguiente llamada a SQLBrowseConnect. Tenga en cuenta que la aplicación no puede usar el contenido de las cadenas de conexión de resultados de exploración anteriores al crear la cadena de conexión de solicitud de exploración actual; es decir, no puede especificar valores diferentes para los atributos establecidos en niveles anteriores.

Cuando se han enumerado todos los niveles de conexión y sus atributos asociados, el controlador devuelve SQL_SUCCESS, se completa la conexión al origen de datos y se devuelve una cadena de conexión completa a la aplicación. La cadena de conexión es adecuada para usar, junto con SQLDriverConnect, con la opción SQL_DRIVER_NOPROMPT para establecer otra conexión. Sin embargo, la cadena de conexión completa no se puede usar en otra llamada a SQLBrowseConnect; Si se llamara a SQLBrowseConnect de nuevo, toda la secuencia de llamadas tendría que repetirse.

SQLBrowseConnect también devuelve SQL_NEED_DATA si hay errores recuperables y nofatales durante el proceso de exploración; por ejemplo, una palabra clave de atributo o contraseña no válida proporcionada por la aplicación. Cuando se devuelve SQL_NEED_DATA y la cadena de conexión del resultado del examen no cambia, se ha producido un error y la aplicación puede llamar a SQLGetDiagRec para devolver SQLSTATE para los errores en tiempo de exploración. Esto permite que la aplicación corrija el atributo y continúe el examen.

Una aplicación puede finalizar el proceso de exploración en cualquier momento llamando a SQLDisconnect. El controlador finalizará las conexiones pendientes y devolverá la conexión a un estado no conectado.

Si las operaciones asincrónicas están habilitadas en el identificador de conexión, SQLBrowseConnect también puede devolver SQL_STILL_EXECUTING. Cuando devuelve SQL_NEED_DATA, una aplicación debe usar SQLDisconnect para cancelar el proceso de exploración. Si SQLBrowseConnect devuelve SQL_STILL_EXECUTING, una aplicación debe usar SQLCancelHandle para cancelar la operación en curso. Llamar a SQLCancelHandle después de que la función devuelva SQL_NEED_DATA no tiene ningún efecto.

Para obtener más información, consulte Conexión con SQLBrowseConnect.

Si un controlador admite SQLBrowseConnect, la sección de palabras clave driver de la información del sistema para el controlador debe contener la palabra clave ConnectFunctions con el tercer carácter establecido en "Y".

Ejemplo de código

Nota

Si se conecta a un proveedor de origen de datos que admite autenticación de Windows, debe especificar Trusted_Connection=yes en lugar de la información de identificador de usuario y contraseña en la cadena de conexión.

En el ejemplo siguiente, una aplicación llama repetidamente a SQLBrowseConnect . Cada vez que SQLBrowseConnect devuelve SQL_NEED_DATA, pasa información sobre los datos que necesita en *OutConnectionString. La aplicación pasa OutConnectionString a su rutina GetUserInput (no se muestra). GetUserInput analiza la información, compila y muestra un cuadro de diálogo y devuelve la información especificada por el usuario en *InConnectionString. La aplicación pasa la información del usuario al controlador en la siguiente llamada a SQLBrowseConnect. Una vez que la aplicación ha proporcionado toda la información necesaria para que el controlador se conecte al origen de datos, SQLBrowseConnect devuelve SQL_SUCCESS y la aplicación continúa.

Para obtener un ejemplo más detallado de cómo conectarse a un controlador de SQL Server mediante una llamada a SQLBrowseConnect, consulte SQL Server Ejemplo de exploración.

Por ejemplo, para conectarse al origen de datos Sales, pueden producirse las siguientes acciones. En primer lugar, la aplicación pasa la siguiente cadena a SQLBrowseConnect:

"DSN=Sales"  

El Administrador de controladores carga el controlador asociado al origen de datos Sales. A continuación, llama a la función SQLBrowseConnect del controlador con los mismos argumentos que recibió de la aplicación. El controlador devuelve la cadena siguiente en *OutConnectionString:

"HOST:Server={red,blue,green};UID:ID=?;PWD:Password=?"  

La aplicación pasa esta cadena a su rutina GetUserInput , que crea un cuadro de diálogo que pide al usuario que seleccione el servidor rojo, azul o verde y escriba un identificador de usuario y una contraseña. La rutina pasa la siguiente información especificada por el usuario en *InConnectionString, que la aplicación pasa a SQLBrowseConnect:

"HOST=red;UID=Smith;PWD=Sesame"  

SQLBrowseConnect usa esta información para conectarse al servidor rojo como Smith con la contraseña Sesame y, a continuación, devuelve la siguiente cadena en *OutConnectionString:

"*DATABASE:Database={SalesEmployees,SalesGoals,SalesOrders}"  

La aplicación pasa esta cadena a su rutina GetUserInput , que crea un cuadro de diálogo que pide al usuario que seleccione una base de datos. El usuario selecciona empdata y la aplicación llama a SQLBrowseConnect una hora final con esta cadena:

"DATABASE=SalesOrders"  

Esta es la última información que el controlador necesita para conectarse al origen de datos; SQLBrowseConnect devuelve SQL_SUCCESS y *OutConnectionString contiene la cadena de conexión completada:

// SQLBrowseConnect_Function.cpp  
// compile with: odbc32.lib  
#include <windows.h>  
#include <sqltypes.h>  
#include <sqlext.h>  
  
#define BRWS_LEN 100  
SQLHENV henv;  
SQLHDBC hdbc;  
SQLHSTMT hstmt;  
SQLRETURN retcode;  
SQLCHAR szConnStrIn[BRWS_LEN], szConnStrOut[BRWS_LEN];  
SQLSMALLINT cbConnStrOut;  
  
void GetUserInput(SQLCHAR * szConnStrOut, SQLCHAR * szConnStrIn) {}  
  
int main() {  
   // Allocate the environment handle.  
   retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);        
   if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {  
  
      // Set the version environment attribute.  
      retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER*)SQL_OV_ODBC3, 0);  
      if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {  
  
         // Allocate the connection handle.  
         retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);  
         if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {  
            // Call SQLBrowseConnect until it returns a value other than SQL_NEED_DATA   
            // (pass data source name the first time).  If SQL_NEED_DATA is returned, call GetUserInput   
            // (not shown) to build a dialog from the values in szConnStrOut.  The user-supplied values   
            // are returned in szConnStrIn, which is passed in the next call to SQLBrowseConnect.  
  
            strcpy_s((char*)szConnStrIn, _countof(szConnStrIn), "DSN=Sales");  
            do {  
               retcode = SQLBrowseConnect(hdbc, szConnStrIn, SQL_NTS,  
                  szConnStrOut, BRWS_LEN, &cbConnStrOut);  
               if (retcode == SQL_NEED_DATA)  
                  GetUserInput(szConnStrOut, szConnStrIn);  
            } while (retcode == SQL_NEED_DATA);  
  
            if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){  
  
               // Allocate the statement handle.  
               retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);  
  
               if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)  
                  // Process data after successful connection  
                  SQLFreeHandle(SQL_HANDLE_STMT, hstmt);  
               SQLDisconnect(hdbc);  
            }  
         }  
         SQLFreeHandle(SQL_HANDLE_DBC, hdbc);  
      }  
   }  
   SQLFreeHandle(SQL_HANDLE_ENV, henv);  
}  
Para información acerca de Vea
Asignar un identificador de conexión Función SQLAllocHandle
Conectarse a un origen de datos Función SQLConnect
Desconexión de un origen de datos Función SQLDisconnect
Conexión a un origen de datos mediante una cadena de conexión o un cuadro de diálogo Función SQLDriverConnect
Devolver descripciones y atributos del controlador Función SQLDrivers
Liberar un identificador de conexión Función SQLFreeHandle

Consulte también

Referencia de API ODBC
Archivos de encabezado de ODBC