Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.06.2011, 13:15   #1
RedScreenOfLife
Пользователь
 
Аватар для RedScreenOfLife
 
Регистрация: 12.07.2010
Сообщений: 45
Восклицание Обновление таблицы

Проблема следующая: не могу отправить SQL запрос для обновления таблицы, а точнее: ловит исключение SQLException.

Код:
...
rs.afterLast(); 
                while(j1 != 0)
                {
                   try{rs.previous();} catch(SQLException e){ System.out.println("упс!"); j1--; continue; }

                   System.out.println("jgf");
                  try
                    {
                   s = "UPDATE transcorp.cargo SET CargoID = \'"
                                    +((DefaultTableModel)jTable1.getModel()).getValueAt(j1-1, 0).toString()+"\', "
                                    +"Name = \'" + ((DefaultTableModel)jTable1.getModel()).getValueAt(j1-1, 1).toString()+"\', "
                                    +"CargoType = \'" + ((DefaultTableModel)jTable1.getModel()).getValueAt(j1-1, 2).toString()+"\', "
                                    +"Unit = \'" + ((DefaultTableModel)jTable1.getModel()).getValueAt(j1-1, 3).toString()+"\', "
                                    +"`Weight(kg)` = \'" + ((DefaultTableModel)jTable1.getModel()).getValueAt(j1-1, 4).toString()
                                    +"\' WHERE CargoID = \'"+(j1-1)+"\'";
                      j1--;
                      System.out.println(s);
                      st.executeUpdate(s);
                      System.out.println("execute complete");
                      j1++;
                      //System.out.println(rs.getRow());
                    }
                  catch(SQLException e){ System.out.println("Невозможно обновить некоторые поля"); return; }
                  catch(java.lang.NullPointerException e ){ System.out.println(",kz"); continue; }
                }
             jLabel2.setText("Обновлено");
             rs.close();
             st.close();
...

Выяснил, что на первой итерации цикла все проходит как надо, а вот когда начинается вторая итерация, то ловит исключение в

Код:
try{rs.previous();} catch(SQLException e){ System.out.println("упс!"); j1--; continue; }
И, как оказалось, проблема возникает не только при вызове метода rs.previous(), а еще и при вызове rs.getRow(), например


Подскажите, пожалуйста, что не так
RedScreenOfLife вне форума Ответить с цитированием
Старый 06.06.2011, 13:20   #2
Fox
линуксоид
Форумчанин
 
Аватар для Fox
 
Регистрация: 02.11.2006
Сообщений: 157
По умолчанию

StackTrace и ошибку в студию.
Fox вне форума Ответить с цитированием
Старый 06.06.2011, 13:21   #3
RedScreenOfLife
Пользователь
 
Аватар для RedScreenOfLife
 
Регистрация: 12.07.2010
Сообщений: 45
По умолчанию

Ошибки никакой нет...есть исключение
а StackTrace: java.sql.SQLException: Operation not allowed after ResultSet closed

в коде произошла небольшая опечатка, но проблема осталась та же

Код:
  ...
      +"\' WHERE CargoID = \'"+rs.getString(1)+"\'";

Последний раз редактировалось RedScreenOfLife; 06.06.2011 в 13:37.
RedScreenOfLife вне форума Ответить с цитированием
Старый 06.06.2011, 13:25   #4
Fox
линуксоид
Форумчанин
 
Аватар для Fox
 
Регистрация: 02.11.2006
Сообщений: 157
По умолчанию

В любом случае даже если запрос рабочий без текста ошибки и трейса довольно сложно понять в чем у вас ошибка.
Fox вне форума Ответить с цитированием
Старый 06.06.2011, 13:38   #5
RedScreenOfLife
Пользователь
 
Аватар для RedScreenOfLife
 
Регистрация: 12.07.2010
Сообщений: 45
По умолчанию

StackTrace выложил выше)
RedScreenOfLife вне форума Ответить с цитированием
Старый 06.06.2011, 13:52   #6
Fox
линуксоид
Форумчанин
 
Аватар для Fox
 
Регистрация: 02.11.2006
Сообщений: 157
По умолчанию

Цитата:
Сообщение от RedScreenOfLife Посмотреть сообщение
Ошибки никакой нет...есть исключение
а StackTrace: java.sql.SQLException: Operation not allowed after ResultSet closed

в коде произошла небольшая опечатка, но проблема осталась та же

Код:
  ...
      +"\' WHERE CargoID = \'"+rs.getString(1)+"\'";
В данном сообщение четко сказано что Вы пытаетесь произвести операцию над ResultSet'ом после его закрытия. Соответственно могу предложить или объявление с инициализацией result set'a внести внутрь цикла или проверить как у Вас работает цикл. очень похоже что ваш while обернут каким то другим циклом. и Вы попадаете на блок
Код:
rs.close();
st.close();
а дальше снова пытаетесь что то с ними сделать.
Fox вне форума Ответить с цитированием
Старый 06.06.2011, 14:06   #7
RedScreenOfLife
Пользователь
 
Аватар для RedScreenOfLife
 
Регистрация: 12.07.2010
Сообщений: 45
По умолчанию

Вот вся моя функция. Даже когда я закоментил эти две строчки, все равно выдает это исключение

