为什么读取不了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;}

解决方案 »

  1.   

    do
        {
            printf("empno:%d\tename:%s\n",empno,empname);
        }while(OCIStmtFetch2(mystmt,myerrorhp,1,OCI_FETCH_NEXT,1,OCI_DEFAULT)!=OCI_NO_DATA);楼主的意思是,这段话里什么有用的EMP信息都打不出来?
    程序正常结束?
      

  2.   

    还是说:因为OCIStmtFetch2的结果是OCI_NO_DATA,所以不走do{} while循环?
      

  3.   

    反正是读不出数据库里面的信息。。换成以下代码,用以前的方式写就成功的将数据读取出来了。用现在的方法就是取不出数据来。Lda_Def lda;
    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);
    }