Я не уверен, что вы хотите отправить два оператора SELECT в один запрос, потому что вы не сможете получить доступ к ним ResultSet
s. База данных может возвращать только последний набор результатов.
Несколько ResultSets
Однако, если вы вызываете хранимую процедуру, которая, как вы знаете, может возвращать несколько наборов результатов, что-то вроде этого будет работать
CallableStatement stmt = con.prepareCall(...);
try {
...
boolean results = stmt.execute();
while (results) {
ResultSet rs = stmt.getResultSet();
try {
while (rs.next()) {
// read the data
}
} finally {
try { rs.close(); } catch (Throwable ignore) {}
}
// are there anymore result sets?
results = stmt.getMoreResults();
}
} finally {
try { stmt.close(); } catch (Throwable ignore) {}
}
Несколько операторов SQL
Если вы говорите о нескольких операторах SQL и только одном SELECT, ваша база данных должна поддерживать один String
SQL. Например, я использовал что-то вроде этого в Sybase
StringBuffer sql = new StringBuffer( "SET rowcount 100" );
sql.append( " SELECT * FROM tbl_books ..." );
sql.append( " SET rowcount 0" );
stmt = conn.prepareStatement( sql.toString() );
Это будет зависеть от синтаксиса, поддерживаемого вашей базой данных. В этом примере обратите внимание на добавление spaces
, дополняющее высказывания, чтобы между элементами было пустое пространство.
Необходимо звонить setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
в JFrame.
Пример кода:
public static void main(String[] args) {
Runnable guiCreator = new Runnable() {
public void run() {
JFrame fenster = new JFrame("Hallo Welt mit Swing");
fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fenster.setVisible(true);
}
};
SwingUtilities.invokeLater(guiCreator);
}
Существует различие между окном приложения и самим приложением... Выполнения окна в его собственном потоке и окончание main()
не закончат приложение, если другие потоки будут все еще активны. При закрытии окна необходимо также удостовериться, что закрыли приложение, возможно путем вызова System.exit(0);
Yuval =8-)
Необходимо расположить кадр, вызвав расположить метод в слушателе окна или с помощью setDefaultCloseOperation. Для аргумента последнего можно использовать две опции:
DISPOSE_ON_CLOSE
или EXIT_ON_CLOSE
.
DISPOSE_ON_CLOSE
только располагают ресурсы кадра.
EXIT_ON_CLOSE
располагает ресурсы кадра и затем вызывает System.exit
.
нет никакой реальной разницы между двумя, если у Вас нет потоков демона. Я предпочитаю использовать DISPOSE_ON_CLOSE
, потому что этот способ, которым я могу заметить, забыл ли я завершать поток, потому что JVM остановится, если больше нет выполнения потоков. Это - также причина, закрывающая Кадр без расположения, не завершит приложение, так как Swing создает поток для обработки событий, который завершается только, когда располагают, вызывается.