DB2 jdbc SQL错误:选择时SQLCODE = -302,SQLSTATE = 22001

时间:2016-11-17 15:09:53

标签: java sql jdbc db2

我正在使用DB2 JDBC执行一个select查询。我正在使用Prepared Statement来传递参数的值。数据库中该参数的列长度为12,因此一切正常,直到值的长度为12,然后失败。使用标题中的错误消息引发异常。我做了一些搜索,并在以下链接http://www-01.ibm.com/support/docview.wss?uid=swg21319477中找到了解释,其中提到的解决方案如下

解决问题 添加其他客户端验证代码以防止查询,其值大于允许的最大长度。

我不想这样做。为什么查询只返回没有结果。知道我该怎么做呢?

修改

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())
        {
            //...
        }
    }
}

3 个答案:

答案 0 :(得分:0)

我将回答你的问题:

  

为什么查询不会返回而没有结果。任何想法如何   我会这样做吗?

包括数据库管理系统在内的计算机程序使用错误和警告来指示出现问题,以错误方式使用或遇到可能存在冲突或“危险”的情况。在您的情况下,您尝试使用不适合的值调用已定义的API。该程序拒绝接受该值,并通过返回错误代码指出错误的调用。

如果它没有返回结果,你怎么知道API调用,它的用法是错误的?现在你知道并且可以解决它。或者使用异常处理忽略它并继续...

答案 1 :(得分:0)

即使我不建议这样做:我们遇到了类似的问题并发现 - 至少在我们的情况下 - 如果你真的想要那个空结果,你可以使用本机SQL查询而不是准备好的声明。显然,它是参与验证的准备语句的参数绑定。本机查询(您可以使用您的参数手动构建)似乎回避了这个验证,并且只返回了一个空结果。

(为了完整性:如果真的从给定的参数手动构建SQL查询,请务必知道您在做什么,验证您的参数,并特别注意SQL注入。)

答案 2 :(得分:0)

正确的答案是@Gaius Gracchus在对@Hans答案的评论中提出的替代建议。您尝试/捕获SQLException,收集其SQL状态(总是比SQL代码好),并处理/引发自定义异常以指示对客户端的无效输入。空结果集(即使OP希望如此)也不准确。唯一真正的替代方法是增加列的大小或过程输入/输入输出(不太可能)。

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;
}