【问题标题】:jdbc oracle 11g PreparedStatement not producing resultsjdbc oracle 11g PreparedStatement 未产生结果
【发布时间】:2020-08-04 20:42:48
【问题描述】:

我正在尝试使用 jdbc 根据委员会列上的条件获取数据。使用语句它会产生所需的结果,但使用 PreparedStatement 它不会。我无法弄清楚出了什么问题。请帮助。这是两个程序之一使用 Statement,另一个使用 PreparedStatement 和我的表结构

import java.sql.*;

class SelectPrepared {
    public static void main(String args[]) {

        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");

            Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "abcd","abcd");
            String sql = "select * from tatuserinfo where committee = 'GENERAL'";
            Statement stmt = con.createStatement();
            // stmt.setString(1,"GENERAL");//1 specifies the first parameter in the query

            ResultSet myRs = stmt.executeQuery(sql);
            while (myRs.next()) {
                System.out.println(myRs.getString(1) + myRs.getString(2) + myRs.getString(3) + myRs.getString(4)
                        + myRs.getString(5) + myRs.getString(6) + myRs.getString(7) + myRs.getString(8));
            }
            con.close();

        } catch (Exception e) {
            System.out.println(e);
        }

    }
}

import java.sql.*;

class SelectPreparedOne {
  public static void main(String args[]) {

    try {
      Class.forName("oracle.jdbc.driver.OracleDriver");
      String s = "GENERAL";
      Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "abcd","abcd");
      String sql = "select * from tatuserinfo where committee = ?";
      PreparedStatement stmt = con.prepareStatement(sql);
      stmt.setString(1, s);// 1 specifies the first parameter in the query

      ResultSet myRs = stmt.executeQuery();
      while (myRs.next()) {
        System.out.println(myRs.getString(1) + myRs.getString(2) + myRs.getString(3) + myRs.getString(4)
            + myRs.getString(5) + myRs.getString(6) + myRs.getString(7) + myRs.getString(8));
      }
      con.close();

    } catch (Exception e) {
      System.out.println(e);
    }

  }
}

表结构

用户名 VARCHAR2(40) 密码 VARCHAR2(40) 角色 VARCHAR2(40) 名称 VARCHAR2(40) 名称 VARCHAR2(40) 部门 VARCHAR2(40) 电子邮件 VARCHAR2(40) 委员会 CHAR(15)

【问题讨论】:

  • 最终结果是什么?
  • 在 PreparedStatement 的情况下,我什么也没有得到命令提示符 reappers

标签: java oracle jdbc


【解决方案1】:

TL/DR:不要使用char 使用varchar2

CHAR(15) 被空白填充到 15 个字符,因此该列包含值 'GENERAL ' 并且不等于提供的值 'GENERAL'

正确的解决方法是将列更改为VARCHAR2(15)

一个中间丑陋的解决方法(直到你修复列定义)是使用修剪:

where trim(committee) = ?;

【讨论】:

  • 但在我的情况下无论是 char 还是 varchar 都需要修剪
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 2011-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-30
  • 2011-12-30
相关资源
最近更新 更多