Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java DB2JDBCSQL错误:选择上的SQLCODE=-302,SQLSTATE=22001_Java_Sql_Jdbc_Db2 - Fatal编程技术网

Java DB2JDBCSQL错误:选择上的SQLCODE=-302,SQLSTATE=22001

Java DB2JDBCSQL错误:选择上的SQLCODE=-302,SQLSTATE=22001,java,sql,jdbc,db2,Java,Sql,Jdbc,Db2,我正在使用DB2JDBC执行一个select查询。我使用Prepared语句传递参数的值。数据库中该参数的列长度为12,因此一切正常,直到值的长度为12,然后失败。引发异常,错误消息如标题所示。我做了一些搜索,在下面的链接中找到了一个解释,其中提到的解决方案如下 解决问题 添加额外的客户端验证代码以防止查询,其值大于允许运行的最大长度 我不想这样做。为什么查询不能返回而没有结果呢。你知道我该怎么做吗 编辑 尽管我不建议这样做:我们也遇到了类似的问题,并且发现——至少在我们的例子中——如果您真的想

我正在使用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;
}