Java 检查PreparedStatement中的所有占位符是否已填充
我有一个用户生成的SQL语句,其中包含占位符(如Java 检查PreparedStatement中的所有占位符是否已填充,java,sql,jdbc,Java,Sql,Jdbc,我有一个用户生成的SQL语句,其中包含占位符(如SELECT*FROM films WHERE stars>?和length>?)和任意数量的输入值。我正在迭代输入以将它们全部插入PreparedStatement,但我不知道编译时PreparedStatement中有多少占位符,也不知道用户提供了多少输入 据我所知,假设的方法是在preparedStatement.execute()上捕获SQLException,它告诉我“没有为占位符指定值…”,但由于许多原因,它对我不起作用: 我不知道在
SELECT*FROM films WHERE stars>?和length>?
)和任意数量的输入值。我正在迭代输入以将它们全部插入PreparedStatement
,但我不知道编译时PreparedStatement
中有多少占位符,也不知道用户提供了多少输入
据我所知,假设的方法是在preparedStatement.execute()
上捕获SQLException
,它告诉我“没有为占位符指定值…”,但由于许多原因,它对我不起作用:
- 我不知道在编译时将使用哪个数据库,
可以是任何东西SQLException
- 未填充的占位符应以一种方式处理(尤其是在这种情况下),而断开连接应以另一种方式处理(这确实是一个错误)
?
也不起作用,因为它将在以下语句中失败:SELECT*FROM films WHERE title='谁陷害了Roger Rabbit?'
那么,有没有办法在执行前检查
PreparedStatement
的完整性?看看java.sql.ParameterMetaData
,它应该包含有关PreparedStatement
的各种信息(包括参数计数)
pcount
将包含参数的数量。请注意,pstmt.getParameterMetaData()
将连接到数据库
因此,在迭代输入和绑定参数时,您可以确保(在运行时)所有参数都已绑定。那么,获取
数量的“明显原因”是什么?
不起作用?捕获该异常也是有效的,由于查询从未发送到dbms,而是在查询编译过程中创建的。为什么用户可以发送比您在后端使用的输入更多的输入?@f1sh将问题更新为更多clear@dambros因为应用程序对这个表一无所知,所以请参见ifParameterMetaData
帮助您:谢谢,还有@约佩根。我查看了pstmt.getMetaData(),但没有意识到getParameterMetaData()是另一种方法。
PreparedStatement pstmt = ...
ParameterMetaData metadata = pstmt.getParameterMetaData();
int pcount = metadata.getParameterCount();