2015-11-17 3 views
-1

Здравствуйте, у меня возникла проблема с моим SQL-запросом с использованием подготовленного заявления. Ошибки я получаю следующее:Использование PreparedStatement для SQL-запроса (DB2) SQLCODE = -206 SQLSTATE = 42703

com.ibm.db2.jcc.am.ro: DB2 SQL Error: SQLCODE=-206, SQLSTATE=42703, SQLERRMC=NAME, DRIVER=3.58.82

Таким образом, очевидно, есть либо проблемы с использованием моей переменной name, которая включает в себя содержание JTsextField, введенного пользователем или содержание не сохраняется в указанной переменной. Ниже приведены следующие важные классы для моего SQL-запроса. Я использую модель MVC и шаблон DAO.

класс My Controller (показывая только важные части): класс

public class Controller implements Observer, ActionListener{ 

Connection dbConnection = null; 
public static PreparedStatement preparedStatement = null; 

@Override 
public void actionPerformed(ActionEvent e) { 
    switch (e.getActionCommand()) { 
    case View.SEARCH: 
     try { 

      String name = View.searchname.getText(); 
      String plz = View.searchplz.getText(); 
      String result = "SELECT BBSTBBNR, BBSTNABEG, BBSTPLZ FROM BP.TBBBST WHERE BBSTNABEG = name AND BBSTPLZ = plz"; 

      dbConnection = ConnectionManager.getConnection(); 
      preparedStatement = dbConnection.prepareStatement(result); 


      model.search(); 
     } catch (SQLException e1) { 
      System.out.println("An SQL-Error occured: "); 
      e1.printStackTrace(); 
     } catch (IOException e1) { 
      System.out.println("An error occured: "); 
      e1.printStackTrace(); 
     } 
     break; 

    default: 
     System.out.println("Search error: " + e.getActionCommand()); 
     break; 
    } 

} 

Мои BtrDao:

public interface BtrDao { 

Collection<BTRBean> getBTR() throws SQLException, IOException; 
} 

Мой DaoImpl класс:

public class BtrDaoImpl extends AbstractDao implements BtrDao { 

public Collection<BTRBean> getBTR() throws SQLException, 
     IOException { 
    final Collection<BTRBean> result = new ArrayList<BTRBean>(); 

    ResultSet resultset = null; 
    try { 
     //This is where the Nullpointerexception happens! 
     resultset = Controller.preparedStatement.executeQuery(); 

     // while loop for finding all results 
     while (resultset.next()) { 
      BTRBean btr = new BTRBean(); 
      int btrid = resultset.getInt(1); 
      String btrplz = resultset.getString(2); 
      String btrname = resultset.getString(3); 
      result.add(btr); 
      System.out.println(btrid + " " + btrplz + " " + btrname); 
     } 

    } catch (SQLException e) { 
     e.printStackTrace(); 
     System.out.println("There was an SQL processing error: (getBTR)"); 
     e.printStackTrace(); 
    } catch (NullPointerException npe) { 
     System.out.println("NullPointerException"); 
     npe.printStackTrace(); 
    } finally { 

     closeConnection(resultset); 

    } 

    return result; 
} 

} 

Мой AbstractDao класс:

public class AbstractDao { 

    public static Connection getConnection() throws SQLException { 
     return ConnectionManager.getInstance().getConnection(); 
    } 

    public ResultSet getResultset(final String statement) throws SQLException { 
     final Statement stmnt = getConnection().createStatement(); 
     return stmnt.executeQuery(statement); 
    } 

    public void closeConnection(final ResultSet resultset) throws SQLException { 
     if(resultset != null) 
     resultset.close(); 
     getConnection().close(); 
    } 
} 

Мои ConnectionManager Класс:

public class ConnectionManager { 

