Witam, korzystam w swoim projekcie z SQLite3, w wielu miejscach pobieram, dodaję, lub edytuję bazę danych. Nie wiedzieć czemu, dziś pojawiły się problemy, (chyba, że przegapiłem to wcześniej), mianowicie poniższy kod:

public ArrayList pobierzWyrazy(HashMap kryteria){
        //pobiera wyrazy z bazy wg zadanych kryterów
        //data dodania, dodający, kategoria
        ResultSet query = null;
        ArrayList wyrazy = new ArrayList();
        Integer user_id = (Integer) kryteria.get("user_id");
        Integer kategoria_id = (Integer) kryteria.get("kategoria_id");
        String date_beg = (String) kryteria.get("date_beg");
        String date_end = (String) kryteria.get("date_end");
        String sqlString;
        if (user_id == -1 && kategoria_id == -1){
            sqlString = String.format("SELECT * FROM wyrazy WHERE wyraz_data BETWEEN '%s' AND '%s'", date_beg, date_end);
        }
        else if ((user_id == -1 && kategoria_id != -1)){
            sqlString = String.format("SELECT * FROM wyrazy WHERE kategoria_id = %s AND wyraz_data BETWEEN '%s' AND '%s'", kategoria_id, date_beg, date_end);
        }
        else if ((user_id != -1 && kategoria_id == -1)){
            sqlString = String.format("SELECT * FROM wyrazy WHERE user_id = %s AND wyraz_data BETWEEN '%s' AND '%s'", user_id, date_beg, date_end);
        }
        else{
            sqlString = String.format("SELECT * FROM wyrazy WHERE user_id = %s AND kategoria_id = %s AND wyraz_data BETWEEN '%s' AND '%s'", user_id, kategoria_id, date_beg, date_end);
        }

        try{
            query = stat.executeQuery(sqlString);
            while (query.next()) {
                int zdanie_id = query.getInt("wyraz_id");
                ResultSet queryZdania = stat2.executeQuery("SELECT zdanie FROM zdania WHERE wyraz_id = " + zdanie_id);
                HashMap wyraz = new HashMap();
                ArrayList zdania = new ArrayList();
                while(queryZdania.next()){
                    zdania.add(queryZdania.getString("zdanie"));
                }
                queryZdania.close();
                wyraz.put("zdania", zdania);
                wyraz.put("wyraz_id", query.getInt("wyraz_id"));
                wyraz.put("wyraz_pl", query.getString("wyraz_pl"));
                wyraz.put("wyraz_en", query.getString("wyraz_en"));
                wyraz.put("transkrypcja", query.getString("transkrypcja"));
                wyraz.put("file_gfx", query.getString("file_gfx"));
                wyraz.put("file_audio", query.getString("file_audio"));
                wyraz.put("wyraz_data", query.getString("wyraz_data"));
                wyraz.put("user_id", query.getInt("user_id"));
                wyraz.put("kategoria_id", query.getInt("kategoria_id"));
                wyrazy.add(wyraz);
            }
        }
        catch(Exception exception){
            JOptionPane.showMessageDialog(null, exception, "Błąd", 0);
        }

        if (query != null){
            try {
                query.close();
            } catch (SQLException ex) {
                JOptionPane.showMessageDialog(null, ex, "Błąd", 0);
            }
        }
        return wyrazy;
    }

a dokładniej chodzi o linię kodu:

ResultSet queryZdania = stat2.executeQuery("SELECT zdanie FROM zdania WHERE wyraz_id = " + zdanie_id);

Błąd jest następujący:

<font size="4">java.sql.SQLException: cannot commit transaction - SQL statements in progress</span>

Co ciekawe, każde następne wywołanie tej metody błędu nie generuje :/

Tuż przed tą metodą wywoływana jest ta: (chodzi o taką, która generuje jakieś zapytanie do bazy)

public Object[] getExtendedKatList() throws SQLException {
        //zwraca listę kategori z kategorią specjalną "dowolna"
        ArrayList kategorie = new ArrayList();
        ResultSet query = null;
        try{
            query = stat.executeQuery("select kategoria_id, kategoria_nazwa from kategorie;");
            kategorie.add(new Kategoria(-1, "Dowolna"));
            while (query.next()) {
                kategorie.add(new Kategoria(query.getInt("kategoria_id"), query.getString("kategoria_nazwa")));
            }
        }
        catch(Exception exception){
            JOptionPane.showMessageDialog(null, exception, "Błąd", 0);
        }

        if (query != null){
            query.close();
        }
        return kategorie.toArray();
    }

O co tu chodzi? Jeśli potrzeba więcej kodu, mogę udostępnić cały via SVN

Ok, obszedłem problem, rozbijając zapytania na dwa oddzielne, uruchamiane jedne po drugim. Teraz już nie ma konfliktu. Referencje odpowiednich obiektów dla drugiego zapytania zapisywałem do ArrayList podczas iteracji w pierwszym zapytaniu.