1. 程式人生 > >2007年5月24日 星期四

2007年5月24日 星期四

    今天,該hezhi和junzhuan的錯誤,總算是改完了
    其中一個有趣的問題,就是使用者要輸入趨於2000個漢字,漢字啊,據說utf8編碼一個漢字要3個字元,我說報的錯誤說我的字元數跟我輸入的漢字數怎麼也對不上關係呢,鬱悶了我老半天
    用的是oracle資料庫
    用普通的方法行不通
   

    PreparedStatement pst = conn.prepareStatement("insert into table(name,book) values(?,?)");
    pst.setString(1, "spring");

    pst.setString(2,s);
    pst.execute();

    這麼寫報錯: java.sql.SQLException: 資料大小超出此型別的最大值: 5606
    5606是oracle判斷的字元數

    在網上查了以下,有高手說可能是oracle jdbc實現setString方法的原因

    用字元流插入就行了

    PreparedStatement pst = conn.prepareStatement("insert into table(name,book) values(?,?)");
    pst.setString(1, "spring");

    pst.setCharacterStream(2, new InputStreamReader(new ByteArrayInputStream(s.getBytes())), s.length());
    pst.execute();

    這樣可以正常插入。

    高興...

    可是好景不長,修改也用如此方法改之,記過又報錯: java.sql.SQLException: ORA-01483: DATE 或 NUMBER 賦值變數的長度無效

     我暈,在我本地機子上tomcat環境下執行是沒有這種錯誤的,而部署到伺服器上,伺服器上是weblogic,就報這樣的錯誤,修改失敗,而 insert就沒有錯誤,而且如果修改字元數較小的就能修改成功,如果修改較大的就會報錯,之後不管修改什麼樣的,都會報錯,鬧鬼了,納悶了,這是什麼錯 誤啊,接著在網上查,高手建議

把一個字元拆成兩個代入

    改成下面這樣子

        int length=book.length();
        String s1="";
        String s2="";
        if(length>1000){
            s1=book.substring(0,1000);
            s2=book.substring(1000,length);
        }else{
            s1=book;
           
        }

         pstmt = conn.prepareStatement("update table set book=?||? "+
                                        "where name=?");
       pstmt.setString(1, s1);
       pstmt.setString(2, s2);
       pstmt.setInt(3, “spring”);

    結果就成功了,嘿嘿,原來還有這種方法,這是oracle特有的麼?呵呵對oracle不熟悉

    而讓人納悶的是為什麼在我的tomact下就沒有這種錯誤呢,而insert的時候也沒有錯誤啊。納悶