jdb c oracle 11g PreparedStatement не дает результатов - PullRequest
1 голос
/ 04 августа 2020

Я пытаюсь получить данные на основе условия в столбце комитета, используя jdb c. Использование Statement дает желаемый результат, но с использованием 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);
    }

  }
}

Структура таблицы

USERNAME          VARCHAR2(40) 
PASSWORD          VARCHAR2(40) 
ROLE              VARCHAR2(40) 
NAME              VARCHAR2(40) 
DESIGNATION       VARCHAR2(40) 
DEPARTMENT        VARCHAR2(40) 
EMAILID           VARCHAR2(40) 
COMMITTEE         CHAR(15)     

1 Ответ

1 голос
/ 04 августа 2020

TL / DR: не используйте char используйте varchar2

CHAR(15) дополняется пробелом до 15 символов, поэтому столбец содержит значение 'GENERAL ', которое не равно предоставленному значение 'GENERAL'

Правильное исправление - изменить столбец на VARCHAR2(15)

Промежуточный уродливый обходной путь (пока вы не исправите определение столбца) - использовать обрезку:

where trim(committee) = ?;
...