|
Java форум JavaTalks форум программистов
|
|
|
|
| Предыдущая тема :: Следующая тема |
| Автор |
Сообщение |
andrey_bb : 27 Новичок
|
Мар 09, 2010 3:01 |
|
|
при вызове этого метода :
| Код: |
public void openShift() {
int userid = controller.DatabaseConnector.getCurrentUserId();
String req = new String(
"INSERT INTO shifts (id,subjectid,started) VALUES "
+ "(default," + userid + ",'"
+ new Timestamp(System.currentTimeMillis()) + "');"
+ "select last_value as id from shiftid");
try {
System.out.println(req);
ResultSet rs = (controller.DatabaseConnector.getConnection()
.createStatement().executeQuery(new String(req)));
rs.next();
currentShiftId = rs.getInt("id");
rs.close();
System.out.println("CURRENT SHIFT IS:" + currentShiftId);
} catch (SQLException e) {
e.printStackTrace();
System.exit(0);
}
}
|
получаю:
| Код: |
INSERT INTO shifts (id,subjectid,started) VALUES (default,1,'2010-03-09 01:45:29.468');select last_value as id from shiftid
org.postgresql.util.PSQLException: Запрос не вернул результатов.
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:253)
at model.OperationManager.openShift(OperationManager.java:49)
at view.openShiftPage.openShiftButtonActionPerformed(openShiftPage.java:131)
at view.openShiftPage.access$0(openShiftPage.java:128)
at view.openShiftPage$1.actionPerformed(openShiftPage.java:57)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
|
Самое радужное в этом, что если я скармливаю базе идентичный запрос запрос,который скопипастил из вывода System.out... оно всё делает правильно - добавляет запись и возвращает номер смены О_о
| Код: |
| INSERT INTO shifts (id,subjectid,started) VALUES (default,1,'2010-03-09 01:45:29.468');select last_value as id from shiftid |
p.s. shiftid default вызывает nextval('shiftid') ; |
|
|
|
 |
masyan : 920 Supreme moderator
|
Мар 09, 2010 5:13 |
|
|
я думаю проблема в том что вы выполняете команду INSERT в методе executeQuery. Просто этот запрос не выполняется.
попробуйте разделить эти два запроса.
| Код: |
public void openShift() {
int userid = controller.DatabaseConnector.getCurrentUserId();
String req = new String(
"INSERT INTO shifts (id,subjectid,started) VALUES "
+ "(default," + userid + ",'"
+ new Timestamp(System.currentTimeMillis()));
try {
System.out.println(req);
controller.DatabaseConnector.getConnection() .createStatement().executeUpdate(req));
ResultSet rs = controller.DatabaseConnector.getConnection() .createStatement().executeQuery("select last_value as id from shiftid");
rs.next();
currentShiftId = rs.getInt("id");
rs.close();
System.out.println("CURRENT SHIFT IS:" + currentShiftId);
} catch (SQLException e) {
e.printStackTrace();
System.exit(0);
}
}
|
|
|
|
|
 |
andrey_bb : 27 Новичок
|
Мар 09, 2010 14:07 |
|
|
Запросы разделять не желательно т.к. системой. вероятно будут пользоваться десятки людей (десктопное приложение), есть шанс, что вернется номер другой смены ( пользователя, который на доли секунды раньше создал ещё одну ) =(( т.к. все пользователи будут открывать смену примерно в одно время.
ещё была мысль, что стоит просто написать хранимую процедуру =)
но я, пока, не нашёл адекватного мануала именно по хранимым процедурам ( синтаксис, туториал ).
з.ы. если использовать int executeUpdate - строка добавляется, но возвращается еденица - кто сталкивался - засоветуйте как быть ( или на мануал по хранимым процедурам укажите =)
з.з.ы. хотя пока что оставил два запроса |
|
|
|
 |
Vasia : 236 Новичок Откуда: Минск
|
Мар 09, 2010 16:15 |
|
|
| andrey_bb писал(а): |
| Запросы разделять не желательно т.к. системой. вероятно будут пользоваться десятки людей (десктопное приложение), есть шанс, что вернется номер другой смены ( пользователя, который на доли секунды раньше создал ещё одну ) =(( т.к. все пользователи будут открывать смену примерно в одно время. |
Это вам не поможет - все равно высока вероятность нарваться на "чужую смену".
| andrey_bb писал(а): |
| з.ы. если использовать int executeUpdate - строка добавляется, но возвращается еденица - кто сталкивался - засоветуйте как быть ( или на мануал по хранимым процедурам укажите =) |
Все правильно, метод возвращает количество обновленных (или вставленных) строк. _________________ Реальность это галлюцинация, вызванная отсутствием алкоголя (не мое) |
|
|
|
 |
Vasia : 236 Новичок Откуда: Минск
|
Мар 11, 2010 15:32 |
|
|
Для того, чтобы не нарваться на чужую смену я вижу два способа:
1. Заполнять поле id не default (я так понял инкрементное поле), а с помощью sequence - сперва достаете новый уникальный id, а потом его вставляете - таким образом в методе у вас есть id вставленной записи, по которой вы ее можете найти, не рискуя нарваться на чужую смену.
2. Если интересует последняя запись КОНКРЕТНОГО пользователя - просто разделите запросы (как было сказано выше) а второй запрос сделайте таким
| Код: |
| "select last_value as id from shiftid where subjectid ="+userid; |
А еще посоветовал бы посмотреть что такое PreparedStatement.
ЗЫ я бы предпочел первый вариант. _________________ Реальность это галлюцинация, вызванная отсутствием алкоголя (не мое) |
|
|
|
 |
|
|
Страница 1 из 1
|
Список форумов
-> Работа с базами данных |
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|