preparedStatement.addBatch()添加空参数
我正在使用旧的struts应用程序,并且我需要通过java批处理(因为我们可能一次添加数千行)将数据保存到数据库中。preparedStatement.addBatch()添加空参数
因此,我用这样的代码:
Connection c = null; PreparedStatement batch = null, truncate=null;
String sql = "INSERT INTO ? VALUES (?)";
try {
c = getConnection();
c.setAutoCommit(false);
batch = c.prepareStatement(sql);
for (ClassContainingData bean : values) {
batch.setString(1, bean.getTableName());
batch.setString(2, bean.getAllFieldsValues());
batch.addBatch();
}
int[] resultats = batch.executeBatch();
for(int res : resultats) {
if(res == PreparedStatement.EXECUTE_FAILED) {
batch.close();
c.close();
throw new SQLException("L'ajout des valeurs en base de données a échoué pour au moins une valeur.");
}
}
c.commit();
}
catch (BatchUpdateException b) {
throw new ServiceException("Erreur lors de l'exécution du batch", b);
}
catch (SQLException s) {
throw new ServiceException("Impossible de sauvegarder les beans en base.", s);
}
finally {
getManager().close(batch);
freeConnection(c);
}
的错误消息是法语,因为我在一家法国公司,我们对此深感抱歉工作。
所以这段代码是非常基本的,因为它受到了我在这里和网上找到的所有例子的启发,但是我有一些模糊的错误,我没有找到任何信息。
当我运行的是,我得到一个异常
CAUSE : java.sql.BatchUpdateException: ORA-00903: invalid table name.
这指出了我的数据错误,所以我双重检查,但我似乎输入没事。
弄明白,我用Eclipse调试器来查看我的preparedStatement
运行时的值,并且我发现addBatch()
增加了一个空集的参数给我preparedStatement
!
以下是运行时值的截图:左图是运行addBatch()
语句之前,右图是在此语句之后。
Screenshot of runtime values
正如你所看到的,包含我的字符串参数数组现在持有的第二行,其中只包含null
值。
注意数据:
- 这是第一次迭代的for循环,所以它应该持有一个行
- 的SQL语句有两个参数:一个表名,像
TABLE_NAME
,和要插入的值的格式化列表,如'Here', 'are', 'values'
。
无论我使用1行输入还是15行输入(是的,我谈论了数千行,但目前处于测试阶段),我都有同样的问题,如果这可能是相关的。
有什么想法在这里出了什么问题?我不认为我滥用了addBatch()
声明,我宁愿认为我传递了不适当的数据。
编辑:
我撤回表名从参数和SQL命令是现在像 “INSERT INTO” +表名+ “VALUES(?)”
这导致了一个不同的错误,但它不能解决问题!
确实,table_name现在是正确的,但[null]行仍然被添加到批处理中。因此,在批次,其中抛出 空值“java.sql.BatchUpdateException:ORA-00947:没有足够的价值观”
我的问题是不是由AlexH标注问题的重复,请撤销该商标。
回答:
此问题与我在同一程序中遇到的另一个问题有关。 讨论和解决方案是here。
作为一个总结,应该知道一个preparedStatement不能使用表名作为参数,也不能将多个值放在参数中。
例如在我的情况,我试图做这样的事情:
String sql = "INSERT INTO (?) VALUES (?)" preparedStatement ps = connection.prepareStatement(sql);
ps.setString(1, "myTableName");
ps.setString(2, "'Value1', 'Value2', 3");
正如你看到的,我想3个参数作为一个传递,没有differenciating字符串和整数(和日期)。
一个PreparedStatement可以处理的唯一格式如下:
String sql = "INSERT INTO " + tableName + " VALUES (?, ?, ?)";
如果你不知道的运行之前的参数个数,你必须建立在运行时查询。上面的链接中给出了一个例子。
以上是 preparedStatement.addBatch()添加空参数 的全部内容, 来源链接: utcz.com/qa/265608.html