天天看点

使用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());

        有不尽之处,请看客不吝指教。