Java 检查PreparedStatement中的所有占位符是否已填充

Java 检查PreparedStatement中的所有占位符是否已填充,java,sql,jdbc,Java,Sql,Jdbc,我有一个用户生成的SQL语句,其中包含占位符(如SELECT*FROM films WHERE stars>?和length>?)和任意数量的输入值。我正在迭代输入以将它们全部插入PreparedStatement,但我不知道编译时PreparedStatement中有多少占位符,也不知道用户提供了多少输入 据我所知,假设的方法是在preparedStatement.execute()上捕获SQLException,它告诉我“没有为占位符指定值…”,但由于许多原因,它对我不起作用: 我不知道在

我有一个用户生成的SQL语句,其中包含占位符(如
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因为应用程序对这个表一无所知,所以请参见if
ParameterMetaData
帮助您:谢谢,还有@约佩根。我查看了pstmt.getMetaData(),但没有意识到getParameterMetaData()是另一种方法。
PreparedStatement pstmt = ...
ParameterMetaData metadata = pstmt.getParameterMetaData();
int pcount = metadata.getParameterCount();