【发布时间】:2019-03-30 12:47:22
【问题描述】:
我有一个包含字符串的数组列表:
ArrayList<String> anrs = new ArrayList<>();
现在我将它们转换成这样的 SQL 数组:
final String[] data = anrs.toArray(new String[anrs.size()]);
final java.sql.Array sqlArray = connection.createArrayOf("varchar", data);
现在我想做一个这样的准备好的声明:
statement = connection.createStatement();
String selectSQL = "SELECT * FROM rekopf INNER JOIN repos ON rekopf.rekopfnum=repos.Reposnum WHERE repos.reposart IN ?";
pstatement = connection.prepareStatement(selectSQL);
pstatement.setArray(1, sqlArray);
resultSet = pstatement.executeQuery();
但我得到了这个错误:
net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::4.0.1 意外 令牌:?必填:
此行出现错误:pstatement = connection.prepareStatement(selectSQL);
在这种情况下我的问题是什么?提前致谢。
当我这样尝试时更新:
pstatement.setArray(1, connection.createArrayOf("varchar", data));
然后我得到了这个错误
net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::4.0.1 转换中的数据类型不兼容
【问题讨论】:
-
我已经做了一些谷歌搜索。似乎问题在于?在您准备好的语句中应该代表一个值。大多数建议都在讨论动态创建一个字符串,如 "(?,?,?,...?)" 为尽可能多的 ?随你喜欢,然后设置所有这些。但是,这确实消除了您从使用 PS 中获得的效率提升。尽管您确实从 SQL 注入保护中获益。希望这会有所帮助?
-
嗯,好的,谢谢。我可以用 normale 语句做到这一点吗?
-
别这么认为,你没有 setArray(n,array) 方法。此外,如果您只是手动创建没有 PS 的查询,您将自己设置为 SQL 注入?我会选择动态 (?,?,?,..?) 创建方法。哦是的
-
哦,是的,显然 PS 可以拥有的参数数量是有限制的,具体取决于哪个 DB。例如1000 为甲骨文。
标签: java sql arraylist prepared-statement