做一个项目,需要往数据库中添加数据,在tomcat上测试是好的,但是放到WebShere上就报索引丢失的异常,在网上找答案,可是都说是参数不匹配或者数据类型不匹配,我的SQL语句是动态生成的,是通过读取文件head获得的,文件中有多少个字段我就insert多少个字段,,而且我把SQL语句打印出来后单独放到数据库中执行又是能通过的。实在是不能搞定了,在此求助各位了!!!
StringBuffer st = new StringBuffer();
st.append("insert into "+type +" ( ");
for(int i =0;i<list.size();i++){
if(set.contains(list.get(i))){
st.append(mapfreshmen.get(list.get(i)).getZiduan());
if(i==list.size()-1){
st.append(" ) values ( ");
}else{
st.append(",");
}
}
}
for(int i =0;i<list.size();i++){
if(i==list.size()-1){
st.append(" ?)");
}else{
st.append("?,");
}
}
String sql = st.toString();

prepStmt = dbc.getPstmt(sql);

Object[] rowValues = null;

if(reader.hasNextRecord()){
while(reader.hasNextRecord()){
Map mapError = new HashMap();
rowValues = reader.nextRecord();
for(int i=0;i<list.size();i++){
if(mapfreshmen.get(list.get(i)).getDatetype().toLowerCase().equals("varchar2")||mapfreshmen.get(list.get(i)).getDatetype().toLowerCase().equals("char") ) {
StringDeal.HTMLEncode((String) rowValues[i]==null?"":rowValues[i].toString());
prepStmt.setString(i+1, (String) rowValues[i]==null?"":rowValues[i].toString());
}else if(mapfreshmen.get(list.get(i)).getDatetype().toLowerCase().equals("number")){
if (rowValues[i] != null)
{
if (!"".equals(rowValues[i].toString()))
{
StringDeal.HTMLEncode(rowValues[i].toString());
prepStmt.setDouble(i+1, Double.parseDouble(rowValues[i].toString()));
}
else
{
prepStmt.setObject(i+1, null);
}
}
else
{
//double? d;
prepStmt.setObject(i+1, null);
}

// System.out.println("rowValue:"+rowValues[i]);
}
mapError.put(list.get(i), rowValues[i]);
}
//修改 开始
try{
PrintParams.printOne(sql, rowValues);
prepStmt.executeUpdate();
}catch(Exception e){
e.printStackTrace();
mapError.put("错误信息", e.getMessage());
System.out.println("错误!!!!!!!!!!!!\n"+mapError);
totalError.add(mapError);
continue;

}
}
}else{
Map mapError = new HashMap();
mapError.put("error", "上传文件内容为空!");
totalError.add(mapError);
}
//prepStmt.executeBatch();


fis.close();
dbc.commit();
// flag=true;
prepStmt.close();上面那段代码中拼好了SQL语句同时判断了参数的类型,最后报错的地方是prepStmt.executeUpdate();
用的oracle数据库,打印出来的的sql语句是可以用的在线等答案,谢谢各位了!!!

解决方案 »

  1.   

    WebShere 对编码格式要求比较严格 不像TOMCAT
    你还是在WebShere 打日志 仔细看吧
      

  2.   

    就是打日志了才知道哪里错了
    这是打印出来的sql语句
    insert into HUST_RECRUIT_FRESHMEN ( BYLBDM,ZXDM,ZXMC,KSTZ,XTDW,DQDM,HKKH,KSTC,SJR,YSJZDM,CJ,ZYYTJZCJ,ZYYTFJCJ,BZ,TJSXBZ,BH,BJBH,SFDM,LQBH,RXNY,YXSH,ZYBH,KSBH,XM,XBDM,CSRQ ) values ( '0','511201102','宜宾市三中','','','511201','','英语,乒乓球','张三','','','','','','','','','51','','201009','110','000018','01258694758234','张三','1', '19900618')
    这个是报错后打印的map的内容
    {HKKH=, BJBH=, ZXMC=宜宾市三中, ZXDM=511201102, XTDW=, CJ=, TJSXBZ=, DQDM=511201, KSBH=01258694758234, KSTC=英语,乒乓球, SFDM=51, YSJZDM=, 错误信息=索引中丢失  IN 或 OUT 参数:: 11, ZYYTJZCJ=, KSTZ=, LQBH=, BH=, ZYYTFJCJ=, XM=张三, CSRQ=19900618, YXSH=110, BZ=, ZYBH=000018, BYLBDM=0, RXNY=201009, XBDM=1, SJR=张三}
      

  3.   

    刚刚又检查了一次,我换一张表做这个操作又不报错了,难道真是数据的问题?可是把sql语句单独放数据库中操作没问题啊,天,这么纠结的问题,求助各位了!!!
      

  4.   

    这个是报错后打印的map的内容
    {HKKH=, BJBH=, ZXMC=宜宾市三中, ZXDM=511201102, XTDW=, CJ=, TJSXBZ=, DQDM=511201, KSBH=01258694758234, KSTC=英语,乒乓球, SFDM=51, YSJZDM=, 错误信息=索引中丢失 IN 或 OUT 参数:: 11, ZYYTJZCJ=, KSTZ=, LQBH=, BH=, ZYYTFJCJ=, XM=张三, CSRQ=19900618, YXSH=110, BZ=, ZYBH=000018, BYLBDM=0, RXNY=201009, XBDM=1, SJR=张三}
    红色的数据,要么类型错了,要么数据有问题。对于number型的似乎不能用'',
      

  5.   

    那个SQL语句直接放数据库中操作是没问题的,只是放程序里面就报错了,还有,我换一张表做这个操作又没有问题,两张表的字段类型都是差不多的
      

  6.   

    像是数据字段类型的关系,你里面有number等数字类型不能用‘’,日期型的也要注意