Java Resultset.getInt () не возвращается должным образом? - PullRequest
0 голосов
/ 21 февраля 2012

Я создаю программу, которая должна предупреждать пользователя, если какой-то порог прошел для суммы денег.

Я сделал метод, чтобы проверить, предупрежден ли пользователь уже об этом пороге, поэтому мы не повторяем предупреждения, для этого я настроил таблицу 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));

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

1 Ответ

1 голос
/ 21 февраля 2012

Подготовленные 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" не может быть преобразован в число.

...