Driver连接

数据源名称方式需要在数据源管理器中事先创建好数据源,灵活度不高。如果需要除了数据源名称、用户名和密码之外更多的连接信息时,就需要使用SQLDriverConnect。 SQLDriverConnect有一个参数是连接字串,字串包含了驱动所需的信息。在如下情况下,可以使用SQLDriverConnect来替代SQLConnect:

  • 连接时需要指定驱动所需的连接信息
  • 需要驱动连接时提示用户提供连接信息
  • 不通过ODBC数据源而连接到数据库上

SQLDriverConnect的连接字串包含了一系列关键词组,这些关键词组指明了ODBC驱动所支持的所有连接信息。除了支持驱动本身所指定的特有的关键词组以外,每个驱动还必须支持标准的ODBC关键字,包括如下:

关键字 意义
DSN 系统数据源名称,与UID和PWD一起使用;不要与DRIVER、SERVER等参数搭配使用。
FILEDSN 文件数据源名称
DRIVER 驱动名称,神通ODBC的驱动名称为:OSCAR ODBC DRIVER 或者 OSCAR ODBCW DRIVER 驱动名称需要用大括号括起来。
SERVER 数据库运行的IP地址,可以是localhost或者127.0.0.1
DATABASE 数据库名称
PORT 数据库端口,可以不传入,默认为2003
UID 用户名
PWD 密码
SAVEFIL 报错的文件

连接串中的关键字和值是用等号连接的,关键字键值对之间是用分号间隔的,比如一个神通ODBC的连接字符串demo如下:

DSN=odsn;UID=SYSDBA;PWD=szoscar55
// 或者
DRIVER={OSCAR ODBCW DRIVER}; SERVER=localhost; DATABASE=OSRDB; PORT=2003; UID=SYSDBA;PWD=szoscar55

连接串中,还可以加入神通自定义的一些关键值,比如:

DRIVER={OSCAR ODBCW DRIVER}; SERVER=localhost; DATABASE=OSRDB; PORT=2003; UID=SYSDBA;PWD=szoscar55; FetchBufferSize=100

可添加的关键字列表,可参考《神通数据源可添加的选项配置》章节

在使用SQLDriverConnect时,有两种可选的提示用户提供所需连接信息的方式:

  • 应用程序对话框

应用程序可以先创建一个应用程序对话框来提示用户提供连接信息,然后再调用SQLDriverConnect函数,调用时将窗口句柄参数设为NULL,DriverCompletion设为SQL_DRIVR_NOPROMT。 这些参数的设定,可以不让ODBC驱动打开自己的提示对话框。这种处理方式,可以应用于很注重控制用户界面的应用程序中。

  • 驱动对话框

应用程序可以传递给SQLDriverConnect一个有效的窗口句柄,并将DriverCompletion参数设定为SQL_DRIVER_COMPLETE,SQL_DRIVER_PROMPT或者SQL_DRIVER_COMPLETE_REQUIRED。 这样驱动就会产生一个对话框来提示用户提供连接信息。 这种处理方式,可以简化应用程序编码。但这种方式对于没有图形化的运行环境来说不支持。

下面示例显示在不需要现有 ODBC 数据源的情况下调用 SQLDriverConnect连接神通数据库服务器:

#include <string.h>
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <sqltypes.h>
#include <odbcss.h>
#include <stdio.h>
#define MAXBUFLEN 1024
SQLHENV henv = SQL_NULL_HENV;
SQLHDBC hdbc1 = SQL_NULL_HDBC;
SQLHSTMT hstmt1 = SQL_NULL_HSTMT;
int _tmain(int argc, _TCHAR* argv[])
{
//此处的DRIVER名称是之前配置数据源时的驱动名称,而且Port是必不可少的
    SQLCHAR ConnStrIn[MAXBUFLEN] =
        "DRIVER={OSCAR ODBC DRIVER};SERVER=10.0.5.226;"
        "UID=sysdba;PWD=szoscar55;DATABASE=OSRDB;Port=2003";
    SQLCHAR ConnStrOut[MAXBUFLEN];
    SQLSMALLINT cbConnStrOut = 0;
    RETCODE retcode;
// 分配ODBC环境句柄
    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);
// 使用SQL_DRIVER_NOPROMPT选项,
// 如果连接字符串的信息不完全,SQLDriverConnect
// 会返回SQL_ERROR 以及错误提示信息,
// 但不会弹出对话框提示用户重新输入
    retcode = SQLDriverConnect(hdbc1, // 连接句柄
                               NULL, // 视窗句柄
                               (SQLCHAR*)ConnStrIn, // 输入连接字符串
                               SQL_NTS, // 标志上述字符串以终结符结束
                               (SQLCHAR*)ConnStrOut, // 输出连接字符串
                               MAXBUFLEN, // 上述字符串的缓存字节数
                               &cbConnStrOut, // 输出连接字符串的实际字节数
                               SQL_DRIVER_NOPROMPT);
    if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO)
       )
    {
// 连接失败,调用SQLGetDiagRec获取错误信息
        printf("CANNOT CONNECT!");
        char c =getchar();
    }
// 分配语句句柄并执行数据库操作
    /* 数据库操作结束,清理现场*/
    SQLDisconnect(hdbc1);
    SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);
    SQLFreeHandle(SQL_HANDLE_ENV, henv);
    return(0);
}