Browse连接

SQLBrowseConnect函数和SQLDriverConnect函数一样,使用连接字串。 然而,在使用SQLBrowseConnect时,应用程序可以在连接到数据源的过程中,逐步创建起一个完整的连接字串。这就可以让应用程序完成两件事:

应用程序可以创建自己的对话框来提示用户提供连接信息,同时又保留对用户界面的控制。

应用程序可以浏览特定驱动所适用的数据源。这可能通过多个步骤。 例如,用户可以先浏览网络上的服务,然后选择一个服务器,接着浏览该服务器上驱动所适用的数据库。

当SQLBrowseConnect函数成功建立连接以后,函数会返回一个连接字串,该字串可以被接下来的SQLDriverConnect函数所使用。

这种方式不推荐使用。 下面示例显示在不需要现有 ODBC 数据源的情况下调用 SQLDriverConnect以迭代的方式连接神通数据库服务器,注意在一般情况下SQLBrowseConnect需要用户参与交互:

#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <sqltypes.h>
#include <odbcss.h>
#include <stdio.h>
#define MAXBUFLEN 255
SQLHENV henv = SQL_NULL_HENV;
SQLHDBC hdbc1 = SQL_NULL_HDBC;
SQLHSTMT hstmt1 = SQL_NULL_HSTMT;
int main()
{
    SQLCHAR ConnStrIn[MAXBUFLEN];
    SQLCHAR ConnStrOut[MAXBUFLEN];
    SQLSMALLINT cbConnStrOut = 0;
// 第一步:获取网络上可以访问的数据库服务器列表
    strcpy((char*)ConnStrIn, "DRIVER={OSCAR ODBC DRIVER};");
    RETCODE retcode;
    retcode = SQLAllocHandle (SQL_HANDLE_ENV, NULL, &henv);
// 告诉ODBC这是一个.0标准的应用程序
    retcode = SQLSetEnvAttr(henv,
                            SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3,SQL_IS_INTEGER);
// 分配连接句柄并建立连接
    retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);
    retcode = SQLBrowseConnect(hdbc1, // 连接句柄
                               (SQLCHAR*)ConnStrIn, // 输入连接字符串
                               SQL_NTS, // 标志上述字符串以终结符结束
                               (SQLCHAR*)ConnStrOut, // 输出连接字符串
                               MAXBUFLEN, // 上述字符串的缓存字节数
                               &cbConnStrOut // 输出连接字符串的实际字节数
                              );
    if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO)
       )
    {
// 连接失败,调用SQLGetDiagRec获取错误信息
        printf("CANNOT CONNECT!");
        char c =getchar();
    }
// 此时输出连接字符串列出了所有的服务器,以及需要用户输入的信息,形如
//"HOST:Server={red,blue,green};UID:ID=?;PWD:Password=?"
// 第二步:建立连接
// 提示用户选择服务器和输入认证信息
// 根据这些信息应用程序据此生成有效的连接
// 一个有效的连接字符串形如:"HOST=red; UID=sa;PWD=MyPassword"
    GetUserInput(szConnStrOut, szConnStrIn);
    retcode = SQLBrowseConnect(hdbc1, ConnStrIn, SQL_NTS, ConnStrOut,
                               MAXBUFLEN, &cbConnStrOut );
    if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO)
       )
    {
// 连接失败,调用SQLGetDiagRec获取错误信息
    }
// 分配语句句柄并执行数据库操作
    /* 数据库操作结束,清理现场*/
    SQLDisconnect(hdbc1);
    SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);
    SQLFreeHandle(SQL_HANDLE_ENV, henv);
    return(0);
}