为什么读取不了EMP数据表里的信息呢。。求解答
但是换在那个8I之前的OCI就能读取出来就是函数前面都带O的那个版本。
最现在这个版本怎么解决!!int main()
{
OCIEnv *myenvhp;//环境句柄
OCIServer *mysevhp;//服务句柄
OCIError *myerrorhp;//错误句柄
OCISession *myuserhp;//用户句柄
OCISvcCtx *mysvchp;//服务上下文句柄
OCIStmt *mystmt;//语句句柄
ub4 ub4recoedno=1;
sb4 erroecode;
char errormsg[1024];
//定义输出变量
OCIDefine *dbhp1=NULL;
OCIDefine *dbhp2=NULL;
int empno=0;
int len1;
char empname[50]={'\0'};
int len2;
ub2 stmt_type;
//定义sql语句
char sql[255]={'\0'};
sprintf(sql,"%s","select empno,ename from emp");
//创建环境,初始化oci环境
OCIEnvCreate(&myenvhp,OCI_THREADED|OCI_OBJECT,(dvoid*)0,0,0,0,(size_t)0,(dvoid**)0);
//为服务句柄分配空间
OCIHandleAlloc((dvoid*)myenvhp,(dvoid**)&mysevhp,OCI_HTYPE_SERVER,0,(dvoid**)0);
//为错误句柄分配空间
OCIHandleAlloc((dvoid*)myenvhp,(dvoid**)&myerrorhp,OCI_HTYPE_ERROR,0,(dvoid**)0);
//追加数据库名到服务句柄
if (OCIServerAttach(mysevhp,myerrorhp,(text*)"orcl",strlen("orcl"),OCI_DEFAULT)==OCI_SUCCESS)
printf("成功\n");
else
{
printf("失败\n");
if (OCIErrorGet(myerrorhp,ub4recoedno++,NULL,&erroecode,(oratext*)errormsg,sizeof(errormsg),OCI_HTYPE_ERROR)==OCI_SUCCESS)
{
printf("errorcode:%d/nerrormsg:%s",erroecode,errormsg);
getch();
}
return -1;
}
//为上下文句柄分配空间
OCIHandleAlloc((dvoid*)myenvhp,(dvoid**)&mysvchp,OCI_HTYPE_SVCCTX,0,(dvoid**)0);
//设置上下文句柄值
OCIAttrSet((dvoid*)mysvchp,OCI_HTYPE_SVCCTX,(dvoid*)mysevhp,(ub4)0,OCI_ATTR_SERVER,myerrorhp);
//为用户句柄分配空间
OCIHandleAlloc((dvoid*)myenvhp,(dvoid**)&myuserhp,OCI_HTYPE_SESSION,0,(dvoid**)0);
//为用户句柄OCI_ATTR_USERNAME 附加值
OCIAttrSet((dvoid*)myuserhp,OCI_HTYPE_SESSION,(dvoid*)"scott",(ub4)strlen("scott"),OCI_ATTR_USERNAME,myerrorhp);
//为用户句柄OCI_ATTR_PASSWORD 附加值
OCIAttrSet((dvoid*)myuserhp,OCI_HTYPE_SESSION,(dvoid*)"admin",(ub4)strlen("admin"),OCI_ATTR_PASSWORD,myerrorhp);
//连接数据库打开一个会话
if (OCISessionBegin(mysvchp,myerrorhp,myuserhp,OCI_CRED_RDBMS,OCI_DEFAULT)==OCI_SUCCESS)
printf("OK\n");
else
{
printf("fail\n");
return -1;
} //为上下文句柄设置OCI_ATTR_SESSION 值
OCIAttrSet((dvoid*)mysvchp,OCI_HTYPE_SVCCTX,(dvoid*)myuserhp,(ub4)0,OCI_ATTR_SESSION,OCI_DEFAULT);
//为SQL语句分配空间
if(OCIHandleAlloc((dvoid*)myenvhp,(dvoid**)&mystmt,OCI_HTYPE_STMT,(size_t)0,(dvoid**)0)!=OCI_SUCCESS)
{
printf("分配语句句柄错误");
getch();
return -1;
}
//绑定前的准备
if(OCIStmtPrepare(mystmt,myerrorhp,(text*)sql,(ub4)strlen((char*)sql),(ub4)OCI_NTV_SYNTAX,(ub4)OCI_DEFAULT)!=OCI_SUCCESS)
{
printf("绑定前准备错误");
getch();
return -1;
} memset(empname,'\0',sizeof(empname));
//绑定第一列
len1=0;
OCIDefineByPos(mystmt,&dbhp1,myerrorhp,1,(dvoid*)&empno,sizeof(int),SQLT_INT,NULL,&len1,NULL,OCI_DEFAULT);
//绑定第二列
len2=0;
OCIDefineByPos(mystmt,&dbhp2,myerrorhp,2,(dvoid*)&empname,sizeof(empname),SQLT_CHR,NULL,&len2,NULL,OCI_DEFAULT);
//获得SQL类型
OCIAttrGet((dvoid*)mystmt,(ub4)OCI_HTYPE_STMT,(dvoid*)&stmt_type,(ub4*)0,(ub4)OCI_ATTR_STMT_TYPE,myerrorhp);
//执行SQL OCIStmtExecute(mysvchp,mystmt,myerrorhp,(ub4)(stmt_type==OCI_STMT_SELECT?1:0),(ub4)0,(OCISnapshot *)NULL,(OCISnapshot *)NULL,OCI_DEFAULT);
do
{
printf("empno:%d\tename:%s\n",empno,empname);
}while(OCIStmtFetch2(mystmt,myerrorhp,1,OCI_FETCH_NEXT,1,OCI_DEFAULT)!=OCI_NO_DATA);
//结束会话
OCISessionEnd(mysvchp,myerrorhp,myuserhp,OCI_DEFAULT);
//断开数据库
OCIServerDetach(mysevhp,myerrorhp,OCI_DEFAULT);
//释放所有句柄,当释放环境父句柄,它的子句柄内容都会自动释放
OCIHandleFree((void*)myenvhp,OCI_HTYPE_ENV); getch();
return 0;}
但是换在那个8I之前的OCI就能读取出来就是函数前面都带O的那个版本。
最现在这个版本怎么解决!!int main()
{
OCIEnv *myenvhp;//环境句柄
OCIServer *mysevhp;//服务句柄
OCIError *myerrorhp;//错误句柄
OCISession *myuserhp;//用户句柄
OCISvcCtx *mysvchp;//服务上下文句柄
OCIStmt *mystmt;//语句句柄
ub4 ub4recoedno=1;
sb4 erroecode;
char errormsg[1024];
//定义输出变量
OCIDefine *dbhp1=NULL;
OCIDefine *dbhp2=NULL;
int empno=0;
int len1;
char empname[50]={'\0'};
int len2;
ub2 stmt_type;
//定义sql语句
char sql[255]={'\0'};
sprintf(sql,"%s","select empno,ename from emp");
//创建环境,初始化oci环境
OCIEnvCreate(&myenvhp,OCI_THREADED|OCI_OBJECT,(dvoid*)0,0,0,0,(size_t)0,(dvoid**)0);
//为服务句柄分配空间
OCIHandleAlloc((dvoid*)myenvhp,(dvoid**)&mysevhp,OCI_HTYPE_SERVER,0,(dvoid**)0);
//为错误句柄分配空间
OCIHandleAlloc((dvoid*)myenvhp,(dvoid**)&myerrorhp,OCI_HTYPE_ERROR,0,(dvoid**)0);
//追加数据库名到服务句柄
if (OCIServerAttach(mysevhp,myerrorhp,(text*)"orcl",strlen("orcl"),OCI_DEFAULT)==OCI_SUCCESS)
printf("成功\n");
else
{
printf("失败\n");
if (OCIErrorGet(myerrorhp,ub4recoedno++,NULL,&erroecode,(oratext*)errormsg,sizeof(errormsg),OCI_HTYPE_ERROR)==OCI_SUCCESS)
{
printf("errorcode:%d/nerrormsg:%s",erroecode,errormsg);
getch();
}
return -1;
}
//为上下文句柄分配空间
OCIHandleAlloc((dvoid*)myenvhp,(dvoid**)&mysvchp,OCI_HTYPE_SVCCTX,0,(dvoid**)0);
//设置上下文句柄值
OCIAttrSet((dvoid*)mysvchp,OCI_HTYPE_SVCCTX,(dvoid*)mysevhp,(ub4)0,OCI_ATTR_SERVER,myerrorhp);
//为用户句柄分配空间
OCIHandleAlloc((dvoid*)myenvhp,(dvoid**)&myuserhp,OCI_HTYPE_SESSION,0,(dvoid**)0);
//为用户句柄OCI_ATTR_USERNAME 附加值
OCIAttrSet((dvoid*)myuserhp,OCI_HTYPE_SESSION,(dvoid*)"scott",(ub4)strlen("scott"),OCI_ATTR_USERNAME,myerrorhp);
//为用户句柄OCI_ATTR_PASSWORD 附加值
OCIAttrSet((dvoid*)myuserhp,OCI_HTYPE_SESSION,(dvoid*)"admin",(ub4)strlen("admin"),OCI_ATTR_PASSWORD,myerrorhp);
//连接数据库打开一个会话
if (OCISessionBegin(mysvchp,myerrorhp,myuserhp,OCI_CRED_RDBMS,OCI_DEFAULT)==OCI_SUCCESS)
printf("OK\n");
else
{
printf("fail\n");
return -1;
} //为上下文句柄设置OCI_ATTR_SESSION 值
OCIAttrSet((dvoid*)mysvchp,OCI_HTYPE_SVCCTX,(dvoid*)myuserhp,(ub4)0,OCI_ATTR_SESSION,OCI_DEFAULT);
//为SQL语句分配空间
if(OCIHandleAlloc((dvoid*)myenvhp,(dvoid**)&mystmt,OCI_HTYPE_STMT,(size_t)0,(dvoid**)0)!=OCI_SUCCESS)
{
printf("分配语句句柄错误");
getch();
return -1;
}
//绑定前的准备
if(OCIStmtPrepare(mystmt,myerrorhp,(text*)sql,(ub4)strlen((char*)sql),(ub4)OCI_NTV_SYNTAX,(ub4)OCI_DEFAULT)!=OCI_SUCCESS)
{
printf("绑定前准备错误");
getch();
return -1;
} memset(empname,'\0',sizeof(empname));
//绑定第一列
len1=0;
OCIDefineByPos(mystmt,&dbhp1,myerrorhp,1,(dvoid*)&empno,sizeof(int),SQLT_INT,NULL,&len1,NULL,OCI_DEFAULT);
//绑定第二列
len2=0;
OCIDefineByPos(mystmt,&dbhp2,myerrorhp,2,(dvoid*)&empname,sizeof(empname),SQLT_CHR,NULL,&len2,NULL,OCI_DEFAULT);
//获得SQL类型
OCIAttrGet((dvoid*)mystmt,(ub4)OCI_HTYPE_STMT,(dvoid*)&stmt_type,(ub4*)0,(ub4)OCI_ATTR_STMT_TYPE,myerrorhp);
//执行SQL OCIStmtExecute(mysvchp,mystmt,myerrorhp,(ub4)(stmt_type==OCI_STMT_SELECT?1:0),(ub4)0,(OCISnapshot *)NULL,(OCISnapshot *)NULL,OCI_DEFAULT);
do
{
printf("empno:%d\tename:%s\n",empno,empname);
}while(OCIStmtFetch2(mystmt,myerrorhp,1,OCI_FETCH_NEXT,1,OCI_DEFAULT)!=OCI_NO_DATA);
//结束会话
OCISessionEnd(mysvchp,myerrorhp,myuserhp,OCI_DEFAULT);
//断开数据库
OCIServerDetach(mysevhp,myerrorhp,OCI_DEFAULT);
//释放所有句柄,当释放环境父句柄,它的子句柄内容都会自动释放
OCIHandleFree((void*)myenvhp,OCI_HTYPE_ENV); getch();
return 0;}
{
printf("empno:%d\tename:%s\n",empno,empname);
}while(OCIStmtFetch2(mystmt,myerrorhp,1,OCI_FETCH_NEXT,1,OCI_DEFAULT)!=OCI_NO_DATA);楼主的意思是,这段话里什么有用的EMP信息都打不出来?
程序正常结束?
Cda_Def cda;
ub1 hda[256];
text *sqlstatemnt="select ename,sal from emp where deptno=:1";float salaries[12000];
text names[12000][20];
sb2 sal_ind[12000],name_ind[12000];
sword deptnumber;
int main()
{
int i,len;
//与oracle连接
if (olon(&lda,"scott/admin",-1,0,-1,0))
{
printf("cannot connect to oracle as scott/admin \n");
exit(1);
}
//打开光标
if (oopen(&cda,&lda,0,-1,-1,0,-1))
{
printf("cannot open cursor\n");
ologof(&lda);
exit(1);
}
//处理sql语句
//延迟分析
oparse(&cda,sqlstatemnt,-1,1,1);
//提示输入部门号
printf("Enter department number:");
scanf("%d",&deptnumber);
//延迟结合
obndrn(&cda,1,&deptnumber,(int)sizeof(int),3,-1,0,0,-1,-1);
//定义输出变量
odefin(&cda,2,salaries,4,4,-1,sal_ind,0,-1,-1,NULL,NULL); odefin(&cda,1,names,20,1,-1,name_ind,0,-1,-1,NULL,NULL);
//检索12000个人的工资
oexfet(&cda,12000,0,0);
for (i=0;i<12;i++)
{
if (name_ind[i]==-1)
names[i][0]='\0';
else
names[i][19]='\0';
if(sal_ind[i]==-1)
printf("\n%s",names[i]);
else
printf("\n%s\t%f",names[i],salaries[i]);
}
//关闭光标
if(oclose(&cda))
exit(1);
if(ologof(&lda))
exit(1);
getch();
exit(0);
}