【问题标题】:Using PreparedStatement template issue使用 PreparedStatement 模板问题
【发布时间】:2011-06-28 22:42:10
【问题描述】:

这是我的静态实用程序:

 //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查询):

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

请您给我任何建议,以便我可以解决问题。

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

【问题讨论】:

  • 您已经陈述了一些事实,但还没有告诉我们问题所在......
  • 当我通过设置 sql 模板 (statement.setString(1, name) 运行 sql 查询时,它无法正常工作。当我运行与动态相同的 sql 查询时,它确实有效。
  • 这个查询显示 SQL 编辑器是什么? (尝试 SQL Developer 或类似工具)。
  • 是否有任何SQLException 转储到错误输出中? (代码确实存在错误处理和资源管理问题。)

标签: java jdbc prepared-statement


【解决方案1】:

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

你可以做这 2 次尝试

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

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

【讨论】:

    【解决方案2】:

    可能是字符集问题。根据Oracle JDBC Drivers release 10.1.0.2.0 (10g) README

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

    • 如果数据库字符集是 AL32UTF8,您可能会在 以下情况:
      • 访问 LONG 和 VARCHAR2 数据类型。
      • 用 setString() 和 setCharacterStream() 绑定数据。

    因此,如果您的数据库字符集是 AL32UTF8,您可能必须将其更改为其他字符。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-12
      • 1970-01-01
      相关资源
      最近更新 更多