gpt4 book ai didi

java - preparedStatement.addBatch() 添加空参数

转载 作者:行者123 更新时间:2023-11-30 06:21:49 27 4
gpt4 key购买 nike

我正在开发一个旧的struts应用程序,我需要通过java批处理将数据保存在数据库中(因为我们可能一次添加数千行)。

因此,我使用这种代码:

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值(value)观。

数据说明:

  • 这是 for 循环的第一次迭代,因此它应该只包含一行
  • SQL 语句有两个参数:表名,如 TABLE_NAME ,以及要插入的格式化值列表,例如 'Here', 'are', 'values' .

无论我使用 1 行输入还是 15 行输入,我都会遇到同样的问题(是的,我谈到了数千行,但到目前为止我正处于测试阶段),如果这可能相关的话。

知道这里出了什么问题吗?我不认为我滥用了 addBatch()声明,我宁愿认为我向它传递了不适当的数据。

编辑:

我从参数中撤回了 table_name,sql 命令现在就像“插入”+表名+“值(?)”

这导致了不同的错误,但它没有解决问题!

事实上,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 个参数作为一个参数传递,而不区分字符串和整数(和日期)。

preparedStatement 可以处理的唯一格式如下:

String sql = "INSERT INTO " + tableName + " VALUES (?, ?, ?)";

如果您在运行前不知道参数的数量,则必须在运行时构建查询。上面的链接中给出了一个示例。

关于java - preparedStatement.addBatch() 添加空参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47993667/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com