当前位置: 代码迷 >> Java Web开发 >> JDBC的Preparestatement安插数据 字段总是空的
  详细解决方案

JDBC的Preparestatement安插数据 字段总是空的

热度:50   发布时间:2016-04-12 23:16:11.0
JDBC的Preparestatement插入数据 字段总是空的
今天写项目,用了最简单的Preparestatement往数据库里插入数据,结果有一个字段总是空的
关键代码:
insert into em_salary_batch (BATCH_ID,HALL_CODE,SALARY_MONTH,INSERT_USER,INSERT_TIME,STATUS) values (?,?,?,?,sysdate,?)



public static final BigDecimal BATCH_STATUS1 = BigDecimal.valueOf(1); // 等待上传
public static EmSalaryBatchPK create(EmSalaryBatchVO pEmSalaryBatchVO) throws Exception {
PreparedStatement pst = null;
ResultSet rs = null;
String sql = null;
Connection conn = null;
EmSalaryBatchPK pk = null;
try {
conn = DBUtil.getConnection();
sql = "insert into em_salary_batch (BATCH_ID,HALL_CODE,SALARY_MONTH,INSERT_USER,INSERT_TIME,STATUS) values (?,?,?,?,sysdate,?)";
pst = conn.prepareStatement(sql);
int pos = 1;
pst.setLong( pos++ , pEmSalaryBatchVO.getBatchId());
pst.setString( pos++ , pEmSalaryBatchVO.getHallCode());
pst.setString( pos++ , pEmSalaryBatchVO.getSalaryMonth());
pst.setBigDecimal( pos++ , pEmSalaryBatchVO.getInsertUsr());
pst.setBigDecimal( pos++ ,BATCH_STATUS1 );

log.info("EmSalaryBatchDAO.算薪状态:" + BATCH_STATUS1);

int nRow = pst.executeUpdate();
if (nRow != 1) {
String error = "DAOCreate: EmSalaryBatchDAO("
+ pEmSalaryBatchVO.toString() + ") not found";
throw new Exception(error);
}
} catch (Exception e) {
log.error("DAO Create Error", e);
throw e;
} finally {
DBUtil.close(rs, pst, conn);
}
pk = new EmSalaryBatchPK(pEmSalaryBatchVO.getBatchId());
return pk;
}

开始我怀疑是Oracle数据库的缓存问题,但是我没有权限清缓存,只能把SQL语句重新排列一下,结果那个字段还是空值。
用反编译工具把.class文件翻出来看看,没发现哪里有问题,跟源代码没什么差别。
后来我直接改成拼接SQL语句,把values的值都写死了,结果这次那个字段就有值了,这是什么奇怪的问题?有没有遇到过啊。

------解决方案--------------------
问题描述的很清楚。根据你的原因 应该是获取不到参数的值。你把值不要写死的情况下,把值获取到,打印出来。再看看结果
------解决方案--------------------
你插入的有值的字段正确吗?prepareStatement的占位符不是从1开始的吗?你的pos++是不是应该换成++pos啊;
------解决方案--------------------
哪一个字段总是空的啊,可能是debug模式搞的鬼,
你先别用pos++,直接用1,2,3,4,5试试呢。。。
------解决方案--------------------
貌似你的第四个和第五个值字段都不一样啊,什么情况。
------解决方案--------------------
吧pst.setBigDecimal( pos++ ,BATCH_STATUS1 );改成pst.setBigDecimal( pos+1 ,BATCH_STATUS1 );

因为你的第五个参数是sysdate  BATCH_STATUS1是第六个参数
  相关解决方案