oci编程中 ,有ip:192.168.10.2 ,port:21010,sid:test,user:test,password:test123 在OCILogon()或者 OCILogon2() 怎么传递这个参数
时间: 2024-03-05 20:47:35 浏览: 155
在 OCI 编程中,可以通过 OCI 的 `OCILogon()` 或者 `OCILogon2()` 函数来建立到 Oracle 数据库的连接。这些函数需要传递一个 `OCISvcCtx` 结构体指针作为参数,同时需要填充 `OCIServer` 结构体、`OCIError` 结构体和 `OCIAuthInfo` 结构体等参数。
在 `OCISvcCtx` 结构体中,需要填充 `OCIServer` 结构体指针和 `OCIError` 结构体指针。`OCIServer` 结构体指针表示连接的服务器信息,需要填充服务器的 IP 地址、端口号和 SID 等信息。`OCIError` 结构体指针表示连接过程中出现的错误信息。
以下是一个示例代码,可以在 `OCILogon()` 函数中传递 IP、port、SID、用户名和密码等参数:
```
OCIEnv* envhp;
OCISvcCtx* svchp;
OCIError* errhp;
OCIServer* srvhp;
OCIAuthInfo* authp;
char* dbstr = "(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.10.2)(PORT=21010))(CONNECT_DATA=(SID=test)))";
char* username = "test";
char* password = "test123";
OCIInitialize(OCI_DEFAULT, NULL, NULL, NULL, NULL);
OCIHandleAlloc(envhp, (void**)&errhp, OCI_HTYPE_ERROR, 0, NULL);
OCIServerAttach(srvhp, errhp, dbstr, strlen(dbstr), OCI_DEFAULT);
OCIHandleAlloc(envhp, (void**)&authp, OCI_HTYPE_AUTHINFO, 0, NULL);
OCIAttrSet(authp, OCI_HTYPE_AUTHINFO, username, strlen(username), OCI_ATTR_USERNAME, errhp);
OCIAttrSet(authp, OCI_HTYPE_AUTHINFO, password, strlen(password), OCI_ATTR_PASSWORD, errhp);
OCIHandleAlloc(envhp, (void**)&svchp, OCI_HTYPE_SVCCTX, 0, NULL);
OCIAttrSet(svchp, OCI_HTYPE_SVCCTX, srvhp, 0, OCI_ATTR_SERVER, errhp);
OCIAttrSet(svchp, OCI_HTYPE_SVCCTX, authp, 0, OCI_ATTR_AUTHINFO, errhp);
OCILogon(envhp, errhp, &svchp, strlen(username), username, strlen(password), password, dbstr, strlen(dbstr));
// 连接成功后可以执行 SQL 查询等操作
OCIHandleFree(errhp, OCI_HTYPE_ERROR);
OCIHandleFree(authp, OCI_HTYPE_AUTHINFO);
OCIHandleFree(svchp, OCI_HTYPE_SVCCTX);
OCIServerDetach(srvhp, errhp, OCI_DEFAULT);
OCIHandleFree(srvhp, OCI_HTYPE_SERVER);
```
其中,`dbstr` 参数表示连接字符串,需要填写 IP、port、SID 等信息;`username` 和 `password` 参数表示连接的用户名和密码。在函数的最后需要释放分配的内存空间。
阅读全文