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);
}