joorvishoon Opublikowano 22 Stycznia 2009 Zgłoś Opublikowano 22 Stycznia 2009 Witam wszystkich. Mam mały projekcik w którym muszę przechowywać dane w bazie SQLite. Używam do tego sterownika SQLite JDBC. Zapisuję do bazy 4 kategorie danych - marki aut, modele, zestawy części, i poszczególne części w zestawach (czyli struktura dosyć prosta). Wszystko ładnie działa dopóki nie trzeba zmodyfikować danych jakiejś części, lub jej usunąć. Dla innych danych te operacje są bezproblemowe, a robione niemal identyczną sekwencją poleceń, co w metodach zmieniających dane części lub kasujące ją. Przy wykonywnaiu update albo delete na częściach JDBC wypluwa błąd: java.sql.SQLException: cannot commit transaction - SQL statements in progress przy wykonywaniu ostatecznego zapytania mającego uaktualnić lub skasować rekord. Baza tworzy wtedy plik -journal, który oczywiście przechowuje zmiany do czas zamknięcia programu, potem wszystkie operacje zostają usunięte i baza jest jakbym nic w niej nie zmieniał. Oczywiście podobne operacje działają bezproblemowo dla marek samochodów modeli etc. mimo, że jak mówiłe robi to niemal identyczny kod. Poniżej przykładowa metoda robiąca update: public boolean updateCzesc(String marka,String model,String zestaw,String stara,String nowa, String cena, String kod, String x, String y){ try{ Statement stat = conn.createStatement(); String query = "select id_marka from Marki where nazwa = '"+marka+"';"; ResultSet result = stat.executeQuery(query); result.next(); int id_mark = Integer.parseInt(result.getString("id_marka")); result.close(); stat.close(); stat = conn.createStatement(); query = "select id_model from Modele where id_marka = "+id_mark+" and " + "nazwa = '"+model+"';"; result = stat.executeQuery(query); int id_model = Integer.parseInt(result.getString("id_model")); result.close(); stat.close(); stat = conn.createStatement(); query = "select id_zestaw from Zestawy where id_model = "+id_model+" and " + "nazwa = '"+zestaw+"';"; result = stat.executeQuery(query); result.next(); int id_zestaw = Integer.parseInt(result.getString("id_zestaw")); result.close(); stat.close(); stat = conn.createStatement(); query = "update Czesci set nazwa='"+nowa+"',cena='"+cena+"',kod='"+kod+"',x='"+x+"',y='"+y+"'" + "where id_zestaw="+id_zestaw+" and nazwa='"+stara+"';"; stat.executeUpdate(query); result.close(); stat.close(); return true; } catch (SQLException e) { e.printStackTrace(); return false; } } Połączenie jest ustawione na automatyczne potwierdzanie zmian. JAkby ktoś wiedział ocb, to proszę o szybką odpowiedź bo niedługo muszę oddać projekt. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
joorvishoon Opublikowano 24 Stycznia 2009 Zgłoś Opublikowano 24 Stycznia 2009 naprawdę nikt tu nie używa JDBC, żeby mi powiedzieć nawet "kod wygląda ok, może to sterownik?" :sad: Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Dziobak Opublikowano 25 Stycznia 2009 Zgłoś Opublikowano 25 Stycznia 2009 A ze strukturą bazy wszystko w porządku? Nie ma przypadkiem jakichś źle założonych ograniczeń (klucze obce)? Tak btw. używaj lepiej PreparedStatement :) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
joorvishoon Opublikowano 26 Stycznia 2009 Zgłoś Opublikowano 26 Stycznia 2009 Struktura jest jak najbardziej w porządku, na bardzo podobnych tabelach bezproblemu tego typu funkcje pracują. Jako zależności potworzyłem triggery, więc klucza obcego używającego wewnętrznych mechanizmów SQLite nie ma (których to zresztą mechanizmów też nie ma ;) ). Spróbuję kiedyś z prepared statement's. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...