    public Connection getConnection() throws SQLException { 

     try { 
     Properties props = new Properties(); 
     FileInputStream in = new FileInputStream(".//required.\\dbprop.\\DBConn.properties"); 
     props.load(in); 
     in.close(); 
     String drivers = props.getProperty("jdbc.drivers"); 
     if (drivers !=null) 
      System.setProperty("jdbc.drivers", drivers); 

     String url = props.getProperty("jdbc.url"); 
     if (url !=null) 
      System.setProperty("jdbc.url", url); 

     String username = props.getProperty("jdbc.username"); 
     if (username !=null) 
      System.setProperty("jdbc.username", username); 
     String password = props.getProperty("jdbc.password"); 
     if (password !=null) 
      System.setProperty("jdbc.password", password); 

     return DriverManager.getConnection(url, username, password); 
     } catch (IOException e) { 
      throw new SQLException(e.getMessage(), e.getCause()); 
     } 

    } 


    //Close connection 
    public void closeConnection(Connection con) throws SQLException { 
     if (con != null) 
      con.close(); 
    } 

    // Making sure that there's only one instance of the class 
    private static ConnectionManager singleton_Instance; 

    // default constructor 
    private ConnectionManager() { 
    } 

    // returns the single instance of the class 
    public static ConnectionManager getInstance() { 
     if (singleton_Instance == null) { 
      singleton_Instance = new ConnectionManager(); 
     } 
     return singleton_Instance; 
    } 

} 

ответ

0

В запросе необходимо указать параметры, которые вы хотите использовать, и вам необходимо явно установить значения. Сам JDBC API поддерживает только позиционные параметры, так что вы должны изменить свой код:

String name = View.searchname.getText(); 
String plz = View.searchplz.getText(); 

// Use ? for parameters 
String result = "SELECT BBSTBBNR, BBSTNABEG, BBSTPLZ FROM BP.TBBBST " + 
     " WHERE BBSTNABEG = ? AND BBSTPLZ = ?"; 

preparedStatement = dbConnection.prepareStatement(result); 

// Set values for parameters 
preparedStatement.setString(1, name); 
preparedStatement.setString(2, plz); 

Как указано mustaccio в комментариях, драйвер IBM DB2 JDBC поддерживает именованные параметры, см Using named parameter markers with PreparedStatement objects. Ваш пример будет выглядеть так:

String name = View.searchname.getText(); 
String plz = View.searchplz.getText(); 

// Use :<name> for parameters 
String result = "SELECT BBSTBBNR, BBSTNABEG, BBSTPLZ FROM BP.TBBBST " + 
     " WHERE BBSTNABEG = :name AND BBSTPLZ = :plz"; 

DB2PreparedStatement preparedStatement = (DB2PreparedStatement) dbConnection.prepareStatement(result); 

// Set values for parameters 
preparedStatement.setJccStringAtName("name", name); 
preparedStatement.setJccStringAtName("plz", plz); 

Кастинг для DB2PreparedStatement может быть не всегда возможно (например, при использовании пулов соединений третьего лица). Возможно, вам придется использовать unwrap (но это также не всегда возможно).

+0

Спасибо. Теперь он работает. Теперь у меня остались некоторые улучшения. – APL

+0

Драйвер IBM JDBC поддерживает [named parameter markers] (http://www-01.ibm.com/support/knowledgecenter/SSEPGG_10.5.0/com.ibm.db2.luw.apdv.java.doc/src/tpc /imjcc_t0054762.html?lang=en), как упоминает @jens. – mustaccio

+0

@mustaccio Я обновил свой ответ, спасибо. –

2

заполнитель должен начинаться с : так что ваш запрос должен выглядеть следующим образом:

String result = "SELECT BBSTBBNR, BBSTNABEG, BBSTPLZ FROM BP.TBBBST WHERE BBSTNABEG = :name AND BBSTPLZ = :plz"; 

И вы должны установить параметр после получения заявления.

+0

Как установить для этого параметр? – APL

+0

JDBC поддерживает только позиционные заполнители ('?'). –

+0

@APL с использованием функции 'setString': http://www.javaworld.com/article/2077706/core-java/named-parameters-for-preparedstatement.html в сочетании с NamedParameterStatement – Jens

Смежные вопросы