近期有個小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());
有不盡之處,請看客不吝指教。