Код:
private void refresh() throws SQLException{
             int j1=0, j2;
             String s;
             Connect connect = new Connect();
             Statement st = connect.getConnection().createStatement();
             ResultSet rs = st.executeQuery("SELECT * FROM transcorp.cargo");
             int rows = ((DefaultTableModel)jTable1.getModel()).getRowCount();
               while (rs.next())
               j1++;
               j2=j1;
             if(rows>j2)
             {
                 while(j2 != rows)
                 {
                   j2++;
                   try {
                  st.executeUpdate("INSERT INTO transcorp.cargo VALUES (\'"
                                   +((DefaultTableModel)jTable1.getModel()).getValueAt(j2-1, 0).toString()+"\',\'"
                                   +((DefaultTableModel)jTable1.getModel()).getValueAt(j2-1, 1).toString()+"\',\'"
                                   +((DefaultTableModel)jTable1.getModel()).getValueAt(j2-1, 2).toString()+"\',\'"
                                   +((DefaultTableModel)jTable1.getModel()).getValueAt(j2-1, 3).toString()+"\',\'"
                                   +((DefaultTableModel)jTable1.getModel()).getValueAt(j2-1, 4).toString()+"\')");
                       }
                  catch(SQLException e){ jLabel2.setText("Невозможно добавить"); continue;}
                 }
             }
                rs.afterLast();
                
                while(j1 != 0)
                {
                   try{rs.previous();} catch(SQLException e){ e.printStackTrace(); j1--; continue; }
                   System.out.println(rs.getRow());
                  try
                    {
                      s = "UPDATE transcorp.cargo SET CargoID = \'"
                                    +((DefaultTableModel)jTable1.getModel()).getValueAt(j1-1, 0).toString()+"\', "
                                    +"Name = \'" + ((DefaultTableModel)jTable1.getModel()).getValueAt(j1-1, 1).toString()+"\', "
                                    +"CargoType = \'" + ((DefaultTableModel)jTable1.getModel()).getValueAt(j1-1, 2).toString()+"\', "
                                    +"Unit = \'" + ((DefaultTableModel)jTable1.getModel()).getValueAt(j1-1, 3).toString()+"\', "
                                    +"`Weight(kg)` = \'" + ((DefaultTableModel)jTable1.getModel()).getValueAt(j1-1, 4).toString()
                                    +"\' WHERE CargoID = \'"+rs.getString(1)+"\'";
                      j1--;
                      System.out.println(s);
                      st.executeUpdate(s);
                      System.out.println("execute complete");
                      //System.out.println(rs.getRow());
                    }
                  catch(SQLException e){ System.out.println("Невозмhgjhfjожно обновить некоторые поля"+(j1));  e.printStackTrace(); return; }
                  catch(java.lang.NullPointerException e ){ System.out.println(",kz"); continue; }
                }
             jLabel2.setText("Обновлено");
             //rs.close();
             //st.close();
    }
RedScreenOfLife вне форума Ответить с цитированием
Старый 06.06.2011, 14:09   #8
RedScreenOfLife
Пользователь
 
Аватар для RedScreenOfLife
 
Регистрация: 12.07.2010
Сообщений: 45
По умолчанию

О! А executeUpdate случаем не закрывает ResultSet и Statemant автоматически?
RedScreenOfLife вне форума Ответить с цитированием
Старый 07.06.2011, 00:27   #9
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

Тут вы создали постановку и получили с ее помощью результирующий набор:
Код:
Statement st = connect.getConnection().createStatement();
ResultSet rs = st.executeQuery("SELECT * FROM transcorp.cargo");
а тут вы выполняете обновление, с помощью той же самой постановки:
Код:
st.executeUpdate("INSERT INTO transcorp.cargo VALUES (\'"
           +((DefaultTableModel)jTable1.getModel()).getValueAt(j2-1, 0).toString()+"\',\'"
           +((DefaultTableModel)jTable1.getModel()).getValueAt(j2-1, 1).toString()+"\',\'"
           +((DefaultTableModel)jTable1.getModel()).getValueAt(j2-1, 2).toString()+"\',\'"
           +((DefaultTableModel)jTable1.getModel()).getValueAt(j2-1, 3).toString()+"\',\'"
           +((DefaultTableModel)jTable1.getModel()).getValueAt(j2-1, 4).toString()+"\')");
а теперь посмотрим в документацию, а именно в контракт интерфейса java.sql.Statement:
Цитата:
By default, only one ResultSet object per Statement object can be open at the same time. Therefore, if the reading of one ResultSet object is interleaved with the reading of another, each must have been generated by different Statement objects. All execution methods in the Statement interface implicitly close a statment's current ResultSet object if an open one exists.
теперь можно с легкостью предсказать что при следующем обращении к переменной rs, и вероятнее всего вот в этой строке мы получим исключение, сообщающее о закрытом результирующем наборе:
Код:
rs.afterLast();
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.

Последний раз редактировалось alexinspir; 07.06.2011 в 00:32.
alexinspir вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запрос на обновление таблицы в Access serge32 Microsoft Office Access 4 06.04.2011 07:44
Запрос на обновление данных таблицы atenon Microsoft Office Access 8 08.03.2011 13:52
ListBox и обновление таблицы Регинка-малинка БД в Delphi 0 29.09.2010 19:22
Динамическое обновление таблицы Veiron БД в Delphi 4 01.07.2009 18:08
Обновление таблицы. Работа с формами Tavrida Microsoft Office Excel 11 31.03.2009 14:30