ACISessionBegin()¶
-
ACISessionBegin()¶
作用:
使用登录信息在指定的连接类句柄上打开与数据库服务的连接。
语法:
sword ACISessionBegin ( ACISvcCtx *svchp,
ACIError *errhp,
ACISession *usrhp,
ub4 credt,
ub4 mode );
参数:
- svchp (IN)
一个上下文句柄,必须是已经设置了服务器句柄的服务上下文句柄。
- errhp (IN)
错误句柄,该接口调用失败时,错误信息会存在该句柄上,调用 ACIErrorGet 获得错误信息。
- usrhp (IN/OUT)
session句柄,执行登录之前,该句柄上必需已经设置了登录的用户名和口令
- credt (IN)
- ACI_CRED_RDBMS
通过用户名和口令与数据库服务建立起连接。用户名和密码的必须通过设置session上下文的属性中设置这两个属性:ACI_ATTR_USERNAME 和 ACI_ATTR_PASSWORD
- mode (IN)
指定各种操作模式。有效模式为
- ACI_DEFAULT
在此模式下,只能使用svchp中指定的服务器上下文设置返回的用户会话上下文。对于编码,服务器句柄使用环境句柄中的设置。
- ACI_STMT_CACHE
在给定的服务句柄上启用具有默认大小(1024)的语句缓存。 如果应用程序稍后可在在该服务句柄上使用ACI_ATTR_STMTCACHESIZE显式设置大小。
说明:
必须调用 ACISessionBegin 后,然后才能对其发出请求。 ACISessionBegin 仅支持对用户进行身份验证,以访问服务上下文中由服务器句柄指定的数据库。换句话说,在调用 ACIServerAttach 初始化服务器句柄之后,必须调用 ACISessionBegin 对给定服务器的用户进行身份验证。
使用Unicode时,如果模式或环境句柄具有适当的设置,则在会话句柄usrhp中设置的用户名和密码应使用Unicode。 在调用此函数以用户名和密码启动会话之前,您必须已调用 ACIAttrSet 以将这两个Unicode字符串设置为具有相应长度(以字节为单位)的会话句柄,因为 ACIAttrSet 仅采用了无符号指针。 然后由 ACISessionBegin 解释字符串缓冲区。
在为服务器句柄调用 ACISessionBegin 之后,应用程序可能会再次调用 ACISessionBegin 来初始化另一个具有不同(或相同)凭据和不同(或相同)操作模式的用户会话句柄。
调用 ACISessionBegin 提供凭据,支持两种方法。第一种方法是在传递给 ACISessionBegin 的用户会话句柄中为数据库身份验证提供有效的用户名和密码对。这涉及到使用 ACIAttrSet 在用户会话句柄上设置ACI_ATTR_USERNAME和ACI_ATTR_PASSWORD属性。然后用ACI_CRED_RDBMS调用 ACISessionBegin 。
当使用 ACISessionEnd 终止用户会话句柄时,用户名和密码属性保持不变,因此可以在将来调用 ACISessionBegin 时重用。否则,必须在下一次 ACISessionBegin 调用之前将它们重置为新值。
示例:
下面的代码示例演示了 ACISessionBegin 的用法。此代码段分配用户会话句柄,设置用户名和密码属性,调用 ACISessionBegin ,然后将用户会话设置到服务上下文中:
ACIHandleAlloc((void *)envhp, (void **)&usrhp, (ub4)
ACI_HTYPE_SESSION, (size_t) 0, (void **) 0);
ACIAttrSet((void *)usrhp, (ub4)ACI_HTYPE_SESSION, (void *)"sysdba",(ub4)strlen("sysdba"), ACI_ATTR_USERNAME, errhp);
ACIAttrSet((void *)usrhp, (ub4)ACI_HTYPE_SESSION, (void *)"szoscar55", (ub4)strlen("szoscar55"), ACI_ATTR_PASSWORD, errhp);
checkerr(errhp, ACISessionBegin (svchp, errhp, usrhp, ACI_CRED_RDBMS,ACI_DEFAULT));
ACIAttrSet((void *)svchp, (ub4)ACI_HTYPE_SVCCTX, (void *)usrhp,(ub4)0, ACI_ATTR_SESSION, errhp);