Java操作MS SQL:Insert嵌套Select遇索引越界问题求助
解决PreparedStatement索引越界问题:The index 5 is out of range
嘿,这个错误其实挺典型的,咱们先拆解下问题根源:
你的SQL语句里,VALUES子句中只有4个占位符(?)——也就是((子查询), ?, ?, ?, ?)里的那四个问号,但你却调用了5次参数设置方法(从setInt(1,1)到setTime(5,...)),这就导致第5个参数找不到对应的占位符,直接触发了索引越界报错。
下面给你两种针对性的修复方案:
方案一:如果Location_name = 'Mic HR1'是固定值
直接去掉多余的stmt.setInt(1,1),然后把后续参数的索引全部往前挪一位,让它们和SQL里的占位符一一对应:
PreparedStatement stmt = connection.prepareStatement( "INSERT INTO RECORDS (LocationId, RecId, RecValues, YearTime, HourTime) " + "VALUES ((SELECT LocationId from Locations where Location_name = 'Mic HR1'), ?, ?, ?, ?)" ); stmt.setInt(1, recid); // 对应第一个? stmt.setInt(2, inputData); // 对应第二个? stmt.setDate(3, sqlDate); // 对应第三个? stmt.setTime(4, Time.valueOf(dtf.format(now))); // 对应第四个? stmt.executeUpdate();
方案二:如果Location_name需要动态传入(更推荐)
把Location_name也改成占位符,这样SQL里就有5个?,参数索引就能完全匹配了,还能避免硬编码和SQL注入风险:
PreparedStatement stmt = connection.prepareStatement( "INSERT INTO RECORDS (LocationId, RecId, RecValues, YearTime, HourTime) " + "VALUES ((SELECT LocationId from Locations where Location_name = ?), ?, ?, ?, ?)" ); stmt.setString(1, "Mic HR1"); // 对应子查询里的第一个? stmt.setInt(2, recid); // 对应第二个? stmt.setInt(3, inputData); // 对应第三个? stmt.setDate(4, sqlDate); // 对应第四个? stmt.setTime(5, Time.valueOf(dtf.format(now))); // 对应第五个? stmt.executeUpdate();
小提醒
使用PreparedStatement时,占位符的索引是从1开始计数的,一定要和SQL中?的数量、顺序完全对应,不然很容易出现索引越界或者参数匹配错误的问题。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

