怎样用VC++调用oci实现基本的查询功能 大家好,我想用vc++ 调用oci实现基本的sql查询,select table_name,tablespace_name from user_tables怎样实现呀,非常急,请各位多多指教 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果只是简单的查询需要OCI吗?OCI可不是一两句话说的清的 我已连接数据库,在函数OCIDefineByPos和OCIDefineObject有问题不知怎样定义 OCIType *addr_tdo = (OCIType *) 0; OCIDefine *defn1p = (OCIDefine *) 0, *defn2p = (OCIDefine *) 0; sword status; OCIRef *addrref = (OCIRef *) 0, *addrref1 = (OCIRef *) 0; sword custno =0; int i = 0; UserTable *addr=NULL; ub4 ref_len; /* define the application request */ checkerr(errhp, OCIStmtPrepare(stmthp, errhp, (text *)cSQL, (ub4)strlen(cSQL), (ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT)); checkerr(errhp, OCIDefineByPos(stmthp, &defn1p, errhp, (ub4) 1, (dvoid *)0 /*&addr*/, (sb4) sizeof(addr), SQLT_CHR, (dvoid *) 0, (ub2 *)0, (ub2 *)0, (ub4) OCI_DEFAULT)); addrref = (OCIRef *)NULL; checkerr(errhp, OCIDefineByPos(stmthp, &defn2p, errhp, (ub4) 2, (dvoid *) NULL, (sb4) 0, SQLT_REF, (dvoid *) 0, (ub2 *)0, (ub2 *)0, (ub4) OCI_DEFAULT)); OCITypeByName(envhp, errhp, svchp, (text *)0, (ub4)0, (text *)"table_name", (ub4)strlen((char *)"table_name"), (text *) 0, (ub4) 0, OCI_DURATION_SESSION, OCI_TYPEGET_HEADER, &addr_tdo); checkerr(errhp, OCIDefineObject(defn2p, errhp, addr_tdo, (dvoid **)addrref, &ref_len, (dvoid **)0, (ub4 *)0)); checkerr(errhp, OCIStmtExecute(svchp, stmthp, errhp, (ub4)0, (ub4) 0, (OCISnapshot *) NULL, (OCISnapshot *) NULL, (ub4) OCI_DEFAULT)); do { printf("custno = %d fetched address\n", custno); if ( addrref ) { // pin_display_tables(envhp, errhp, addrref); } else printf("Address ref is NULL\n"); } while ((status = OCIStmtFetch(stmthp, errhp, (ub4) 1, (ub4) OCI_FETCH_NEXT, (ub4) OCI_DEFAULT)) == OCI_SUCCESS || status == OCI_SUCCESS_WITH_INFO); if ( status != OCI_NO_DATA ) checkerr(errhp, status); printf("\n\n"); } 建议自己先封装一下OCI然后再用!! 给你一个例程: boolean logged_on = FALSE; text *username = (text *) "mp3"; text *password = (text *) "zsmp3"; text *dbname = (text *) "ora85"; text *mySql = (text *)"select c1,c2 from test")"; OCIEnv *envhp; OCISvcCtx *svchp; OCIError *errhp; OCIStmt *select_p; OCIDefine *defnp[2]; sword errr; sword status; sword a,b,swResult; char rname[100]; char rurl[100]; memset(rname,0,sizeof(rname)); memset(rurl,0,sizeof(rurl)); if (init_handles(&envhp, &errhp, (ub4)OCI_DEFAULT)) { printf("FAILED: init_handles()\n"); return cleanup(logged_on, envhp, svchp, errhp); }//登录 if (OCILogon(envhp, errhp, &svchp, username, strlen (username), password, strlen (password), dbname, strlen(dbname))) { printf("FAILED: log_on()\n"); return cleanup(logged_on, envhp, svchp, errhp); } if (OCIHandleAlloc((dvoid *)envhp, (dvoid **) &select_p,(ub4)OCI_HTYPE_STMT, (CONST size_t) 0, (dvoid **) 0)) { printf("FAILED: alloc statement handles\n"); return cleanup(logged_on, envhp, svchp, errhp); } logged_on = TRUE;//可以关闭数据库 //开始读表的操作 //准备SQL语句 if (OCIStmtPrepare (select_p, errhp,mySql, strlen(mySql), OCI_NTV_SYNTAX, OCI_DEFAULT)) { printf ("Prepare failed \n"); return (OCI_ERROR); } OCITransCommit (svchp,errhp,OCI_DEFAULT ); //OCI_DEFAULT //执行SQL语句 /* if (errr = OCIStmtExecute(svchp, select_p, errhp, (ub4) 0, (ub4) 0, (OCISnapshot *) NULL, (OCISnapshot *) NULL, (ub4) OCI_DEFAULT)) { if (errr != OCI_NO_DATA) return errr; } //指定取出的字段 if ((a=OCIDefineByPos ( select_p, &defnp[0], errhp, 1, &rname, sizeof(rname), SQLT_STR, (dvoid *) 0, (dvoid *) 0, (dvoid *) 0, OCI_DEFAULT)) || (b=OCIDefineByPos ( select_p, &defnp[1], errhp, 2, &rurl, sizeof(rurl), SQLT_STR, (dvoid *) 0, (dvoid *) 0, (dvoid *) 0, OCI_DEFAULT))) { printf ("Failed to define\n"); return (OCI_ERROR); } FILE *fp; fp=fopen("test.txt","w"); //循环取记录 OCIStmtFetch (select_p, errhp,1,OCI_FETCH_NEXT,OCI_DEFAULT))) while((swResult=OCIStmtFetch(select_p,errhp,1,OCI_FETCH_NEXT,OCI_DEFAULT)) != OCI_NO_DATA) { fprintf(fp,"%s\n%s\n",rname,rurl); } if(fp) fclose(fp);*/ return cleanup(logged_on, envhp, svchp, errhp);}void report_error(errhp)OCIError *errhp;{ text msgbuf[512]; sb4 errcode = 0; memset((void *) msgbuf, (int)'\0', (size_t)512); OCIErrorGet((dvoid *) errhp, (ub4) 1, (text *) NULL, &errcode, msgbuf, (ub4) sizeof(msgbuf), (ub4) OCI_HTYPE_ERROR); if (errcode) { printf("ERROR CODE = %d\n", errcode); printf("%.*s\n", 512, msgbuf); exit(1); }}/* ----------------------------------------------------------------- *//* initialize environment, allocate handles */ /* ----------------------------------------------------------------- */sword init_handles(envhp, errhp, init_mode)OCIEnv **envhp; OCIError **errhp; ub4 init_mode;{ printf("Environment setup ....\n"); if (OCIInitialize(init_mode, (dvoid *)0, (dvoid * (*)(dvoid *, size_t)) 0, (dvoid * (*)(dvoid *, dvoid *, size_t))0, (void (*)(dvoid *, dvoid *)) 0 )) { printf("FAILED: OCIInitialize()\n"); return OCI_ERROR; } if (OCIEnvInit((OCIEnv **) envhp, (ub4) OCI_DEFAULT, (size_t) 0, (dvoid **) 0 )) { printf("FAILED: OCIEnvInit()\n"); return OCI_ERROR; } if (OCIHandleAlloc((dvoid *) *envhp, (dvoid **) errhp, (ub4) OCI_HTYPE_ERROR, (size_t) 0, (dvoid **) 0)) { printf("FAILED: OCIHandleAlloc() on errhp\n"); return OCI_ERROR; } return OCI_SUCCESS;}/* * Exit program with an exit code. */sword cleanup(loggedon, envhp, svchp, errhp)boolean loggedon; OCIEnv *envhp; OCISvcCtx *svchp;OCIError *errhp;{ report_error(errhp); if (loggedon) OCILogoff (svchp, errhp); printf("Freeing handles ...\n"); if (envhp) OCIHandleFree((dvoid *) envhp, (ub4) OCI_HTYPE_ENV); return OCI_SUCCESS;}这个应该可以.最过研究的,其他的还不会.也正在求人指导.这个程序肯定能用. 你可以到oracle主页下载oracle帮助文档,其中有oci的文档.文档里列出了一些例子程序,程序在../ORACLE_HOME/rdbms/demo下(需要安装0racle Compaion CD即oracle安装盘第三章).这些例子是C语言写的,对使用oci讲的很清楚. oracle10gr1帮助文档下载地址:http://www.oracle.com/technology/documentation/database10g.htmloci例子需要安装oracle companion cd,安装后在../oracle_home/rdbms/demo下是源代码.oracle10gr1 companion cd的下载地址:http://www.oracle.com/technology/software/products/database/oracle10g/htdocs/winsoft.html 分区表的分区依赖列可以改么? 求助一条SQL排序 问一个OTL的问题,菜鸟级的 oracle中 数据库实例不可用 怎么解决 请问:什么是缓存级别的锁?什么是数据库级别的锁? 编译procedure时提示comparision with null ■■■■■■■■一个超级复杂的SQL语句,请问如何优化精简为简单一些的句子?■■■■■■■■■■ 救急!!!关于ORACLE数据库性能问题(运行速度) 用connect by 实现树型结构的效率问题 Oracle的内部函数 [急急急!!!]请教一个OCI函数的问题 求助:数据导入
OCI可不是一两句话说的清的
OCIDefine *defn1p = (OCIDefine *) 0, *defn2p = (OCIDefine *) 0;
sword status;
OCIRef *addrref = (OCIRef *) 0, *addrref1 = (OCIRef *) 0;
sword custno =0;
int i = 0;
UserTable *addr=NULL;
ub4 ref_len;
/* define the application request */
checkerr(errhp, OCIStmtPrepare(stmthp, errhp,
(text *)cSQL, (ub4)strlen(cSQL),
(ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT)); checkerr(errhp, OCIDefineByPos(stmthp, &defn1p, errhp, (ub4) 1,
(dvoid *)0 /*&addr*/,
(sb4) sizeof(addr), SQLT_CHR, (dvoid *) 0, (ub2 *)0,
(ub2 *)0, (ub4) OCI_DEFAULT));
addrref = (OCIRef *)NULL;
checkerr(errhp, OCIDefineByPos(stmthp, &defn2p, errhp, (ub4) 2,
(dvoid *) NULL,
(sb4) 0, SQLT_REF, (dvoid *) 0, (ub2 *)0,
(ub2 *)0, (ub4) OCI_DEFAULT));
OCITypeByName(envhp, errhp, svchp, (text *)0, (ub4)0,
(text *)"table_name",
(ub4)strlen((char *)"table_name"),
(text *) 0, (ub4) 0, OCI_DURATION_SESSION,
OCI_TYPEGET_HEADER, &addr_tdo); checkerr(errhp, OCIDefineObject(defn2p, errhp, addr_tdo,
(dvoid **)addrref,
&ref_len, (dvoid **)0, (ub4 *)0));
checkerr(errhp, OCIStmtExecute(svchp, stmthp, errhp, (ub4)0, (ub4) 0,
(OCISnapshot *) NULL, (OCISnapshot *) NULL,
(ub4) OCI_DEFAULT));
do
{
printf("custno = %d fetched address\n", custno); if ( addrref )
{
// pin_display_tables(envhp, errhp, addrref);
}
else
printf("Address ref is NULL\n"); }
while ((status = OCIStmtFetch(stmthp, errhp, (ub4) 1, (ub4) OCI_FETCH_NEXT,
(ub4) OCI_DEFAULT)) == OCI_SUCCESS ||
status == OCI_SUCCESS_WITH_INFO);
if ( status != OCI_NO_DATA )
checkerr(errhp, status); printf("\n\n");
}
boolean logged_on = FALSE;
text *username = (text *) "mp3";
text *password = (text *) "zsmp3";
text *dbname = (text *) "ora85";
text *mySql = (text *)"select c1,c2 from test")"; OCIEnv *envhp;
OCISvcCtx *svchp;
OCIError *errhp;
OCIStmt *select_p;
OCIDefine *defnp[2];
sword errr;
sword status;
sword a,b,swResult;
char rname[100];
char rurl[100];
memset(rname,0,sizeof(rname));
memset(rurl,0,sizeof(rurl)); if (init_handles(&envhp, &errhp, (ub4)OCI_DEFAULT))
{
printf("FAILED: init_handles()\n");
return cleanup(logged_on, envhp, svchp, errhp);
}
//登录
if (OCILogon(envhp, errhp, &svchp, username, strlen (username),
password, strlen (password), dbname, strlen(dbname)))
{
printf("FAILED: log_on()\n");
return cleanup(logged_on, envhp, svchp, errhp);
}
if (OCIHandleAlloc((dvoid *)envhp, (dvoid **) &select_p,(ub4)OCI_HTYPE_STMT, (CONST size_t) 0, (dvoid **) 0))
{
printf("FAILED: alloc statement handles\n");
return cleanup(logged_on, envhp, svchp, errhp);
}
logged_on = TRUE;//可以关闭数据库
//开始读表的操作
//准备SQL语句
if (OCIStmtPrepare (select_p, errhp,mySql, strlen(mySql), OCI_NTV_SYNTAX, OCI_DEFAULT))
{
printf ("Prepare failed \n");
return (OCI_ERROR);
}
OCITransCommit (svchp,errhp,OCI_DEFAULT ); //OCI_DEFAULT
//执行SQL语句
/* if (errr = OCIStmtExecute(svchp,
select_p,
errhp,
(ub4) 0,
(ub4) 0,
(OCISnapshot *) NULL,
(OCISnapshot *) NULL,
(ub4) OCI_DEFAULT))
{
if (errr != OCI_NO_DATA) return errr;
}
//指定取出的字段
if ((a=OCIDefineByPos ( select_p,
&defnp[0],
errhp,
1,
&rname,
sizeof(rname),
SQLT_STR,
(dvoid *) 0,
(dvoid *) 0,
(dvoid *) 0,
OCI_DEFAULT)) ||
(b=OCIDefineByPos ( select_p,
&defnp[1],
errhp,
2,
&rurl,
sizeof(rurl),
SQLT_STR,
(dvoid *) 0,
(dvoid *) 0,
(dvoid *) 0,
OCI_DEFAULT)))
{
printf ("Failed to define\n");
return (OCI_ERROR);
}
FILE *fp;
fp=fopen("test.txt","w");
//循环取记录 OCIStmtFetch (select_p, errhp,1,OCI_FETCH_NEXT,OCI_DEFAULT)))
while((swResult=OCIStmtFetch(select_p,errhp,1,OCI_FETCH_NEXT,OCI_DEFAULT)) != OCI_NO_DATA)
{
fprintf(fp,"%s\n%s\n",rname,rurl);
}
if(fp)
fclose(fp);*/
return cleanup(logged_on, envhp, svchp, errhp);
}void report_error(errhp)
OCIError *errhp;
{
text msgbuf[512];
sb4 errcode = 0;
memset((void *) msgbuf, (int)'\0', (size_t)512); OCIErrorGet((dvoid *) errhp, (ub4) 1, (text *) NULL, &errcode,
msgbuf, (ub4) sizeof(msgbuf), (ub4) OCI_HTYPE_ERROR);
if (errcode)
{
printf("ERROR CODE = %d\n", errcode);
printf("%.*s\n", 512, msgbuf);
exit(1);
}}
/* ----------------------------------------------------------------- */
/* initialize environment, allocate handles */
/* ----------------------------------------------------------------- */
sword init_handles(envhp, errhp, init_mode)
OCIEnv **envhp;
OCIError **errhp;
ub4 init_mode;
{
printf("Environment setup ....\n"); if (OCIInitialize(init_mode, (dvoid *)0,
(dvoid * (*)(dvoid *, size_t)) 0,
(dvoid * (*)(dvoid *, dvoid *, size_t))0,
(void (*)(dvoid *, dvoid *)) 0 ))
{
printf("FAILED: OCIInitialize()\n");
return OCI_ERROR;
} if (OCIEnvInit((OCIEnv **) envhp, (ub4) OCI_DEFAULT,
(size_t) 0, (dvoid **) 0 ))
{
printf("FAILED: OCIEnvInit()\n");
return OCI_ERROR;
} if (OCIHandleAlloc((dvoid *) *envhp, (dvoid **) errhp,
(ub4) OCI_HTYPE_ERROR, (size_t) 0, (dvoid **) 0))
{
printf("FAILED: OCIHandleAlloc() on errhp\n");
return OCI_ERROR;
}
return OCI_SUCCESS;
}/*
* Exit program with an exit code.
*/
sword cleanup(loggedon, envhp, svchp, errhp)
boolean loggedon;
OCIEnv *envhp;
OCISvcCtx *svchp;
OCIError *errhp;
{ report_error(errhp); if (loggedon)
OCILogoff (svchp, errhp); printf("Freeing handles ...\n");
if (envhp)
OCIHandleFree((dvoid *) envhp, (ub4) OCI_HTYPE_ENV); return OCI_SUCCESS;
}
这个应该可以.最过研究的,其他的还不会.也正在求人指导.这个程序肯定能用.
http://www.oracle.com/technology/documentation/database10g.html
oci例子需要安装oracle companion cd,安装后在../oracle_home/rdbms/demo下是源代码.
oracle10gr1 companion cd的下载地址:
http://www.oracle.com/technology/software/products/database/oracle10g/htdocs/winsoft.html