规范: | DB2 CLI 2.1 | ODBC 1.0 | ISO CLI |
SQLConnect() 建立与目标数据库的连接。
在调用此函数之前,必须使用 SQLAllocHandle() 分配连接句柄。
在使用 SQLAllocHandle() 分配语句句柄之前,必须调用此函数。
语法
SQLRETURN SQLConnect ( SQLHDBC ConnectionHandle, /* hdbc */ SQLCHAR *FAR ServerName, /* szDSN */ SQLSMALLINT NameLength1, /* cbDSN */ SQLCHAR *FAR UserName, /* szUID */ SQLSMALLINT NameLength2, /* cbUID */ SQLCHAR *FAR Authentication, /* szAuthStr */ SQLSMALLINT NameLength3); /* cbAuthStr */
函数自变量
数据类型 | 自变量 | 使用 | 描述 |
---|---|---|---|
SQLHDBC | ConnectionHandle | 输入 | 连接句柄。 |
SQLCHAR * | ServerName | 输入 | 数据库的位置和名称。名称是可选的。DB2 Everyplace 忽略此名称。 |
SQLSMALLINT | NameLength1 | 输入 | ServerName 自变量的内容的长度。 |
SQLCHAR * | UserName | 输入 | 授权名(用户标识)。此字符串用于加密,否则 DB2 Everyplace 忽略它。 |
SQLSMALLINT | NameLength2 | 输入 | UserName 自变量的内容的长度。 |
SQLCHAR * | Authentication | 输入 | 认证字符串(密码)。此字符串用于加密,否则 DB2 Everyplace 忽略它。 |
SQLSMALLINT | NameLength3 | 输入 | Authentication 自变量的内容的长度。 |
注意事项
未注册的用户(在 DB2eSYSUSERS 表中不存在的用户)当在 SQLGetDiagRec() CLI 函数调用期间试图连接到加密的 DB2 Everyplace 数据库时,将接收到警告消息 42704(未定义对象)。已注册的用户将不会接收到此警告。与此相反,在 SQLConnect() 函数调用期间,未注册和已注册的用户都能够连接至数据库,而不会接收到警告消息。
用法
SQLConnect() 可用来连接至不同位置的数据源。
要访问本地设备上的数据源,应将 ServerName 自变量设置为数据源名称。DB2 Everyplace 会忽略数据源名称,而访问本地数据源。
对于使用辅助存储设备的应用程序,ServerName 自变量接受指向在本地存在的 DataSource 位置的字符串,或接受在支持的辅助存储设备(如 IBM Microdrive、Sony Memory Stick、Compact Flash、SD Memory Card 或 MultiMediaCard)上的存储位置的字符串。ServerName 字符串的格式是:
ServerName=Device:/Path/DataSource
ServerName=#:/storage/
DB2 Everyplace 连接至第一个 CF 槽中的 IBM Microdrive 的 storage 目录中的 DataSource。
ServerName=dir1/dir2/DATA1
要使用“远程查询和存储过程”适配器访问远程存储过程, 使用 ServerName 自变量来标识数据库的位置和名称。对于使用“远程查询”和“存储过程”适配器来存取远程数据库的应用程序,ServerName 自变量接受以下 URL 格式:
http://IPAddress:portNumber/path?DB=DataSourceIPAddress 和 Authentication 是必需的。
如果使用 Windows CE 对象存储器而不是常规文件系统,则:
或
Windows CE 对象存储器中没有“目录”概念。 当使用对象存储器时,用户不能定义在其中创建表的目录或路径。 在相同的名称空间中创建对象存储器中的所有表。 由于此限制,不能同时建立多个与对象存储器的连接。 在文件系统的根路径中创建连接串行化目的的锁文件。
当使用对象存储器时,与使用常规文件系统时不同,不能手工删除 DB2 Everyplace 文件。
示例
连接至以本地方式存在于 c:\dir1\dir2\ 中的数据源。数据源名称 DS1 被忽略:
ServerName=c:/dir1/dir2/DS1
连接至使用 UNIX 文件系统表示法且以本地方式存在于 /dir1/dir2/ 中的数据源:
ServerName=/dir1/dir2/
连接至以本地方式存在于相对于应用程序路径的 dir1\ 目录中的数据源。如果应用程序位于 c:\myapp\ 中,则访问 c:\myapp\dir1\ 数据源:
ServerName=dir1\
连接至辅助存储器槽 1 中的存储内存上的 /dir1/ 目录中的数据源:
ServerName=#1:/dir1/
使用远程查询和存储过程适配器连接至端口 8080 上的 DB2 Everyplace Sync Server 192.168.0.1 以及 mysample 数据库。
ServerName= http://192.168.0.1:8080/db2e/servlet/com.ibm.mobileservices.adapter .agent.AgentServlet?DB=mysample
使用 Windows CE 存储器连接到数据源。
ServerName=@:\
连接串行化
有关连接串行化的信息,请参阅连接串行化。
连接认证
数据库加密需要基本用户认证。DB2 Everyplace 使用“用户名”和“认证”来在连接时认证用户。
认证按如下方式工作:如果 DB2eSYSUSERS 目录表在 SQLConnect 连接至的数据库中不存在,则忽略 “用户名”和“认证”信息。DB2 Everyplace 将已注册和未注册用户区别开来。 已注册用户是通过 GRANT SQL 语句添加的且在 DB2eSYSUSERS 表中列示的用户。 连接时,如果有 DB2eSYSUSERS 表且“用户名”属于已注册用户,则尝试认证。 如果“认证”参数中给定的密码不正确,则返回错误(42505)。 如果“用户名”是未注册的,则 SQLConnect 函数将成功。 然而,对 SQLGetDiagRec 的后续调用将返回警告 42704(未定义对象)。这允许应用程序区分成功连接的已注册用户和成功连接的未注册用户。 有关更多信息,请参阅本地数据加密的概述、*** 和GRANT。
返回码
诊断
SQLSTATE | 描述 | 解释 |
---|---|---|
08001 | 无法连接数据源。 | DB2 CLI 无法建立与数据源(服务器)的连接。 |
08002 | 连接正在使用中。 | 已使用指定的 ConnectionHandle 来建立与数据源的连接,该连接仍处于打开状态。 |
08004 | 应用程序服务器拒绝建立连接。 | 数据源(服务器)拒绝建立连接。 |
58004 | 意外系统故障。 | 不可恢复的系统错误。 |
HY001 | 内存分配失败。 | DB2 CLI 无法分配支持函数的执行或完成所需的内存。 |
HY013 | 发生意外的内存处理错误。 | DB2 CLI 无法访问支持函数的执行或完成所需的内存。 |
HY501 | DataSource 名无效。 | 指定的 DataSource 名无效。 |
HYT00 | 连接超时到期。 | 应用程序能够连接到数据源之前超时时间到期。 可以使用 SQLSetConnectAttr() 的 SQL_ATTR_LOGIN_TIMEOUT 属性设置超时时间。 当另一个应用程序正在使用数据库时返回此错误。 |
限制
在可以执行任何 SQL 语句之前,必须调用 SQLConnect()。
相关概念
相关参考