天天看點

使用Java Web對Access資料庫的備注字段操作問題

        近期有個小CMS項目,由于伺服器、人員以及管理制度等一系列問題,不得不采用Java Web+Access這種不倫不類的組合進行開發,期間遇到了一個小問題,那就是文章内容采用Access的“備注”類型存取時,發生自動截斷的問題。也就是說,存進去10000字的文章,隻能顯示出3000字。經過查找資料和實驗,發現這個問題是PreparedStatement的setter()和getter()方法使用不當造成的。

        官方資料顯示,Access的“備注”字段的字元個數,若通過使用者界面輸入則最大為65,535;若以程式設計方式輸入時則可支援1G位元組的字元存儲。是以不存在資料庫字段類型選擇錯誤的問題。那麼隻有在存取的過程中找問題了。

        Java的String類型忘了究竟能存放多少個字元了(10的16次方?),總之也不是String類型的錯誤。是以,就将問題定位在了處理資料庫存放的setter()和getter()方法上了。經查,setString()方法能存的值取決于該參數相對于驅動程式在

VARCHAR

值上的限制的大小。Google了一下,網上提供了各種方法,試了試clob的方式,發現Access似乎不支援clob,是以我決定試一試字元流的方式進行存取。經過試驗,終于成功,現将代碼提供如下:

一、使用setCharacterStream()向Access資料庫中存放資料

//content為String型的文章内容

java.io.Reader clobReader = new java.io.StringReader(content);

pStatement.setCharacterStream(4, clobReader, content.length());

二、将位元組流方法封裝起來

public class UtilTools {

/*

* 在access資料庫中,将Memo備注型字段裡的資料完整取出

* @param InputStream

* @return StringBuilder

*/

public StringBuilder accessdbMemoToString(InputStream in)

{

BufferedReader reader=new BufferedReader(new InputStreamReader(in));

StringBuilder sb=new StringBuilder();

String line=null;

try {

while((line=reader.readLine())!=null){

sb.append(line);

}

} catch (IOException e) {

e.printStackTrace();

}

return sb;

}

三、調用二中的方法,實作從Access資料庫中完整取資料

//db為相應的POJO對象,"content"為字段名稱,rs為ResultSet對象

UtilTools ut = new UtilTools();

db.setContent(ut.accessdbMemoToString(rs.getBinaryStream("content")).toString());

        有不盡之處,請看客不吝指教。