Java 使用PreparedStatement模板发布

Java 使用PreparedStatement模板发布,java,jdbc,prepared-statement,Java,Jdbc,Prepared Statement,下面是我的静态实用程序: //String sqlQuery = "select count(name) as num from tbname where name = ?" //String name = "testString"; private static int correct(Connection connection, String sqlQuery, String name) { int result = 0; Prepared

下面是我的静态实用程序:

 //String sqlQuery = "select count(name) as num from tbname where name = ?"
    //String name = "testString";

    private static int correct(Connection connection, String sqlQuery, String name) {
        int result = 0;
        PreparedStatement statatement = null;
        ResultSet rs = null;
        try {
            statatement = connection.prepareStatement(sqlQuery);
            statatement.setString(1, name);
            rs = statatement.executeQuery();
            while (rs.next()) {
                result = rs.getInt("num");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                rs.close();
                statatement.close();
            } catch (SQLException e) {
                throw new RuntimeException(e.getMessage());
            }
            return result;
        }
    }
上面的方法返回0(不正确的结果),但下面的方法返回“1”(它工作正常,使用相同的sql查询):

你能给我一些建议吗,这样我就可以解决这个问题了

PS:我不确定这是否有关系,但实际的街道名称-在windows-1251编码(俄语)文本中有一个名称。
PPS:数据库是Oracle 10。

似乎编码与您在DB encoding字符集中设置的编码和您传递的字符串冲突

你可以做这两次尝试 1.将DB编码设置为UTF-8,然后再试一次。如果这不起作用,您可以使用以下第二个选项

  • 将DB编码字符集设置为UTF-8,并使用此字符串构造函数设置字符串
    String(byte[]bytes,String charsetName)

  • 我希望这会对您有所帮助。

    似乎编码与您在DB encoding字符集中设置的编码和您传递的字符串冲突

    你可以做这两次尝试 1.将DB编码设置为UTF-8,然后再试一次。如果这不起作用,您可以使用以下第二个选项

  • 将DB编码字符集设置为UTF-8,并使用此字符串构造函数设置字符串
    String(byte[]bytes,String charsetName)

  • 我希望这会对您有所帮助。

    这可能是一个字符集问题。根据报告:

    以下是已知的 问题/限制:

    • 如果数据库字符集为AL32UTF8,则在 下列情况:
      • 访问LONG和VARCHAR2数据类型
      • 使用setString()和setCharacterStream()绑定数据
    因此,如果您的数据库字符集是AL32UTF8,则可能必须将其更改为其他字符集


    另外,您的列的数据类型是什么?VARCHAR2?

    这可能是字符集问题。根据报告:

    以下是已知的 问题/限制:

    • 如果数据库字符集为AL32UTF8,则在 下列情况:
      • 访问LONG和VARCHAR2数据类型
      • 使用setString()和setCharacterStream()绑定数据
    因此,如果您的数据库字符集是AL32UTF8,则可能必须将其更改为其他字符集


    另外,您的列的数据类型是什么?VARCHAR2?

    您已经陈述了一些事实,但还没有告诉我们问题出在哪里……当我通过设置sql模板(statement.setString(1,name)运行sql查询时,它无法正常工作。当我运行与动态相同的sql查询时,它确实工作。使用此查询显示sql编辑器的功能是什么?(尝试sql Developer或类似工具)。是否有任何
    SQLException
    转储到错误输出中?(代码在错误处理和资源管理方面确实存在问题。)当我通过设置sql模板(statement.setString(1,name)运行sql查询时,您已经陈述了一些事实,但还没有告诉我们问题所在它无法正常工作。当我运行与dynamic相同的sql查询时,它确实可以工作。使用此查询显示sql编辑器的功能是什么?(请尝试sql Developer或类似工具)。是否有任何
    SQLException
    转储到错误输出中?(代码在错误处理和资源管理方面确实存在问题。)
    //String sqlQuery = "select count(name) as num from tbname where name = 'testString'"
    
        private static int correct(Connection connection, String sqlQuery, String name) {
            int result = 0;
            PreparedStatement statatement = null;
            ResultSet rs = null;
            try {
                statatement = connection.prepareStatement(sqlQuery);
                rs = statatement.executeQuery();
                while (rs.next()) {
                    result = rs.getInt("num");
                }
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                try {
                    rs.close();
                    statatement.close();
                } catch (SQLException e) {
                    throw new RuntimeException(e.getMessage());
                }
                return result;
            }
        }