SQL-запросы через Java, «Недопустимая операция с пустым набором результатов» - PullRequest
0 голосов
/ 13 мая 2011

Я делаю вызов БД следующим образом:

String sqlAlert = "SELECT * FROM demotable where demo_no ='"
                                +rsDemo.getString("demo_no") + "'";

ResultSet rsAlert = db.GetSQL(sqlAlert);

        if (rsAlert.next()) { 

            String newAlert = rsAlert.getString("cust3")+"1";

            String newAlertSql = "UPDATE demotable SET cust3 = '" + newAlert + "' where demo_no='" + rsDemo.getString("demo_no") + "'";
            System.out.println("Update alert msg: " + newAlertSql);
            db.RunSQL(newAlertSql);
        }  else {
            System.out.println("empty result. Demo_no = "+rsDemo.getString("demo_no"));
               String sqlAlertinsert = "INSERT INTO demotable VALUES('" + rsDemo.getString("demo_no") + "','','','','','<unotes></unotes>')";
              db.RunSQL(sqlAlertinsert);
              System.out.println("insert demo done");

              String sqlAlert2 = "SELECT * FROM demotable where demo_no ='"rsDemo.getString("demo_no") + "'";
              ResultSet rsAlert2 = db.GetSQL(sqlAlert2);

            if (rsAlert2.next()) {

                String newAlert = rsAlert2.getString("cust3")+"1";

                String newAlertSql = "UPDATE demotable SET cust3 = '" + newAlert+ "' where demo_no='" + rsDemo.getString("demo_no") + "'";
                              System.out.println("Update alert msg: " + newAlertSql);
                         db.RunSQL(newAlertSql);
            }
            rsAlert2.close(); 

        }

rsAlert.close();

rs.close();

Я пытаюсь вставить строки в demographiccust, если rsAlert возвращает пустой набор, а затем получает доступ к значениям из него.Но мой код возвращает это исключение «Недопустимая операция с пустым набором результатов« вокруг »if (rsAlert2.next ()) {».Почему он возвращает пустой набор даже после вставки значений в таблицу?Пожалуйста помоги.Спасибо.

Ответы [ 2 ]

2 голосов
/ 13 мая 2011

Это может быть из-за открытого курсора. Вы должны закрыть свой первый Statement, прежде чем пытаться второй. ResultSet - это связная вещь, когда вы закрываете Statement, она тоже закрывается. Я не вижу реализации ваших методов db.RunSQL() и db.GetSQL().

Тем не менее, у меня есть предложение о том, как вы должны это сделать, во-первых. Вот, пожалуйста,

  1. Обновите его, не запрашивая базу данных
  2. Проверьте, сколько строк обновлено. Если нет, то шаг 3, в противном случае завершен
  3. Вставьте запись с правильными значениями в первую очередь. Нет необходимости обновлять его после вставки.

Советы:

  1. Попробуйте использовать PreparedStatement вместо
  2. Попробуйте придерживаться Java Naming Convention
  3. Попробуйте использовать значимые имена, например, ваш метод db.GetSQL() не возвращает SQL, а наоборот запрашивает его, а фактически возвращает ResultSet.
  4. Никогда не возвращайте ResultSet. Это может привести к раздутому коду и множеству открытых курсоров. Не заставляйте пользователя вашего метода закрывать его. Закройте его сами в своем методе, где вы выполняете любой запрос к базе данных, и верните результат в виде компонента или списка компонентов.
1 голос
/ 13 мая 2011

Это всего лишь предположение, но поскольку вы интерполируете rsDemo.getString("demo_no") непосредственно в SQL, вы можете передавать оператор SQL, который вам не нужен. Попробуйте использовать привязку параметра api.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...