各位前辈好
    最近我在一个数据迁移的项目,就是把老项目的一个小应用挖出来,其中有有两个地方用到clob字段,分别如下:
一、
        ......
        java.io.Reader reader = null;
        ProposalBean ProposalBean = qpwebService.showProposalBean.getProposalByID(id);
        String title = ProposalBean.getTitle();
        java.sql.Clob content = ProposalBean.getContent();
         reader = ((oracle.sql.CLOB)content).getCharacterStream();
        char[] cbuf = new char[((oracle.sql.CLOB)content).getBufferSize()];
        .......
二、
        ......
        PFeedbackBean PFeedbackBean = qpwebService.showFeedbackBean.getFeedbackByID(id);
        java.sql.Clob content = PFeedbackBean.getContent();
        reader = ((oracle.sql.CLOB)content).getCharacterStream();
        char[] cbuf = new char[((oracle.sql.CLOB)content).getBufferSize()];其中一的Clob能正确去到值
但是二中在运行到“reader = ((oracle.sql.CLOB)content).getCharacterStream();”时报错:
java.sql.SQLException: 必须登录到服务器
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
at oracle.jdbc.dbaccess.DBError.check_error(DBError.java:1160)
at oracle.jdbc.ttc7.TTC7Protocol.assertLoggedIn(TTC7Protocol.java:2196)
at oracle.jdbc.ttc7.TTC7Protocol.lobLength(TTC7Protocol.java:2698)
at oracle.sql.LobDBAccessImpl.length(LobDBAccessImpl.java:468)
at oracle.sql.CLOB.length(CLOB.java:214)

解决方案 »

  1.   


    好像没有报ora错误啊,这里报的是:必须登录到服务器,你在后台 用system.out.print("conn:"+conn)打印下看你的数据库连接获取到了吗?
      

  2.   

    谢谢楼上,数据库连接正常,说明下,我上面所说的“一”,“二”分别是两个不同的java方法,对应两个表,一中的数据我用System.out.println(content.getSubString((long)   1,   (int)   content.length()));能打印出数据,而二中System.out.println(content.getSubString((long)   1,   (int)   content.length()));确是报错,我就很纳闷了,同样的数据库,同样的方法,同样的Nclob终端,调用一的时候没报错,调用二的时候报错了。
      

  3.   

    它们查的是同一个表吗?
    第二个的字段类型是Nclob吗?
    可以把第二段代码上下贴出来吗,还有用到PFeedbackBean中的字段;
    最后是详细的报错信息
      

  4.   

    到hibernate的乱弹里问问,感觉是不是本身你使用hibernate的问题。
      

  5.   

    oracle 大字段clob的要用最新的驱动odbc14.jar
    再hibernate中把它映射成string类型就可以把它当
    string类型来用了,楼主可以试一试
      

  6.   

            String id = request.getParameter("id");
            java.io.Reader reader = null;
            PFeedbackBean PFeedbackBean = qpwebService.showFeedbackBean.getFeedbackByID(id);
    String propID = PFeedbackBean.getProp_id();
            java.sql.Clob content = PFeedbackBean.getContent();
            java.util.Date feedbackDT = PFeedbackBean.getFeedbackDT();
            reader = ((oracle.sql.CLOB)content).getCharacterStream();
            char[] cbuf = new char[((oracle.sql.CLOB)content).getBufferSize()];
            int len = 0;
            int rowCount = 0;
            int charCount = 0;
    long fileLen = content.length();
    //每行中半角字符的个数
    int lowerCount = 0;
    Loop:
            while((len=reader.read(cbuf)) != -1){
                for(int i =0;i<cbuf.length;i++){
    System.out.print(cbuf[i]);}
            }源代码就是这样,这里两边都是Nclob字段
      

  7.   

    这个问题我也纠结好久,后来我把这段代码:一、
            ......
            java.io.Reader reader = null;
            ProposalBean ProposalBean = qpwebService.showProposalBean.getProposalByID(id);
            String title = ProposalBean.getTitle();
            java.sql.Clob content = ProposalBean.getContent();
            reader = ((oracle.sql.CLOB)content).getCharacterStream();
            char[] cbuf = new char[((oracle.sql.CLOB)content).getBufferSize()];
            .......
    二、
            ......
            PFeedbackBean PFeedbackBean = qpwebService.showFeedbackBean.getFeedbackByID(id);
            java.sql.Clob content = PFeedbackBean.getContent();
           reader = ((oracle.sql.CLOB)content).getCharacterStream();
            char[] cbuf = new char[((oracle.sql.CLOB)content).getBufferSize()];放置在Biz层中,结果有用了,(我的框架是S2SH)并带了,事务管理。