2012-02-21 3 views
0

Я делаю программу, которая должна предупредить пользователя, если какой-то порог прошел за количеством денег.Java Resultset.getInt() не возвращается должным образом?

Я разработал метод проверки того, был ли пользователь уже оповещен об этом пороге, поэтому мы не повторяем оповещения, так как я установил таблицу MySQL, заполняющую 1 и 0, исходя из того, было ли предупреждение отправлено уже или нет.

Это таблица:

mysql> describe avisos; 
+----------------+------------+------+-----+---------+-------+ 
| Field   | Type  | Null | Key | Default | Extra | 
+----------------+------------+------+-----+---------+-------+ 
| CLI   | varchar(9) | NO | PRI | NULL |  | 
| mes   | int(2)  | YES |  | NULL |  | 
| AvisadoPrimero | int(11) | NO |  | NULL |  | 
| AvisadoSegundo | int(11) | NO |  | NULL |  | 
| AvisadoTercero | int(11) | NO |  | NULL |  | 
| AvisadoCuarto | int(11) | NO |  | NULL |  | 
+----------------+------------+------+-----+---------+-------+ 
6 rows in set (0.00 sec) 

Однако, когда в моей программе я сделать запрос, чтобы проверить, если сигнал не был уже отправлен, независимо от того, что код будет всегда возвращать 0 (следовательно, о том, что сигнал тревоги не отправлено).

Здесь вы можете увидеть значение поля Я ищу:

mysql> SELECT AvisadoPrimero from avisos where CLI=#########; //(hidden for security reasons) 
+----------------+ 
| AvisadoPrimero | 
+----------------+ 
|    1 | 
+----------------+ 
1 row in set (0.00 sec) 

И вот мой код, который работает в моей программе:

  try { 
     Statement sentencia = conexion.createStatement(); 
     PreparedStatement avisosQuery = conexion.prepareStatement(avisosString); 
     PreparedStatement subtotalesQuery = conexion.prepareStatement(subtotalesString); 
     //ResultSet sobrepasados = sentencia.executeQuery("SELECT cli FROM subtotales where Precio >=" + umbralInferior + " and Precio <" + umbralSuperior + ";"); 
     subtotalesQuery.setInt(1, umbralInferior); 
     subtotalesQuery.setInt(2, umbralSuperior); 
     sobrepasados = subtotalesQuery.executeQuery(); 
     while (sobrepasados.next()) { 
      clis.add(sobrepasados.getString("CLI")); 
     } 
     if (!clis.isEmpty()) { 
      for (int i = 0; i < clis.size(); i++) { 

       switch (umbralInferior) { 
        case UMBRAL1: 
         avisosQuery.setString(1, "AvisadoPrimero"); 
         avisosQuery.setString(2,clis.get(i)); 
         resultado = avisosQuery.executeQuery(); 

         resultado.first(); 

         //System.out.println("Entrando en prueba\n\nConsulta realizada:"); 
         //System.out.println(resultado.getInt("CLI")); 
         System.out.println(resultado.getInt(1)); 

Итак, как вы можете видеть учитывая таблицу с полем, заданным как 1, последняя печать будет всегда печатать 0.

Любые советы? Что я делаю не так?

==============

Наконец, с помощью PreparedStatement и фиксируя имя столбца, выработанная.

(и я считаю, что что-то не так с каким триггером в таблице MySQL, который был инициализация в 0 поле всегда, но это не подтверждено)

Вот окончательный код:

try { 
     Statement sentencia = conexion.createStatement(); 
     PreparedStatement avisosQuery = conexion.prepareStatement(avisosString); 
     PreparedStatement subtotalesQuery = conexion.prepareStatement(subtotalesString); 
     //ResultSet sobrepasados = sentencia.executeQuery("SELECT cli FROM subtotales where Precio >=" + umbralInferior + " and Precio <" + umbralSuperior + ";"); 
     subtotalesQuery.setInt(1, umbralInferior); 
     subtotalesQuery.setInt(2, umbralSuperior); 
     sobrepasados = subtotalesQuery.executeQuery(); 
     while (sobrepasados.next()) { 
      clis.add(sobrepasados.getString("CLI")); 
     } 
     if (!clis.isEmpty()) { 
      for (int i = 0; i < clis.size(); i++) { 

       switch (umbralInferior) { 
        case UMBRAL1: 
         //avisosQuery.setString(1, "AvisadoPrimero"); 
         avisosQuery.setString(1,clis.get(i)); 
         resultado = avisosQuery.executeQuery(); 

         resultado.first(); 

         //System.out.println("Entrando en prueba\n\nConsulta realizada:"); 
         //System.out.println(resultado.getInt("CLI")); 
         System.out.println(resultado.getBoolean(1)); 

Спасибо все!!

+0

Вы пробовали его с помощью rsultado.getInt (1)? – Andreas

+1

Добавьте инструкцию 'System.out.println', чтобы напечатать значение' clis.get (i) ', чтобы убедиться, что вы выбираете то, что, по вашему мнению, выбираете. – Jesper

+0

Да, с той же Удачей, возвращает 0. – Lowb

ответ

1

Операторы, подготовленные MySQL, не позволяют использовать параметрические имена столбцов или таблиц. Код, как он сейчас находится, выбирает строку "AvisadoPrimero", а не значение столбца. То есть, когда вы пишете:

PreparedStatement avisosQuery = conexion.prepareStatement(
     "SELECT ? FROM avisos WHERE CLI=?"); 
avisosQuery.setString(1, "AvisadoPrimero"); 
avisosQuery.setString(2,clis.get(i)); 

база данных получает:

SELECT "AvisadoPrimero" FROM avisos WHERE CLI=something 

Тогда вызова GetInt терпит неудачу, потому что текст "AvisadoPrimero" не может быть преобразован в число.

+0

спасибо за информацию, был определенно точным :) – Lowb

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