Compartir a través de


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, sqlBrowseConnect devuelve una conexión al origen de datos y sqlBrowseConnect devuelve una cadena de conexión completa. Un código devuelto de SQL_SUCCESS o SQL_SUCCESS_WITH_INFO indica que se ha especificado toda la información de conexión y que 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 solicitud cadena de conexión (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 el resultado de exploración cadena de conexión (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] 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, el 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 todo el resultado de exploración cadena de conexión, por lo que la cadena se truncaba. El búfer *StringLength2Ptr contiene la longitud del resultado de exploración sintruir cadena de conexión. (Function devuelve SQL_NEED_DATA).
01S00 Atributo cadena de conexión no válido Se especificó una palabra clave de atributo no válida en el cadena de conexión de solicitud de exploración (InConnectionString). (Function devuelve SQL_NEED_DATA).

Se especificó una palabra clave de atributo en la solicitud browse cadena de conexió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 El vínculo de comunicación entre el controlador y el origen de datos al que el controlador estaba intentando conectarse produjo un error 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 como se especifica en la solicitud de exploración cadena de conexión (InConnectionString), las restricciones infringidas 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 la función SQLCancelHandle. A continuación, se llamó a la función original de nuevo en ConnectionHandle.

Se canceló una operación llamando a SQLCancelHandle en ConnectionHandle desde un subproceso diferente en una aplicación multiproceso.
HY010 Error de secuencia de funciones (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 tener acceso 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 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 Se ha agotado el tiempo de espera 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 mediante 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 solicitud de exploración cadena de conexión (InConnectionString) no se encontró en la información del sistema, ni había una especificación de controlador predeterminada.

(DM) No se encontró información del origen de datos ODBC y del controlador predeterminado 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 el archivo DLL de traducción especificado para el origen de datos o para la conexión.
IM010 Nombre del origen de datos demasiado largo (DM) El valor del atributo de la palabra clave DSN era mayor que SQL_MAX_DSN_LENGTH caracteres.
IM011 Nombre del controlador 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 para la palabra clave DRIVER contenía un error de sintaxis.
IM014 El DSN especificado contiene una falta de coincidencia de arquitectura entre el controlador y la aplicación. (DM) 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 solicitud de exploración cadena de conexión tiene la sintaxis siguiente:

connection-string ::= attribute[;] | atributo ; connection-string;
attribute ::= attribute-keyword=attribute-valueDRIVER= | [{]attribute-value[}]
attribute-keyword ::= DSNPWD | UID | | 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 cadena de conexión y la gramática del archivo de inicialización, las palabras clave y los 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 solicitud de exploración cadena de conexió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 solicitud de exploración cadena de conexió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

El resultado del examen cadena de conexió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. El resultado del examen cadena de conexión tiene la sintaxis siguiente:

connection-string ::= attribute[;] | cadena de conexión de atributo ;
atributo ::= [*]attribute-keyword=attribute-value
attribute-keyword ::= ODBC-attribute-keyword | driver-defined-attribute-keyword
ODBC-attribute-keyword = {UID | PWD}[:localized-identifier] driver-defined-attribute-keyword ::= identifier[:localized-identifier] attribute-value ::= { attribute-value-list } | ? (Las llaves son literales; el controlador los devuelve).
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 localizados tienen cero o más caracteres; identificador y identificador localizado tienen uno o varios caracteres; attribute-keyword no distingue mayúsculas de minúsculas y el valor de atributo puede distinguir mayúsculas de minúsculas. Debido a cadena de conexión y la gramática del archivo de inicializació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 (\).

El resultado del examen cadena de conexión sintaxis se usa según las siguientes reglas semánticas:

  • Si un asterisco (*) precede a una palabra clave de atributo, 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-defined-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, puede 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=Sésamo.

  • Cada llamada a SQLBrowseConnect devuelve solo 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 el 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 solicitud de exploración cadena de conexión debe contener la palabra clave DSN o la palabra clave DRIVER. Si la solicitud de exploración cadena de conexió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, busca 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 encontró el origen de datos y no se ha especificado ningún controlador predeterminado).

Si la solicitud de exploración cadena de conexión contiene la palabra clave DRIVER, driver Manager 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 la solicitud de exploración cadena de conexión s.

En cada llamada a SQLBrowseConnect, la aplicación especifica los valores de atributo de conexión en el cadena de conexión de solicitud de exploración. El controlador devuelve niveles sucesivos de atributos y valores de atributo en el 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 solicitud de exploración cadena de conexión. La aplicación usa el contenido del resultado de exploración cadena de conexión para compilar la solicitud de exploración cadena de conexió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 del resultado de exploración anterior cadena de conexión al compilar la solicitud de exploración actual cadena de conexión; 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 un cadena de conexión completo a la aplicación. El cadena de conexión es adecuado para usar, junto con SQLDriverConnect, con la opción SQL_DRIVER_NOPROMPT para establecer otra conexión. El cadena de conexión completo no se puede usar en otra llamada a SQLBrowseConnect; sin embargo, si se llamó 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 el resultado del examen cadena de conexión no cambia, se ha producido un error y la aplicación puede llamar a SQLGetDiagRec para devolver SQLSTATE para detectar errores en tiempo de exploración. Esto permite que la aplicación corrija el atributo y continúe con 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 palabra clave driver de la información del sistema del 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 orígenes 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 a SQLBrowseConnect repetidamente. 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, vea Ejemplo de exploración de SQL Server.

Por ejemplo, para conectarse al origen de datos Sales, se pueden producir 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 con el 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 siguiente cadena 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 el sésamo de contraseña 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 el cadena de conexión completado:

// 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 obtener información sobre Vea
Asignación de 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 un 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