作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
仅供引用:此代码是用于数据库访问的开源 LabView LLB/库/DLL 的一部分
我的代码段如下:
#ifdef HAVE_ORACLE
case oracle_api:
sprintf(DriverName, "%s\nOracle ", SQL_LV_VERSION);
retCode = OCIServerVersion (db->srvhp, db->errhp, DriverName + strlen(DriverName), BUFF_SIZE - strlen(DriverName), 0);
checkerr(db->errhp, retCode, DriverName + strlen(DriverName));
break;
#endif
问题是我不断收到“OCI_INVALID_HANDLE”。
来自 GDB:
(gdb) print retCode
$1 = -2
(gdb) print DriverName
$2 = "sql_LV-1.10\nOracle Error - OCI_INVALID_HANDLE\n\000
(gdb) whatis db->srvhp
type = OCIServer *
我的 typedef 是:
/* Typedefs */
typedef struct {
MYSQL mysql;
MYSQL_RES *query_results;
#ifdef HAVE_ODBC
HENV henv;
HDBC hdbc;
HSTMT hstmt;
#endif
#ifdef HAVE_ORACLE
OCIEnv *envhp;
OCIError *errhp;
OCISession *authp;
OCIServer *srvhp;
OCISvcCtx *svchp;
#endif
unsigned short int odbc_driver, db_type;
} SQL_LV_REF;
我尝试了服务上下文句柄和服务器上下文句柄(它们都是非 NULL)。
我已经能够使用打开的连接在单独的 DLL 调用中成功“选择”数据。
回答这个问题,OCIServerAttach 是什么样的?
#ifdef HAVE_ORACLE
case oracle_api:
sprintf(EasyConnect, "%s:%d/%s", host, (port==0) ? 1521: port, db_nm);
retCode = OCIEnvCreate((OCIEnv **) &db_ref->envhp, (ub4) OCI_DEFAULT,
(dvoid *) 0, (dvoid * (*)(dvoid *,size_t)) 0,
(dvoid * (*)(dvoid *, dvoid *, size_t)) 0,
(void (*)(dvoid *, dvoid *)) 0, (size_t) 0, (dvoid **) 0);
if (retCode != 0) {
(void) sprintf(debug_str, "OCIEnvCreate failed with retCode = %d.\n", retCode);
LV_str_cp(debug, debug_str); return(-1);}
(void) OCIHandleAlloc( (dvoid *) db_ref->envhp, (dvoid **) &db_ref->errhp, OCI_HTYPE_ERROR,
(size_t) 0, (dvoid **) 0); /* server contexts */
(void) OCIHandleAlloc( (dvoid *) db_ref->envhp, (dvoid **) &db_ref->srvhp, OCI_HTYPE_SERVER,
(size_t) 0, (dvoid **) 0);
(void) OCIHandleAlloc( (dvoid *) db_ref->envhp, (dvoid **) &db_ref->svchp, OCI_HTYPE_SVCCTX,
(size_t) 0, (dvoid **) 0);
retCode = OCIServerAttach( db_ref->srvhp, db_ref->errhp, (text *) EasyConnect, /* Connect to the target */
strlen((const char *) EasyConnect), 0);
最佳答案
我找到了解决该问题的方法,即,由于查询正在工作,我可以使用:
SELECT Banner FROM v$version WHERE Banner LIKE 'Oracle%'
获取服务器信息(如下):
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
我仍然想查看如何使用OCIServerRelease和OCIServerVersion的示例。我认为值得注意的是,Oracle 没有提供任何帮助或支持,但他们确实主动出售了一份服务契约(Contract)。
关于c - 如何从 C 程序使用 OCIServerVersion (Oracle)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52210612/
我是一名优秀的程序员,十分优秀!