Java DB2JDBCSQL错误:选择上的SQLCODE=-302,SQLSTATE=22001
我正在使用DB2JDBC执行一个select查询。我使用Prepared语句传递参数的值。数据库中该参数的列长度为12,因此一切正常,直到值的长度为12,然后失败。引发异常,错误消息如标题所示。我做了一些搜索,在下面的链接中找到了一个解释,其中提到的解决方案如下 解决问题 添加额外的客户端验证代码以防止查询,其值大于允许运行的最大长度 我不想这样做。为什么查询不能返回而没有结果呢。你知道我该怎么做吗 编辑Java DB2JDBCSQL错误:选择上的SQLCODE=-302,SQLSTATE=22001,java,sql,jdbc,db2,Java,Sql,Jdbc,Db2,我正在使用DB2JDBC执行一个select查询。我使用Prepared语句传递参数的值。数据库中该参数的列长度为12,因此一切正常,直到值的长度为12,然后失败。引发异常,错误消息如标题所示。我做了一些搜索,在下面的链接中找到了一个解释,其中提到的解决方案如下 解决问题 添加额外的客户端验证代码以防止查询,其值大于允许运行的最大长度 我不想这样做。为什么查询不能返回而没有结果呢。你知道我该怎么做吗 编辑 尽管我不建议这样做:我们也遇到了类似的问题,并且发现——至少在我们的例子中——如果您真的想
尽管我不建议这样做:我们也遇到了类似的问题,并且发现——至少在我们的例子中——如果您真的想要那个空结果,那么可以使用本机SQL查询而不是预处理语句。显然,是预处理语句的参数绑定进入了参数验证。本机查询(您可以使用参数手动构造)似乎避开了此验证,只返回了一个空结果
(为了完整性:如果真的要从给定的参数手动构造SQL查询,请确保知道您在做什么,验证您的参数,并特别注意SQL注入。)这里的正确答案是@Gaius Gracchus在对@Hans答案的评论中提供的另一个建议。您可以尝试/捕获SQLException,收集它的SQL状态(总是比SQL代码好),并处理/抛出自定义异常以指示客户端的无效输入。一个空的结果集(即使这是OP想要的)是不准确的。另一个真正的替代方法是增加列的大小或过程输入/输入输出(不太可能)
您传递的是字符串还是数值?你确定你总是传递一个值吗?是的。我非常确定我正在传入一个值,数据类型是字符串(varchar在db中)。所以varchar(12)在数据库中,当传入一个12个字符的字符串时,它会失败吗?是否确定在将值设为12+时传递的值中没有空格(或非显示字符)?12=12,所以它应该能工作。。但是如果传入了一个无法看到的额外字符。。(空格,输入其他非显示字符)它可能正在通过13,您只能看到12。。。我会输出传入的值的长度,并确保它是12以调试问题。添加代码片段以更好地解释问题。这是一个非常好的答案。它确定了产生问题的查询的确切部分。从逻辑上讲,如果无论select中比较字符串的长度如何,都找不到项,则select查询不应出错。一种选择是尝试/捕获并检查错误结果代码,然后忽略它们或返回空值。
String sql = "select student_id, student_name from student where student_id = ?";
try (Connection connection = DBUtils.GetConnection)
{
try (PreparedStatement statement = connection.prepareStatement(sql))
{
statement.setString(1, student_id);
ResultSet result = statement.executeQuery();
while (result.next())
{
//...
}
}
}
try {
// sql bind or execute
}
catch (SQLException e) {
String sqlState = e.getSQLState();
if (sqlState != null && sqlState.equals("22001")) {
throw new CustomException("Invalid input, etc");
}
throw e;
}