我的开发工具是VC++ ,用OCI进行数据库的连接,在执行Insert和Update语句的时候能正常执行,但是用Select语句就不行,比如我用 Select * from A,结果是"Error while trying to retrieve text for error ORA-03106",但是用Select count(*) from A 又能正常出结果,这是为什么啊???

解决方案 »

  1.   

    不是,我刚刚又发现了一条线索,那就是select语句里面如果查询的字段只有数字类型的,就不会有错,如果有字符型(VARCHAR2)的,就会报错,比如Select Field1 from A,如果Field1为Number型就不不会有错,但是如果是VARCHAR2就会有错
      

  2.   

    ORA-03106 fatal two-task communication protocol error
    Cause: The communication path between Oracle and the user task has stopped.
    This is an internal error message not usually issued.
    Action: Contact Oracle Support Services.可能是数据库软件安装不正确,或者是补丁不完整。
    请dba帮你看看alert.log,是否有严重的数据库错误。-----------------------------------------------------------
    《征服C/C++企业软件开发核心技术》
    主题词 unix/linux 多线程 网络通讯 数据库 内存排错和性能分析
    http://www.khp.com.cn/books/detail.asp?bookid=1707
      

  3.   

    估计你OCIDefinebypos()里定义的输出类型参数是SQLT_NUM select count(*) from A 表示查找A表中的数据行数 返回值是number 类型 当然可以执行了select * from A  得到的可不只是一个NUMBER类型
      

  4.   

    最新理解,是函数OCIStmtExec()的参数问题吧?OCIStmtExecute(m_pFSvcCtxhp, Stmthp1, m_pFErrorhp, num, 0,
          NULL, NULL, OCI_DEFAULT);num:
    如果执行只影响一条的话,就用1,
    如果是不确定影响多少条,则用0。
      

  5.   

    感觉是对于结果绑定不对导致的,要取结果的话,需要根据select后对应的字段来决定绑定变量的定义以及绑定过程,而select count(*) 的返回解释就是一个字段,select *返回则会出现多个字段,从而导致无法执行
    另外,我在做update时总是没有效果,sql如下:"UPDATE TABLE SET A=:A WHERE B=:B",其中B字段是VARCHAR2的,如果这个字段不作为绑定变量的话是可以正常更新的,但是一旦是绑定变量后程序执行也都是成功的,就是数据库对应记录没有发生变化,不知道为什么呢?
      

  6.   

    初步推断:
    OCIDefinebypos()函数使用有误,类型绑定没有设置好吧。