本身不复杂的一件事,上传后按行读取文件,内容用逗号分隔,split后就存入表,也不需要更多的数据处理。
但是保存时报错:[WARN ] 121206 11:22:45,093 JDBCExceptionReporter:77 - SQL Error: 0, SQLState: 22001
[ERROR] 121206 11:22:45,093 JDBCExceptionReporter:78 - Data truncation: Data too long for column 'swsystraceaudnum' at row 1最开始以为是字符编码的问题。但我测试了几次,全用数字,不用汉字也不要字母。最后怀疑应该是读到文件结尾的问题。因为我把赋值的顺序调换一下,也仍然是在最后一个值(5)这里报错。
而且,我打印str4后面的星号没有打印出来。
这样的话,是不是文件结尾符的问题呢?有没有这么个东西?这里要怎么做呢?大神们帮我啊!下面是日志line=111,222,333,444,555
str=111,222,333,444,555
[line-0]=111
[line-1]=222
[line-2]=333
[line-3]=444
[line-4]=555
[DEBUG] 121206 11:22:44,953 SQL:102 - select count(*) as col_0_0_ from vip_bank_inputdetail vipbankinp0_ where vipbankinp0_.panval='222' and vipbankinp0_.swsystraceaudnum='444'
detail exist,num=0
*******************
*****str4=555
*******************
id=12511121314
time=555
[DEBUG] 121206 11:22:45,031 SQL:102 - select vipbankinp_.id, vipbankinp_.merchantstype as merchant2_39_, vipbankinp_.panval as panval39_, vipbankinp_.amountoftxn as amountof4_39_, vipbankinp_.swsystraceaudnum as swsystra5_39_, vipbankinp_.timeofoctxn as timeofoc6_39_, vipbankinp_.status as status39_ from vip_bank_inputdetail vipbankinp_ where vipbankinp_.id=?
[DEBUG] 121206 11:22:45,046 SQL:102 - update vip_bank_inputdetail set merchantstype=?, panval=?, amountoftxn=?, swsystraceaudnum=?, timeofoctxn=?, status=? where id=?
[WARN ] 121206 11:22:45,093 JDBCExceptionReporter:77 - SQL Error: 0, SQLState: 22001
[ERROR] 121206 11:22:45,093 JDBCExceptionReporter:78 - Data truncation: Data too long for column 'swsystraceaudnum' at row 1
[ERROR] 121206 11:22:45,109 AbstractFlushingEventListener:301 - Could not synchronize database state with session
org.hibernate.exception.DataException: Could not execute JDBC batch update
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:77)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:251)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:168)
下面是代码
File saveFile = null;
if(penvalFile != null){
saveFile = new File(fileName);
if(!saveFile.getParentFile().exists()){
saveFile.getParentFile().mkdirs();
}
FileUtil.copy(penvalFile, saveFile);
}
if(!saveFile.exists()){//上传出错,提示用户重新上传
this.setMsg("上传失败,请重新上传!");
}else{
//2.读取上传后的文件,保存至数据库
BufferedReader  br = null;
String line = null;
String str = null;
VipBankInputDetail vbi = null;
try{
br = new BufferedReader(new FileReader(saveFile), 1024);
while((line= br.readLine()) != null){
System.out.println("line=" + line);
str = new String(line.getBytes("GBK"));
System.out.println("str=" + str);
String[] lines = str.split(",");
for(int i=0; i<lines.length; i++){
System.out.println("[line-" + i + "]=" +  lines[i]);
}
//需要检查重复
boolean isImport = memberBiz.checkPenvalCardExist(lines[1], lines[3]);
if(!isImport){//未检查到,才导入
vbi = new VipBankInputDetail();

Calendar c = Calendar.getInstance();
vbi.setId(c.YEAR + "" + c.MONTH + "" + c.DAY_OF_MONTH + "" + c.HOUR_OF_DAY + "" + c.MINUTE + "" + c.SECOND + "" + c.MILLISECOND);//id为时间序列
vbi.setMerchantsType(lines[0]);
vbi.setPanval(lines[1]);//银行卡号
vbi.setAmountOfTxn(lines[2]);//积分数值
vbi.setSwsysTraceaudNum(lines[4]);//交易流水号
// vbi.setTimeOfoctxn("4");//交易时间
String str4 = lines[4];
System.out.println("*******************");
System.out.println("*****str4=" + str4 + "******");
System.out.println("*******************");
vbi.setTimeOfoctxn(str3);
vbi.setStatus("0");//状态默认

System.out.println("id=" + vbi.getId());
System.out.println("time=" + vbi.getTimeOfoctxn());

memberBiz.saveOrUpdateEntity(vbi);
System.out.println("done one...");
}
}
this.setMsg("上传成功oooooo!");
}catch(Exception e){
e.printStackTrace();
this.setMsg("上传失败,请重新上传!");
}
}

解决方案 »

  1.   

    报错报的是JDBC的错误,也就是说你JDBC里面的语句有问题,有可能是日期格式的问题。
    我不明白为什么你发的是输入输出流的代码。
      

  2.   

    没有日期的问题,都是varchar。这点我马上在一楼里补充。
      

  3.   

    现在csdn怎么不能编辑帖了。表里的字段类型都是varchar,不存在日期之类的格式问题。
    而且一楼我说了,调换了赋值的顺序依然报错。就是在保存最后一个值(lines[4])时报错,不管把他赋值给对象的哪一个属性。
    所以我才猜测是不是有文件结尾符的影响。
      

  4.   

    保存时通过hibernate保存的,我手动给对象赋值是保存成功的,所以保存的代码是ok的。
      

  5.   

    报的错是说你这个swsystraceaudnum属性的值太长了。数据库的这个swsystraceaudnum字段长度不够。你检查下是不是长度不够
      

  6.   

    Data too long for column
    数据太长了,超过swsystraceaudnum的定义。
      

  7.   

    打印System.out.println("*******************");                         System.out.println("*****str4=" + str4 + "******");                         System.out.println("*******************"); 日志*******************
    *****str4=555
    ******************* 没发现有出入? trim先试试
      

  8.   

    当然发现了,所以我说是不是文件结尾符的问题,或者换行符的。
    trim啊,我试试去。